import { game } from '../noname.js'; game.import('character',function(lib,game,ui,get,ai,_status){ return { name:'standard', connect:true, characterSort:{ standard:{ standard_2008:["caocao","simayi","xiahoudun","zhangliao","xuzhu","guojia","zhenji","liubei","guanyu","zhangfei","zhugeliang","zhaoyun","machao","huangyueying","sunquan","ganning","lvmeng","huanggai","zhouyu","daqiao","luxun","sunshangxiang","huatuo","lvbu","diaochan"], standard_2013:['old_re_lidian',"huaxiong","re_yuanshu"], standard_2019:["gongsunzan","xf_yiji"], standard_2023:["std_panfeng",'ganfuren'], }, }, character:{ old_re_lidian:['male','wei',3,['xunxun','wangxi'],['die_audio:lidian']], ganfuren:['female','shu',3,['stdshushen','shenzhi']], std_panfeng:['male','qun',4,['stdkuangfu']], caocao:['male','wei',4,['jianxiong','hujia'],['zhu']], simayi:['male','wei',3,['fankui','guicai']], xiahoudun:['male','wei',4,['ganglie']], zhangliao:['male','wei',4,['tuxi']], xuzhu:['male','wei',4,['luoyi']], guojia:['male','wei',3,['tiandu','yiji']], zhenji:['female','wei',3,['luoshen','qingguo']], liubei:['male','shu',4,['rende','jijiang'],['zhu']], guanyu:['male','shu',4,['wusheng']], zhangfei:['male','shu',4,['paoxiao']], zhugeliang:['male','shu',3,['guanxing','kongcheng']], zhaoyun:['male','shu',4,['longdan']], machao:['male','shu',4,['mashu','tieji']], huangyueying:['female','shu',3,['jizhi','qicai']], sunquan:['male','wu',4,['zhiheng','jiuyuan'],['zhu']], ganning:['male','wu',4,['qixi']], lvmeng:['male','wu',4,['keji']], huanggai:['male','wu',4,['kurou']], zhouyu:['male','wu',3,['yingzi','fanjian']], daqiao:['female','wu',3,['guose','liuli']], luxun:['male','wu',3,['qianxun','lianying']], sunshangxiang:['female','wu',3,['xiaoji','jieyin']], huatuo:['male','qun',3,['qingnang','jijiu']], lvbu:['male','qun',4,['wushuang']], diaochan:['female','qun',3,['lijian','biyue']], huaxiong:['male','qun',6,['yaowu']], gongsunzan:['male','qun',4,['reyicong']], xf_yiji:["male","shu",3,["xinfu_jijie","xinfu_jiyuan"],[]], re_yuanshu:['male','qun',4,['rewangzun','retongji']], }, characterIntro:{ liubei:'先主姓刘,讳备,字玄德,涿郡涿县人,汉景帝子中山靖王胜之后也。以仁德治天下。', guanyu:'字云长,本字长生,并州河东解州人。五虎上将之首,爵至汉寿亭侯,谥曰“壮缪侯”。被奉为“关圣帝君”,崇为“武圣”。', zhangfei:'字翼德,涿郡人,燕颔虎须,豹头环眼。有诗云:“长坂坡头杀气生,横枪立马眼圆睁。一声好似轰雷震,独退曹家百万兵”。', zhugeliang:'字孔明,号卧龙,琅琊阳都人,蜀汉丞相。在世时被封为武乡侯,谥曰忠武侯。著有《出师表》、《诫子书》等。怀不世之才,以空城戏司马,能观星象而通鬼神。', zhaoyun:'字子龙,常山真定人。身长八尺,姿颜雄伟。长坂坡单骑救阿斗,先主云:“子龙一身都是胆也。”', machao:'字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。', huangyueying:'荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。', sunquan:'吴大帝,字仲谋,吴郡富春县人。统领吴与蜀魏三足鼎立,制衡天下。', ganning:'字兴霸,巴郡临江人,祖籍荆州南阳郡。为人勇猛刚强,忠心耿耿,勇往无前。曾带兵百人于二更奇袭曹营,大挫其锐气。', lvmeng:'字子明,汝南富陂人。陈寿评曰:“吕蒙勇而有谋断,识军计,谲郝普,擒关羽,最其妙者。初虽轻果妄杀,终于克己,有国士之量,岂徒武将而已乎!”', huanggai:'字公覆,零陵郡泉陵县人。官至偏将军、武陵太守。以苦肉计骗曹孟德,亲往诈降,火烧战船,重创敌军。', zhouyu:'字公瑾,庐江舒县人,任东吴三军大都督,雄姿英发,人称“美周郎”。赤壁之战前,巧用反间计杀了精通水战的叛将蔡瑁、张允。', daqiao:'庐江皖县人,为乔公长女,孙策之妻,小乔之姊。与小乔并称为“江东二乔”,容貌国色流离。', luxun:'本名陆议,字伯言,吴郡吴县人。历任东吴大都督、丞相。吴大帝孙权兄孙策之婿,世代为江东大族。以谦逊之书麻痹关羽,夺取荆州,又有火烧连营大破蜀军。', sunshangxiang:'孙夫人,乃孙权之妹。刘备定荆州,孙权进妹与其结姻,重固盟好。孙夫人才捷刚猛,有诸兄之风。后人为其立庙,号曰“枭姬庙”。', caocao:'魏武帝曹操,字孟德,小名阿瞒、吉利,沛国谯人。精兵法,善诗歌,乃治世之能臣,乱世之奸雄也。', simayi:'晋宣帝,字仲达,河内温人。曾任职过曹魏的大都督,太尉,太傅。少有奇节,聪明多大略,博学洽闻,伏膺儒教,世之鬼才也。', xiahoudun:'字元让,沛国谯人。有拔矢啖睛之勇,性格勇猛刚烈。', zhangliao:'字文远,魏雁门马邑人。官至前将军、征东将军、晋阳侯。武功高强,又谋略过人,多次建立奇功,以800人突袭孙权十万大军,皆望风披靡。', xuzhu:'字仲康,谯国谯县人。和典韦一同统率着曹操的亲卫队“虎卫军”。因为他十分勇猛,所以有“虎痴”的绰号。曾有裸衣斗马超之举。', guojia:'字奉孝,颍川阳翟人,官至军师祭酒。惜天妒英才,英年早逝。有诗云:“良计环环不遗策,每临制变满座惊”。', zhenji:'中山无极人,别称甄洛或甄宓,庙号文昭甄皇后。魏文帝曹丕的正室。懂诗文,有倾国倾城之貌,《洛神赋》即是曹植为她所作。', huatuo:'字元化,一名旉,沛国谯人,“建安三神医”之一。集平生之所得著《青囊经》,现已失传。', lvbu:'字奉先,五原郡九原县人。三国第一猛将,曾独力战刘关张三人,其武力世之无双。时人语曰:“人中有吕布,马中有赤兔。”', diaochan:'中国古代四大美女之一,有闭月羞花之貌。司徒王允之义女,由王允授意施行连环计,离间董卓、吕布,借布手除卓。后貂蝉成为吕布的妾。', huaxiong:'董卓旗下名将,自荐抵抗山东地区反对董卓的诸侯联军于汜水关前,他先后斩杀济北相鲍信之弟鲍忠和孙坚部将祖茂、以及袁术部将俞涉和韩馥手下潘凤等人,最后关东联军派出关羽与之一对一决斗而被杀。', xf_yiji:"伊籍,字机伯,生卒年不详,兖州山阳郡(今山东金乡县)人,三国时期蜀汉官员。年少时依附于同乡刘表。刘备落难到荆州时,伊籍时常拜访,托请刘备照顾。建安十三年(208年),刘表病死,伊籍便转投刘备,一起渡江南下。建安十六年(211年),刘备入蜀帮助刘璋,伊籍亦有跟随。随后刘备和刘璋双方决裂。建安十九年(214年),刘备平定益州,任命伊籍为左将军从事中郎,其待遇次于简雍、孙乾等。后升任昭文将军,并与诸葛亮、法正、刘巴、李严共同编制《蜀科》。", }, perfectPair:{ xiahoudun:['xiahouyuan'], zhenji:['caopi'], caocao:['xuzhu','dianwei','bianfuren'], huangzhong:['weiyan'], zhugeliang:['jiangwei','jiangfei','huangyueying'], liubei:['guanyu','zhangfei','ganfuren'], zhaoyun:['liushan'], daqiao:['xiaoqiao'], zhouyu:['huanggai','xiaoqiao','zhouyi'], sunquan:['zhoutai'], lvbu:['diaochan','lvlingqi'], machao:['madai','mayunlu','yangwan'], zhangliao:['zangba'], ganning:['lingtong','xf_sufei'], guanyu:['zhangfei','liaohua'], }, skill:{ //标准版甘夫人 stdshushen:{ audio:'shushen', trigger:{player:'recoverEnd'}, direct:true, async content(event,trigger,player){ event.num=trigger.num||1; do { const {result:{bool,targets}}=await player.chooseTarget(get.prompt2('stdshushen'),lib.filter.notMe) .set('ai',target=>get.attitude(_status.event.player,target)); if(!bool) return; const target=targets[0]; player.logSkill('stdshushen',target); target.draw(target.countCards('h')?1:2); }while(--event.num>0&&player.hasSkill('stdshushen')); }, ai:{threaten:0.8,expose:0.1}, }, stdkuangfu:{ audio:'xinkuangfu', trigger:{source:'damageSource'}, forced:true, usable:1, filter(event,player){ return player.isPhaseUsing()&&event.card&&event.card.name=='sha'&&event.player!=player&&event.player.isIn(); }, async content(event,trigger,player){ if(trigger.player.hpplayer.hp; }, logTarget:'player', async content(event,trigger,player){ player.draw(); let zhu=false; const target=trigger.player; switch(get.mode()){ case 'identity':{ zhu=target.isZhu; break; } case 'guozhan':{ zhu=get.is.jun(target); break; } case 'versus':{ zhu=target.identity=='zhu'; break; } case 'doudizhu':{ zhu=target==game.zhu; break; } } if(zhu){ player.draw(); target.addTempSkill('rewangzun2'); target.addMark('rewangzun2',1,false); } }, }, rewangzun2:{ onremove:true, mod:{ maxHandcard(player,num){ return num-player.countMark('rewangzun2'); }, }, intro:{content:'手牌上限-#'}, }, retongji:{ trigger:{global:'useCardToTarget'}, logTarget:'target', audio:'tongji', direct:true, 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 content(event,trigger,player){ const {result:{bool,cards}}=await trigger.target.chooseCard('he','是否对'+get.translation(player)+'发动【同疾】?','弃置一张牌,将'+get.translation(trigger.card)+'转移给'+get.translation(player)) .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(bool){ player.logSkill('retongji',trigger.target); trigger.target.discard(cards); 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'},player,event)) return false; return game.hasPlayer(current=>current!=player&¤t.group=='wei'); }, check(event,player){ if(get.damageEffect(player,event.player,player)>=0) return false; return true; }, async content(event,trigger,player){ while(true){ let bool; if(!event.current) event.current=player.next; if(event.current==player) return; else if(event.current.group=='wei'){ if((event.current==game.me&&!_status.auto)||( get.attitude(event.current,player)>2)|| event.current.isOnline()){ player.storage.hujiaing=true; const next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张闪?',{name:'shan'}); next.set('ai',()=>{ const event=_status.event; return (get.attitude(event.player,event.source)-2); }); next.set('skillwarn','替'+get.translation(player)+'打出一张闪'); next.autochoose=lib.filter.autoRespondShan; next.set('source',player); bool=(await next).result.bool; } } player.storage.hujiaing=false; if(bool){ trigger.result={bool:true,card:{name:'shan',isCard:true}}; trigger.responded=true; trigger.animate=false; if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ event.current.ai.shown+=0.3; if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; } return; } else{ event.current=event.current.next; } } }, ai:{ respondShan:true, skillTagFilter(player){ if(player.storage.hujiaing) return false; if(!player.hasZhuSkill('hujia')) return false; return game.hasPlayer(current=>current!=player&¤t.group=='wei'); }, }, }, jianxiong:{ audio:2, preHidden:true, trigger:{player:'damageEnd'}, filter(event,player){ return get.itemtype(event.cards)=='cards'&&get.position(event.cards[0],true)=='o'; }, async content(event,trigger,player){ player.gain(trigger.cards,'gain2'); }, ai:{ maixie:true, maixie_hp:true, effect:{ target(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; if(get.tag(card,'damage')) return [1,0.55]; } } } }, fankui:{ audio:2, trigger:{player:'damageEnd'}, logTarget:'source', preHidden:true, filter(event,player){ return event.source&&event.source.countGainableCards(player,event.source!=player?'he':'e')>0&&event.num>0; }, async content(event,trigger,player){ player.gainPlayerCard(true,trigger.source,trigger.source!=player?'he':'e'); }, ai:{ maixie_defend:true, effect:{ target(card,player,target){ if(player.countCards('he')>1&&get.tag(card,'damage')){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; if(get.attitude(target,player)<0) return [1,1]; } } } } }, guicai:{ audio:2, trigger:{global:'judge'}, direct:true, preHidden:true, filter(event,player){ return player.countCards(get.mode()=='guozhan'?'hes':'hs')>0; }, async content(event,trigger,player){ const {result:{bool:chooseCardResultBool,cards:chooseCardResultCards}}=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(!chooseCardResultBool) return; player.respond(chooseCardResultCards,'guicai','highlight','noOrdering'); if(trigger.player.judging[0].clone){ trigger.player.judging[0].clone.classList.remove('thrownhighlight'); game.broadcast(function(card){ if(card.clone){ card.clone.classList.remove('thrownhighlight'); } },trigger.player.judging[0]); game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); } game.cardsDiscard(trigger.player.judging[0]); trigger.player.judging[0]=chooseCardResultCards[0]; trigger.orderingCards.addArray(chooseCardResultCards); game.log(trigger.player,'的判定牌改为',chooseCardResultCards[0]); game.asyncDelay(2); }, ai:{ rejudge:true, tag:{ rejudge:1, } } }, ganglie:{ audio:2, trigger:{player:'damageEnd'}, filter(event,player){ return (event.source!=undefined); }, check(event,player){ return (get.attitude(player,event.source)<=0); }, logTarget:'source', async content(event,trigger,player){ const judgeEvent=player.judge(card=>{ if(get.suit(card)=='heart') return -2; return 2; }); judgeEvent.judge2=result=>result.bool; const {result:{judge}}=await judgeEvent; if(judge<2) return; const {result:{bool}}=await trigger.source.chooseToDiscard(2) .set('ai',card=>{ if(card.name=='tao') return -10; if(card.name=='jiu'&&_status.event.player.hp==1) return -10; return get.unuseful(card)+2.5*(5-get.owner(card).hp); }); if(bool==false){ trigger.source.damage(); } }, ai:{ maixie_defend:true, effect:{ target(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; return 0.8; // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; } } } }, ganglie_three:{ audio:'ganglie', trigger:{player:'damageEnd'}, direct:true, async content(event,trigger,player){ const {result:{bool:chooseTargetResultBool,targets:chooseTargetResultTargets}}=await player.chooseTarget(get.prompt2('ganglie_three'),(card,player,target)=>{ return target.isEnemyOf(player); }).set('ai',target=>{ return -get.attitude(_status.event.player,target)/(1+target.countCards('h')); }); if(!chooseTargetResultBool) return; event.target=chooseTargetResultTargets[0]; player.logSkill('ganglie_three',event.target); const judgeEvent=player.judge(card=>{ if(get.suit(card)=='heart') return -2; return 2; }); judgeEvent.judge2=result=>result.bool; const {result:{judge}}=await judgeEvent; if(judge<2) return; const {result:{bool:chooseToDiscardResultBool}}=await player.chooseToDiscard(2).set('ai',card=>{ if(card.name=='tao') return -10; if(card.name=='jiu'&&_status.event.player.hp==1) return -10; return get.unuseful(card)+2.5*(5-get.owner(card).hp); }); if(chooseToDiscardResultBool==false){ event.target.damage(); } }, ai:{ maixie_defend:true, effect:{ target(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; return 0.8; // if(get.tag(card,'damage')&&get.damageEffect(target,player,player)>0) return [1,0,0,-1.5]; } } } }, tuxi:{ audio:2, trigger:{player:'phaseDrawBegin1'}, direct:true, filter(event,player){ return !event.numFixed; }, async content(event,trigger,player){ let num=game.countPlayer(current=>current!=player&¤t.countCards('h')&&get.attitude(player,current)<=0); let check=num>=2; const {result:{bool,targets}}=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); if(!bool) return; player.logSkill('tuxi',targets); player.gainMultiple(targets); trigger.changeToZero(); game.asyncDelay(); }, ai:{ threaten:2, expose:0.3 } }, luoyi:{ audio:2, trigger:{player:'phaseDrawBegin2'}, check(event,player){ if(player.skipList.includes('phaseUse')||player.countCards('h')<3) return false; if(!player.hasSha()) return false; return game.hasPlayer(current=>get.attitude(player,current)<0&&player.canUse('sha',current)); }, preHidden:true, filter(event,player){ return !event.numFixed&&event.num>0; }, async content(event,trigger,player){ player.addTempSkill('luoyi2','phaseJieshuBegin'); trigger.num--; } }, luoyi2:{ trigger:{source:'damageBegin1'}, filter(event){ return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.notLink(); }, forced:true, async content(event,trigger,player){ trigger.num++; }, ai:{ damageBonus:true } }, tiandu:{ audio:2, audioname:['re_guojia','xizhicai','gz_nagisa'], trigger:{player:'judgeEnd'}, preHidden:true, frequent(event){ //if(get.mode()=='guozhan') return false; return event.result.card.name!=='du'; }, check(event){ return event.result.card.name!=='du'; }, filter(event,player){ return get.position(event.result.card,true)=='o'; }, async content(event,trigger,player){ player.gain(trigger.result.card,'gain2'); } }, yiji:{ audio:2, trigger:{player:'damageEnd'}, frequent:true, filter(event){ return event.num>0; }, async content(event,trigger,player){ event.count=trigger.num; // event.goto -> while while(true){ event.count--; const {cards}=await game.cardsGotoOrdering(get.cards(2)); if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); event.given_map={}; if(!cards.length) return; // event.goto -> do while do{ const {result:{bool,links}} = cards.length==1? {result:{links:cards.slice(0),bool: true}}: await player.chooseCardButton('遗计:请选择要分配的牌',true,cards,[1,cards.length]) .set('ai',()=>{ if(ui.selected.buttons.length==0) return 1; return 0; }); if(!bool) return; cards.removeArray(links); event.togive=links.slice(0); const {result:{targets}}=await player.chooseTarget('选择一名角色获得'+get.translation(links),true) .set('ai',target=>{ const att=get.attitude(_status.event.player,target); if(_status.event.enemy){ return -att; } else if(att>0){ return att/(1+target.countCards('h')); } else{ return att/100; } }) .set('enemy',get.value(event.togive[0],player,'raw')<0); if(targets.length){ const id=targets[0].playerid, map=event.given_map; if(!map[id]) map[id]=[]; map[id].addArray(event.togive); } }while(cards.length>0); if(_status.connectMode){ game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); } const list=[]; for(const i in event.given_map){ const source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; player.line(source,'green'); if(player!==source&&(get.mode()!=='identity'||player.identity!=='nei')) player.addExpose(0.2); list.push([source, event.given_map[i]]); } game.loseAsync({ gain_list:list, giver:player, animate:'draw', }).setContent('gaincardMultiple'); if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name, player)){ const {result:{bool:chooseBoolResultBool}}=await player.chooseBool(get.prompt2(event.name)).set('frequentSkill',event.name); if(chooseBoolResultBool) player.logSkill(event.name); else return; } else return; } }, ai:{ maixie:true, maixie_hp:true, effect:{ target(card,player,target){ if(get.tag(card,'damage')){ if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; if(!target.hasFriend()) return; let num=1; if(get.attitude(player,target)>0){ if(player.needsToDiscard()) num=0.7; else num=0.5; } if(target.hp>=4) return [1,num*2]; if(target.hp==3) return [1,num*1.5]; if(target.hp==2) return [1,num*0.5]; } } } } }, luoshen:{ audio:2, trigger:{player:'phaseZhunbeiBegin'}, frequent:true, preHidden:true, async content(event,trigger,player){ while(true){ if(event.cards==undefined) event.cards=[]; const judgeEvent=player.judge(card=>{ if(get.color(card)=='black') return 1.5; return -1.5; }); judgeEvent.judge2=result=>result.bool; if(get.mode()!='guozhan'&&!player.hasSkillTag('rejudge')) judgeEvent.set('callback',async event=>{ if(event.judgeResult.color=='black'&&get.position(event.card,true)=='o') await player.gain(event.card,'gain2'); }); else judgeEvent.set('callback',async event=>{ if(event.judgeResult.color=='black') event.getParent().orderingCards.remove(event.card); }); const {result:{judge,card}}=await judgeEvent; let bool; if(judge>0){ event.cards.push(card); bool=(await player.chooseBool('是否再次发动【洛神】?').set('frequentSkill','luoshen')).result.bool; } else{ for(let i=0;i{ 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;iget.name(card)=='shan'||get.color(card)=='black'); cards.sort((a,b)=>{ return (get.name(b)=='shan'?1:2)-(get.name(a)=='shan'?1:2); }); const geti=()=>{ if(cards.includes(card)) cards.indexOf(card); return cards.length; }; if(get.name(card)=='shan') return Math.min(num,[6,4,3][Math.min(geti(),2)])*0.6; return Math.max(num,[6.5,4,3][Math.min(geti(),2)]); }, aiUseful(){ return lib.skill.qingguo.mod.aiValue.apply(this,arguments); }, }, locked:false, audio:2, audioname:['sb_zhenji'], enable:['chooseToRespond','chooseToUse'], filterCard(card){ return get.color(card)=='black'; }, viewAs:{name:'shan'}, viewAsFilter(player){ if(!player.countCards('hs',{color:'black'})) return false; }, position:'hs', prompt:'将一张黑色手牌当闪使用或打出', check(){return 1}, ai:{ order:3, respondShan:true, skillTagFilter(player){ if(!player.countCards('hs',{color:'black'})) return false; }, effect:{ target(card,player,target,current){ if(get.tag(card,'respondShan')&¤t<0) return 0.6 } } } }, rende:{ audio:2, enable:'phaseUse', filterCard:true, selectCard:[1,Infinity], discard:false, lose:false, delay:0, filterTarget(card,player,target){ return player!=target; }, check(card){ if(ui.selected.cards.length>1) return 0; if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; if(!ui.selected.cards.length&&card.name=='du') return 20; const player=get.owner(card); let num=0; const evt2=_status.event.getParent(); player.getHistory('lose',evt=>{ if(evt.getParent().skill=='rende'&&evt.getParent(3)==evt2) num+=evt.cards.length; }); if(player.hp==player.maxHp||num>1||player.countCards('h')<=1){ if(ui.selected.cards.length){ return -1; } const players=game.filterPlayer(); for(let i=0;i=3&& get.attitude(players[i],player)>=3){ return 11-get.value(card); } } if(player.countCards('h')>player.hp) return 10-get.value(card); if(player.countCards('h')>2) return 6-get.value(card); return -1; } return 10-get.value(card); }, async content(event,trigger,player){ const evt2=event.getParent(3); let num=0; player.getHistory('lose',evt=>{ if(evt.getParent(2).name=='rende'&&evt.getParent(5)==evt2) num+=evt.cards.length; }); player.give(event.cards,event.target); if(num<2&&num+event.cards.length>1) player.recover(); }, ai:{ order(skill,player){ if(player.hp1){ return 10; } return 1; }, result:{ target(player,target){ if(target.hasSkillTag('nogain')) return 0; if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ return target.hasSkillTag('nodu')?0:-10; } if(target.hasJudge('lebu')) return 0; const nh=target.countCards('h'); const np=player.countCards('h'); if(player.hp==player.maxHp||player.storage.rende<0||player.countCards('h')<=1){ if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; } return Math.max(1,5-nh); } }, effect:{ target(card,player,target){ if(player==target&&get.type(card)=='equip'){ if(player.countCards('e',{subtype:get.subtype(card)})){ const players=game.filterPlayer(); for(let i=0;i0){ 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')); }, 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; }, }, }, jijiang1:{ audio:2, audioname:['liushan','re_liubei','re_liushan','ol_liushan'], trigger:{player:['useCardBegin','respondBegin']}, logTarget:'targets', filter(event,player){ return event.skill=='jijiang'; }, forced:true, async content(event,trigger,player){ delete trigger.skill; trigger.getParent().set('jijiang',true); while(true){ if(event.current==undefined) event.current=player.next; if(event.current==player){ player.addTempSkill('jijiang3'); trigger.cancel(); trigger.getParent().goto(0); return; } else if(event.current.group=='shu'){ const chooseToRespondEvent=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张杀?',{name:'sha'}); chooseToRespondEvent.set('ai',()=>{ const event=_status.event; return (get.attitude(event.player,event.source)-2); }); chooseToRespondEvent.set('source',player); chooseToRespondEvent.set('jijiang',true); chooseToRespondEvent.set('skillwarn','替'+get.translation(player)+'打出一张杀'); chooseToRespondEvent.noOrdering=true; chooseToRespondEvent.autochoose=lib.filter.autoRespondSha; const {bool,card,cards}=(await chooseToRespondEvent).result; if(bool){ trigger.card=card; trigger.cards=cards; trigger.throw=false; if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ event.current.ai.shown+=0.3; if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; } return; } else event.current=event.current.next; } else event.current=event.current.next; } } }, jijiang3:{ trigger:{global:['useCardAfter','useSkillAfter','phaseAfter']}, silent:true, charlotte:true, filter(event){ return event.skill!='jijiang'&&event.skill!='qinwang'; }, async content(event,trigger,player){ player.removeSkill('jijiang3'); } }, wusheng:{ audio:2, audioname2:{ old_guanzhang:'old_fuhun', old_guanyu:'wusheng_re_guanyu', }, audioname:['re_guanyu','guanzhang','jsp_guanyu','guansuo','re_guanzhang','dc_jsp_guanyu'], enable:['chooseToRespond','chooseToUse'], filterCard(card,player){ if(get.zhu(player,'shouyue')) return true; return get.color(card)=='red'; }, position:'hes', viewAs:{name:'sha'}, viewAsFilter(player){ if(get.zhu(player,'shouyue')){ if(!player.countCards('hes')) return false; } else{ if(!player.countCards('hes',{color:'red'})) return false; } }, prompt:'将一张红色牌当杀使用或打出', check(card){ const val=get.value(card); if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); return 5-val; }, ai:{ skillTagFilter(player){ if(get.zhu(player,'shouyue')){ if(!player.countCards('hes')) return false; } else{ if(!player.countCards('hes',{color:'red'})) return false; } }, respondSha:true, } }, wusheng_re_guanyu:{audio:2}, zhongyi:{ audio:2, enable:'phaseUse', limited:true, skillAnimation:true, animationColor:'orange', filterCard:true, position:'he', filter(event,player){ return player.countCards('he')>0; }, discard:false, lose:false, async content(event,trigger,player){ player.awakenSkill('zhongyi'); player.addTempSkill('zhongyi2','roundStart'); player.addToExpansion(player,'give',event.cards).gaintag.add('zhongyi2'); }, }, zhongyi2:{ trigger:{global:'damageBegin1'}, forced:true, popup:false, logTarget:'source', filter(event,player){ return event.getParent().name=='sha'&&event.source&&event.source.isFriendOf(player); }, async content(event,trigger,player){trigger.num++}, intro:{content:'expansion',markcount:'expansion'}, onremove(player,skill){ const cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); }, }, paoxiao:{ audio:2, firstDo:true, audioname:['re_zhangfei','guanzhang','xiahouba'], audioname2: { old_guanzhang:'old_fuhun', dc_xiahouba:'paoxiao_xiahouba', }, trigger:{player:'useCard1'}, forced:true, filter(event,player){ return !event.audioed&&event.card.name=='sha'&&player.countUsed('sha',true)>1&&event.getParent().type=='phase'; }, async content(event,trigger,player){ trigger.audioed=true; }, mod:{ cardUsable(card,player,num){ if(card.name=='sha') return Infinity; } }, ai:{ unequip:true, skillTagFilter(player,tag,arg){ if(!get.zhu(player,'shouyue')) return false; if(arg&&arg.name=='sha') return true; return false; } } }, paoxiao_xiahouba:{audio:2}, guanxing_fail:{}, guanxing:{ audio:2, audioname:['jiangwei','re_jiangwei','re_zhugeliang','ol_jiangwei'], trigger:{player:'phaseZhunbeiBegin'}, frequent:true, preHidden:true, async content(event,trigger,player){ const num=player.hasSkill('yizhi')&&player.hasSkill('guanxing')?5:Math.min(5,game.countPlayer()); const cards=get.cards(num); game.cardsGotoOrdering(cards); const next=player.chooseToMove(); next.set('list',[ ['牌堆顶',cards], ['牌堆底'], ]); next.set('prompt','观星:点击将牌移动到牌堆顶或牌堆底'); next.processAI=list=>{ const cards=list[0][1],player=_status.event.player; const top=[]; const judges=player.getCards('j'); let stopped=false; if(!player.hasWuxie()){ for(let i=0;ijudge(b)-judge(a)); if(judge(cards[0])<0){ stopped=true;break; } else{ top.unshift(cards.shift()); } } } let bottom; if(!stopped){ cards.sort((a,b)=>get.value(b,player)-get.value(a,player)); while(cards.length){ if(get.value(cards[0],player)<=5) break; top.unshift(cards.shift()); } } bottom=cards; return [top,bottom]; } const {result:{moved}}=await next; const top=moved[0]; const bottom=moved[1]; top.reverse(); game.cardsGotoPile( top.concat(bottom), ['top_cards',top], (event,card)=>{ if(event.top_cards.includes(card)) return ui.cardPile.firstChild; return null; } ); player.popup(get.cnNumber(top.length)+'上'+get.cnNumber(bottom.length)+'下'); game.log(player,'将'+get.cnNumber(top.length)+'张牌置于牌堆顶'); game.asyncDelayx(); }, ai:{ threaten:1.2 } }, kongcheng:{ mod:{ targetEnabled(card,player,target,now){ if(target.countCards('h')==0){ if(card.name=='sha'||card.name=='juedou') return false; } } }, group:'kongcheng1', audio:'kongcheng1', audioname:['re_zhugeliang'], ai:{ noh:true, skillTagFilter(player,tag){ if(tag=='noh'){ if(player.countCards('h')!=1) return false; } } } }, kongcheng1:{ audio:2, trigger:{player:'loseEnd'}, forced:true, firstDo:true, audioname:['re_zhugeliang'], filter(event,player){ if(player.countCards('h')) return false; for(let i=0;i{ if(get.zhu(_status.event.player,'shouyue')){ if(get.suit(card)!='spade') return 2; } else{ if(get.color(card)=='red') return 2; } return -0.5; }); judgeEvent.judge2=result=>result.bool; const {result:{bool}}=await judgeEvent; if(bool){ trigger.getParent().directHit.add(trigger.target); } }, ai:{ directHit_ai:true, skillTagFilter(player,tag,arg){ if(get.attitude(player,arg.target)>0||arg.card.name!='sha'||!ui.cardPile.firstChild||get.color(ui.cardPile.firstChild,player)!='red') return false; }, }, }, jizhi:{ audio:2, audioname:['jianyong'], trigger:{player:'useCard'}, frequent:true, preHidden:true, filter(event){ return (get.type(event.card)=='trick'&&event.card.isCard); }, async content(event,trigger,player){ player.draw(); }, ai:{ threaten:1.4, noautowuxie:true, } }, xinjizhi:{ audio:'jizhi', trigger:{player:'useCard'}, frequent:true, // alter:true, filter(event){ if(get.type(event.card)=='delay') return false; return (get.type(event.card,'trick')=='trick'&&event.cards[0]&&event.cards[0]==event.card); }, async content(event, trigger, player){ player.draw(); }, ai:{ threaten:1.4, noautowuxie:true, }, }, qicai:{ mod:{ targetInRange(card,player,target,now){ if(['trick','delay'].includes(get.type(card))) return true; } }, }, xinqicai:{ // alter:true, mod:{ targetInRange(card,player,target,now){ if(['trick','delay'].includes(get.type(card))) return true; } }, }, xinzhiheng:{ audio:'zhiheng', mod:{ aiOrder(player,card,num){ if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; let eq=player.getEquip(get.subtype(card)); if(eq&&get.equipValue(card)-get.equipValue(eq)get.value(card)>=8)){ return 8-get.value(card); } return 6-get.value(card) }, delay:0, async content(event,trigger,player){ if(!player.hasSkill('xinzhiheng_delay')) game.asyncDelayx(); player.draw(event.cards.length); }, group:'xinzhiheng_draw', subSkill:{ draw:{ trigger:{player:'loseEnd'}, silent:true, filter(event,player){ if(event.getParent(2).skill!='xinzhiheng') return false; if(!get.is.altered('xinzhiheng')) return false; if(player.countCards('h')) return false; for(let i=0;iget.value(i)>Math.max(6,9-player.hp),'he')) return 1; return 10; }, result:{ player:1 }, nokeep:true, skillTagFilter(player,tag,arg){ if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.xinzhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); }, threaten:1.55 }, }, zhiheng:{ audio:2, audioname:['gz_jun_sunquan'], mod:{ aiOrder(player,card,num){ if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; let eq=player.getEquip(get.subtype(card)); if(eq&&get.equipValue(card)-get.equipValue(eq)0) return false; if(event.player.group!='wu') return false; return true; }, async content(event,trigger,player){ player.recover(); }, global:'xinjiuyuan2', }, xinjiuyuan2:{ audio:'jiuyuan', forceaudio:true, trigger:{player:'taoBegin'}, filter(event,player){ if(!get.is.altered('xinjiuyuan')) return false; if(player.group!='wu') return false; return game.hasPlayer(target=>{ return player!=target&&target.isDamaged()&&target.hpplayer!=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); event.current.recover(); player.draw(); } } } }, qixi:{ audio:2, audioname:['re_ganning','re_heqi'], enable:'chooseToUse', filterCard(card){ return get.color(card)=='black'; }, position:'hes', viewAs:{name:'guohe'}, viewAsFilter(player){ if(!player.countCards('hes',{color:'black'})) return false; }, prompt:'将一张黑色牌当过河拆桥使用', check(card){return 4-get.value(card)} }, keji:{ audio:2, audioname:['re_lvmeng','sp_lvmeng'], trigger:{player:'phaseDiscardBefore'}, frequent(event,player){ return player.needsToDiscard(); }, filter(event,player){ if(player.getHistory('skipped').includes('phaseUse')) return true; const history=player.getHistory('useCard').concat(player.getHistory('respond')); for(let i=0;i=player.hp-1) return -1; if(player.hp<3) return -1; return 1; } } } }, yingzi:{ audio:2, audioname:['sp_lvmeng'], trigger:{player:'phaseDrawBegin2'}, frequent:true, filter(event,player){ return !event.numFixed; }, async content(event,trigger,player){ trigger.num++; }, ai:{ threaten:1.3 } }, fanjian:{ audio:2, enable:'phaseUse', usable:1, filter(event,player){ return player.countCards('h')>0; }, filterTarget(card,player,target){ return player!=target; }, async content(event,trigger,player){ const target=event.target; const control=await target.chooseControl('heart2','diamond2','club2','spade2').set('ai',event=>{ switch(Math.floor(Math.random()*6)){ case 0:return 'heart2'; case 1:case 4:case 5:return 'diamond2'; case 2:return 'club2'; case 3:return 'spade2'; } }) .forResultControl(); game.log(target,'选择了'+get.translation(control)); event.choice=control; target.chat('我选'+get.translation(event.choice)); const {result:{bool,cards}}=await target.gainPlayerCard(player,true,'h'); if(bool&&get.suit(cards[0],player)+'2'!=event.choice) target.damage('nocard'); }, ai:{ order:1, result:{ target(player,target){ const eff=get.damageEffect(target,player); if(eff>=0) return 1+eff; let value=0,i; const cards=player.getCards('h'); for(i=0;i0; }, enable:'chooseToUse', filterCard(card){ return get.suit(card)=='diamond'; }, position:'hes', viewAs:{name:'lebu'}, prompt:'将一张方片牌当乐不思蜀使用', check(card){return 6-get.value(card)}, ai:{ threaten:1.5 } }, liuli:{ audio:2, audioname:['re_daqiao','daxiaoqiao'], trigger:{target:'useCardToTarget'}, direct:true, 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); }); }, async content(event,trigger,player){ const [bool,targets,cards]=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('bool','targets','cards'); if(bool){ const target=targets[0]; player.logSkill(event.name,target); player.discard(cards); const evt=trigger.getParent(); evt.triggeredTargets2.remove(player); evt.targets.remove(player); evt.targets.push(target); } }, ai:{ effect:{ target(card,player,target){ if(target.countCards('he')==0) return; if(card.name!='sha') return; let min=1; const friend=get.attitude(player,target)>0; const vcard={name:'shacopy',nature:card.nature,suit:card.suit}; const players=game.filterPlayer(); for(let i=0;i0){ if(!player.canUse(card,players[0])){ return [0,0.1]; } min=0; } } } return min; } } } }, qianxun:{ mod:{ targetEnabled(card,player,target,now){ if(card.name=='shunshou'||card.name=='lebu') return false; } }, audio:2, }, lianying:{ audio:2, trigger:{ player:'loseAfter', global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, frequent:true, filter(event,player){ if(player.countCards('h')) return false; const evt=event.getl(player); return evt&&evt.player==player&&evt.hs&&evt.hs.length>0; }, async content(event,trigger,player){ player.draw(); }, ai:{ threaten:0.8, effect:{ target(card){ if(card.name=='guohe'||card.name=='liuxinghuoyu') return 0.5; } }, noh:true, skillTagFilter(player,tag){ if(tag=='noh'){ if(player.countCards('h')!=1) return false; } } } }, xiaoji:{ audio:2, audioname:['sp_sunshangxiang','re_sunshangxiang'], trigger:{ player:'loseAfter', global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, frequent:true, filter(event,player){ const evt=event.getl(player); return evt&&evt.player==player&&evt.es&&evt.es.length>0; }, async content(event,trigger,player){ event.count=trigger.getl(player).es.length; while(event.count-->0){ player.draw(2); if(!event.count||!player.hasSkill(event.name)) break; if(!get.is.blocked(event.name,player)){ const chooseBoolEvent=player.chooseBool(get.prompt2('xiaoji')).set('frequentSkill','xiaoji'); chooseBoolEvent.ai=lib.filter.all; const {result:{bool}}=await chooseBoolEvent; if(bool) player.logSkill('xiaoji'); else break; } } }, 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; return true; }, async content(event,trigger,player){ player.recover(); event.target.recover(); }, ai:{ order:5.5, result:{ player(player){ if(player.hpplayer.hp) return 0 return -1; }, target:4 }, threaten:2, } }, xinjieyin:{ group:['xinjieyin_old','xinjieyin_new'], // alter:true, subSkill:{ new:{ audio:'jieyin', enable:'phaseUse', filterCard:true, usable:1, position:'he', filter(event,player){ if(!get.is.altered('xinjieyin')) return false; return player.countCards('he')>0; }, check(card){ const player=_status.event.player; if(get.position(card)=='e'){ const subtype=get.subtype(card); if(!game.hasPlayer(current=>{ return current!=player&¤t.hp!=player.hp&&get.attitude(player,current)>0&&!current.countCards('e',{subtype}); })){ return 0; } // 你还想我兼容{subtype:subtype}?不可能! if(player.countCards('h',{subtype})) return 20-get.value(card); return 10-get.value(card); } else{ if(player.countCards('e')) return 0; if(player.countCards('h',{type:'equip'})) return 0; return 8-get.value(card); } }, filterTarget(card,player,target){ if(!target.hasSex('male')) return false; card=ui.selected.cards[0]; if(!card) return false; if(get.position(card)=='e'&&target.countCards('e',{subtype:get.subtype(card)})) return false; return true; }, discard:false, delay:0, lose:false, async content(event,trigger,player){ const {cards,target}=event; if(get.position(cards[0])=='e'){ player.$give(cards,target); target.equip(cards[0]); } else{ player.discard(cards); } if(player.hp>target.hp){ player.draw(); if(target.isDamaged()) target.recover(); } else if(player.hp{ const es=player.getCards('e'); for(let i=0;itarget.hp){ if(target.isHealthy()){ if(!player.needsToDiscard(1)||goon()) return 0.1; return 0; } return 1; } return 0; } } } }, old:{ audio:'jieyin', enable:'phaseUse', filterCard:true, usable:1, selectCard:2, filter(event,player){ if(get.is.altered('xinjieyin')) return false; return player.countCards('h')>=2; }, check(card){ const player=get.owner(card); if(player.countCards('h')>player.hp) return 8-get.value(card); if(player.hp=target.maxHp) return false; if(target==player) return false; return true; }, async content(event,trigger,player){ player.recover(); event.target.recover(); }, ai:{ order:5.5, result:{ player(player){ if(player.hpplayer.hp) return 0 return -1; }, target:4 } } } }, ai:{ threaten:2.3 } }, qingnang:{ audio:2, enable:'phaseUse', filterCard:true, usable:1, check(card){ return 9-get.value(card); }, filterTarget(card,player,target){ if(target.hp>=target.maxHp) return false; return true; }, async content(event,trigger,player){ event.target.recover(); }, ai:{ order:9, result:{ target(player,target){ if(target.hp==1) return 5; if(player==target&&player.countCards('h')>player.hp) return 5; return 2; } }, threaten:2 } }, jijiu:{ mod:{ aiValue(player,card,num){ if(get.name(card)!='tao'&&get.color(card)!='red') return; const cards=player.getCards('hs',card=>get.name(card)=='tao'||get.color(card)=='red'); cards.sort((a,b)=>(get.name(a)=='tao'?1:2)-(get.name(b)=='tao'?1:2)); var geti=()=>{ if(cards.includes(card)) cards.indexOf(card); return cards.length; }; return Math.max(num,[6.5,4,3,2][Math.min(geti(),2)]); }, aiUseful(){ return lib.skill.kanpo.mod.aiValue.apply(this,arguments); }, }, locked:false, audio:2, audioname:['re_huatuo'], enable:'chooseToUse', viewAsFilter(player){ return player!=_status.currentPhase&&player.countCards('hes',{color:'red'})>0; }, filterCard(card){ return get.color(card)=='red'; }, position:'hes', viewAs:{name:'tao'}, prompt:'将一张红色牌当桃使用', check(card){return 15-get.value(card)}, ai:{ threaten:1.5, } }, wushuang:{ shaRelated:true, audio:2, audioname:['re_lvbu','shen_lvbu','lvlingqi'], forced:true, locked:true, group:['wushuang1','wushuang2'], preHidden:['wushuang1','wushuang2'], }, wushuang1:{ audio:'wushuang', audioname:['re_lvbu','shen_lvbu','lvlingqi'], trigger:{player:'useCardToPlayered'}, forced:true, filter(event,player){ return event.card.name=='sha'&&!event.getParent().directHit.includes(event.target); }, //priority:-1, logTarget:'target', async content(event,trigger,player){ const id=trigger.target.playerid; const map=trigger.getParent().customArgs; if(!map[id]) map[id]={}; if(typeof map[id].shanRequired=='number'){ map[id].shanRequired++; } else{ map[id].shanRequired=2; } }, ai:{ directHit_ai:true, skillTagFilter(player,tag,arg){ if(arg.card.name!='sha'||arg.target.countCards('h','shan')>1) return false; }, }, }, wushuang2:{ audio:'wushuang', audioname:['re_lvbu','shen_lvbu','lvlingqi'], trigger:{player:'useCardToPlayered',target:'useCardToTargeted'}, forced:true, logTarget(trigger,player){ return player==trigger.player?trigger.target:trigger.player }, filter(event,player){ return event.card.name=='juedou'; }, //priority:-1, async content(event,trigger,player){ const id=(player==trigger.player?trigger.target:trigger.player)['playerid']; const idt=trigger.target.playerid; const map=trigger.getParent().customArgs; if(!map[idt]) map[idt]={}; if(!map[idt].shaReq) map[idt].shaReq={}; if(!map[idt].shaReq[id]) map[idt].shaReq[id]=1; map[idt].shaReq[id]++; }, ai:{ directHit_ai:true, skillTagFilter(player,tag,arg){ if(arg.card.name!='juedou'||Math.floor(arg.target.countCards('h','sha')/2)>player.countCards('h','sha')) return false; } } }, zhanshen:{ audio:2, trigger:{player:'phaseZhunbeiBegin'}, forced:true, skillAnimation:true, animationColor:'gray', filter(event,player){ return player.isDamaged()&&game.dead.filter(target=>target.isFriendOf(player)).length>0 }, async content(event,trigger,player){ player.awakenSkill('zhanshen'); const cards=player.getEquips(1); if(cards.length) player.discard(cards); player.loseMaxHp(); player.addSkills(['mashu','shenji']); }, derivation:['mashu','shenji'], }, shenji:{ mod:{ selectTarget(card,player,range){ if(range[1]==-1) return; if(card.name=='sha') range[1]+=2; }, cardUsable(card,player,num){ if(card.name=='sha') return num+1; } }, }, lijian:{ audio:2, audioname:['re_diaochan'], enable:'phaseUse', usable:1, filter(event,player){ return game.countPlayer(current=>current!=player&¤t.hasSex('male'))>1; }, check(card){return 10-get.value(card)}, filterCard:true, position:'he', filterTarget(card,player,target){ if(player==target) return false; if(!target.hasSex('male')) return false; if(ui.selected.targets.length==1){ return target.canUse({name:'juedou'},ui.selected.targets[0]); } return true; }, targetprompt:['先出杀','后出杀'], selectTarget:2, multitarget:true, async content(event,trigger,player){ const useCardEvent=event.targets[1].useCard({name:'juedou',isCard:true},'nowuxie',event.targets[0],'noai'); useCardEvent.animate=false; game.asyncDelay(0.5); }, ai:{ order:8, result:{ target(player,target){ if(ui.selected.targets.length==0){ return -3; } else{ return get.effect(target,{name:'juedou'},ui.selected.targets[0],target); } } }, expose:0.4, threaten:3, } }, biyue:{ audio:2, trigger:{player:'phaseJieshuBegin'}, frequent:true, preHidden:true, async content(event,trigger,player){ player.draw(); }, }, xinbiyue:{ audio:'biyue', trigger:{player:'phaseJieshuBegin'}, frequent:true, // alter:true, async content(event,trigger,player){ player.draw(); }, }, yaowu:{ trigger:{player:'damageBegin3'}, //priority:1, audio:2, filter(event){ if(event.card&&(event.card.name=='sha')){ if(get.color(event.card)=='red') return true; } return false; }, forced:true, check(){return false;}, async content(event,trigger,player){ trigger.source.chooseDrawRecover(true); }, ai:{ effect:{ target(card,player,target,current){ if(card.name=='sha'&&(get.color(card)=='red')){ return [1,-2]; } } } } }, "new_jiangchi":{ audio:2, trigger:{ player:"phaseDrawEnd", }, direct:true, async content(event,trigger,player){ const list=['弃牌','摸牌','取消']; if(!player.countCards('he')) list.remove('弃牌'); const control=await player.chooseControl(list,()=>{ const player=_status.event.player; if(list.includes('弃牌')){ if(player.countCards('h')>3&&player.countCards('h','sha')>1){ return '弃牌'; } if(player.countCards('h','sha')>2){ return '弃牌'; } } if(!player.countCards('h','sha')){ return '摸牌'; } return 'cancel2'; }) .set('prompt',get.prompt2('new_jiangchi')) .forResultControl(); if(control=='弃牌'){ player.chooseToDiscard(true,'he'); player.addTempSkill('jiangchi2','phaseUseEnd'); player.logSkill('new_jiangchi'); } else if(control=='摸牌'){ player.draw(); player.addTempSkill('new_jiangchi3','phaseEnd'); player.logSkill('new_jiangchi'); } }, }, new_jiangchi3:{ mod:{ cardEnabled(card){ if(card.name=='sha') return false; }, cardRespondable(card){ if(card.name=='sha') return false; }, ignoredHandcard(card,player){ if(get.name(card)=='sha') return true; }, cardDiscardable(card,player,name){ if(name=='phaseDiscard'&&get.name(card)=='sha') return false; }, }, }, xinfu_jijie:{ enable:"phaseUse", usable:1, audio:2, async content(event,trigger,player){ const card=get.bottomCards()[0]; game.cardsGotoOrdering(card); event.card=card; const {result:{bool,targets}}=await player.chooseTarget(true).set('ai',target=>{ let att=get.attitude(_status.event.player,target); if(_status.event.du){ if(target.hasSkillTag('nodu')) return 0.5; return -att; } if(att>0){ if(_status.event.player!=target) att+=2; return att+Math.max(0,5-target.countCards('h')); } return att; }).set('du',event.card.name=='du').set('createDialog',[ '机捷:选择一名角色获得此牌', [card] ]); if(bool){ const target=targets[0]; player.line(target,'green'); const gainEvent=target.gain(card,'draw'); gainEvent.giver=player; } }, ai:{ order:7.2, result:{ player:1, }, }, }, xinfu_jiyuan:{ trigger:{ global:['dying','gainAfter','loseAsyncAfter'], }, audio:2, filter(event,player){ if(event.name=='dying') return true; if(event.giver!=player) return false; if(event.name=='gain'){ return event.player!=player&&event.getg(event.player).length>0; } return game.hasPlayer(current=>current!=player&&event.getg(current).length>0); }, direct:true, async content(event,trigger,player){ if(trigger.name!='loseAsync') event.targets=[trigger.player]; else event.targets=game.filterPlayer(current=>current!=player&&trigger.getg(current).length>0); do{ const target=event.targets.shift(); event.target=target; const {result:{bool}}=await player.chooseBool(get.prompt2('xinfu_jiyuan',target)).set('ai',()=>{ const evt=_status.event; return get.attitude(player,evt.getParent().target)>0; }); if(bool){ player.logSkill('xinfu_jiyuan',target); target.draw(); } }while(event.targets.length>0); }, }, }, 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'], liubei:['liubei','re_liubei','sb_liubei','dc_liubei','junk_liubei'], guanyu:['guanyu','re_guanyu','ol_sb_guanyu','sb_guanyu','ps_guanyu','old_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'], gongsunzan:['gongsunzan','re_gongsunzan','dc_gongsunzan','xin_gongsunzan'], re_lidian:['re_lidian','old_re_lidian','junk_lidian'], }, translate:{ caocao:'曹操', hujia:'护驾', hujia_info:'主公技,当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。', jianxiong:'奸雄', jianxiong_info:'当你受到伤害后,你可以获得对你造成伤害的牌。', simayi:'司马懿', fankui:'反馈', fankui_info:'当你受到伤害后,你可以获得伤害来源的一张牌。', guicai:'鬼才', guicai_info:'一名角色的判定牌生效前,你可以打出一张手牌代替之。', guicai_info_guozhan:'一名角色的判定牌生效前,你可以打出一张牌代替之。', xiahoudun:'夏侯惇', zhangliao:'张辽', xuzhu:'许褚', guojia:'郭嘉', zhenji:'甄宓', liubei:'刘备', guanyu:'关羽', zhangfei:'张飞', zhugeliang:'诸葛亮', zhaoyun:'赵云', machao:'马超', huangyueying:'黄月英', sunquan:'孙权', ganning:'甘宁', lvmeng:'吕蒙', huanggai:'黄盖', zhouyu:'周瑜', daqiao:'大乔', luxun:'陆逊', sunshangxiang:'孙尚香', huatuo:'华佗', lvbu:'吕布', diaochan:'貂蝉', huaxiong:'华雄', "xf_yiji":"伊籍", re_yuanshu:'袁术', caozhang:'曹彰', ganglie:'刚烈', tuxi:'突袭', luoyi:'裸衣', luoyi2:'裸衣', tiandu:'天妒', yiji:'遗计', luoshen:'洛神', xinluoshen:'洛神', qingguo:'倾国', rende:'仁德', jijiang:'激将', jijiang1:'激将', jijiang2:'激将', wusheng:'武圣', paoxiao:'咆哮', guanxing:'观星', kongcheng:'空城', kongcheng1:'空城', longdan:'龙胆', longdan1:'龙胆', longdan2:'龙胆', mashu:'马术', mashu2:'马术', feiying:'飞影', tieji:'铁骑', jizhi:'集智', qicai:'奇才', zhiheng:'制衡', jiuyuan:'救援', qixi:'奇袭', keji:'克己', kurou:'苦肉', yingzi:'英姿', fanjian:'反间', guose:'国色', liuli:'流离', qianxun:'谦逊', lianying:'连营', xiaoji:'枭姬', jieyin:'结姻', xinjieyin:'结姻', qingnang:'青囊', jijiu:'急救', wushuang:'无双', wushuang1:'无双', wushuang2:'无双', lijian:'离间', biyue:'闭月', xinbiyue:'闭月', pileTop:'牌堆顶', pileBottom:'牌堆底', ganglie_info:'当你受到伤害后,你可以判定。若结果不为红桃,则伤害来源须弃置两张手牌,否则受到来自你的1点伤害。', tuxi_info:'摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。', luoyi_info:'摸牌阶段,你可以少摸一张牌。若如此做,当你本回合内使用【杀】或【决斗】造成伤害时,此伤害+1。', tiandu_info:'当你的判定牌生效后,你可以获得之。', yiji_info:'当你受到1点伤害后,你可以观看牌堆顶的两张牌,然后将其分配给任意角色。', luoshen_info:'准备阶段,你可以判定。若结果为黑色,你获得判定牌。你可重复此流程,直到出现红色的判定结果。', luoshen_info_guozhan:'准备阶段,你可以判定。若结果为黑色,则可以继续判定,直到出现红色的判定牌。然后你获得所有黑色的判定牌。(判定结果为黑色的牌在此过程中不会进入弃牌堆)', xinluoshen_info:'准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。', xinluoshen_info_alter:'准备阶段,你可以判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过洛神获得的牌,不计入当前回合的手牌上限。', qingguo_info:'你可以将一张黑色手牌当做【闪】使用或打出。', rende_info:'出牌阶段,你可以将任意张手牌交给其他角色。当你以此法于一回合内给出第二张牌时,你回复1点体力。', jijiang_info:'主公技,当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。', wusheng_info:'你可以将一张红色牌当做【杀】使用或打出。', paoxiao_info:'锁定技,出牌阶段,你使用【杀】没有数量限制。', guanxing_info:'准备阶段,你可以观看牌堆顶的X张牌,并将其以任意顺序置于牌堆项或牌堆底。(X为存活角色数且至多为5)', kongcheng_info:'锁定技,当你没有手牌时,你不能成为【杀】或【决斗】的目标。', longdan_info:'你可以将【杀】当做【闪】,或将【闪】当做【杀】使用或打出。', mashu_info:'锁定技,你计算与其他角色的距离时-1。', mashu2_info:'锁定技,你计算与其他角色的距离时-1。', feiying_info:'锁定技,其他角色计算与你的距离时+1。', tieji_info:'当你使用【杀】指定目标后,你可以进行判定。若结果为红色,则此【杀】不可被闪避。', jizhi_info:'当你使用非转化的普通锦囊牌时,你可以摸一张牌。', xinjizhi:'集智', xinjizhi_info:'当你使用非转化的普通锦囊牌时,你可以摸一张牌。', xinjizhi_info_alter:'每当你使用一张非转化的锦囊牌,可以摸一张牌,如果摸到的是基本牌,你可以弃置这张牌,然后本回合手牌上限+1。', xinqicai:'奇才', xinqicai_info:'锁定技,你使用锦囊牌无距离限制。', xinqicai_info_alter:'锁定技,你使用的锦囊牌无距离限制,你装备区内的牌不能被弃置。', qicai_info:'锁定技,你使用锦囊牌无距离限制。', zhiheng_info:'出牌阶段一次,你可以弃置任意张牌,然后摸等量的牌。', xinzhiheng:'制衡', xinzhiheng_info:'出牌阶段限1次,你可以弃置任意张牌并摸等量的牌。', xinzhiheng_info_alter:'出牌阶段限1次,你可以弃置任意张牌并摸等量的牌,如果在发动制衡时弃置了所有手牌,你额外摸一张牌。', jiuyuan_info:'主公技,锁定技,其他吴势力角色对你使用的【桃】的回复值+1。', xinjiuyuan:'救援', xinjiuyuan_info:'主公技,锁定技,濒死阶段,吴势力角色对你使用的[桃]额外回复1点体力。', xinjiuyuan_info_alter:'主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,其可以令你回复1点体力,然后其摸一张牌。', qixi_info:'你可以将一张黑色牌当做【过河拆桥】使用。', keji_info:'弃牌阶段开始时,若你于本回合的出牌阶段内没有过使用或打出过【杀】,则你可以跳过此阶段。', kurou_info:'出牌阶段,你可以失去1点体力,然后摸两张牌。', yingzi_info:'摸牌阶段,你可以多摸一张牌。', fanjian_info:'出牌阶段限一次。你可以令一名角色选择一种花色,然后其获得你的一张手牌。若其以此法选择的花色与其得到的牌花色不同,则你对其造成1点伤害。', guose_info:'你可以将一张方片牌当做【乐不思蜀】使用。', liuli_info:'当你成为【杀】的目标时,你可以弃置一张牌并将此【杀】转移给攻击范围内的一名其他角色(不能是此【杀】的使用者)。', qianxun_info:'锁定技,你不能成为【顺手牵羊】和【乐不思蜀】的目标。', lianying_info:'当你失去最后的手牌时,你可以摸一张牌。', xiaoji_info:'当你失去一张装备区内的牌后,你可以摸两张牌。', jieyin_info:'出牌阶段限一次,你可以弃置两张手牌并选择一名已经受伤的男性角色。你与其各回复1点体力。', xinjieyin_info:'出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。', xinjieyin_old_info:'出牌阶段,你可以弃置两张牌并选择1名已经受伤的男性角色,你与其各回复1点体力,每阶段限一次。', xinjieyin_new_info:'出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。', xinjieyin_info_alter:'出牌阶段限1次,你可以选择一名男性角色,弃置一张手牌或将一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。', qingnang_info:'出牌阶段限一次,你可以弃置一张手牌并令一名角色回复1点体力。', jijiu_info:'你的回合外,你可以将一张红色牌当做【桃】使用。', wushuang_info:'锁定技,当你使用【杀】或【决斗】指定目标后,你令此牌需要依次使用或打出两张【闪】或【杀】响应。', lijian_info:'出牌阶段限一次,你可以弃置一张牌,视为一名男性角色对另一名男性角色使用一张【决斗】(不可被【无懈可击】响应)。', biyue_info:'结束阶段,你可以摸一张牌。', xinbiyue_info:'结束阶段,你可以摸一张牌。', xinbiyue_info_alter:'结束阶段,你可以摸一张牌,如果你没有手牌,改为摸两张牌。', yaowu:'耀武', yaowu_info:'锁定技,一名角色使用红色【杀】对你造成伤害时,该角色回复1点体力或摸一张牌。', "new_jiangchi":"将驰", "new_jiangchi_info":"摸牌阶段结束时,你可以选择一项:1、摸一张牌,若如此做,你本回合内不能使用或打出【杀】且【杀】不计入手牌上限。 2、弃置一张牌,若如此做,出牌阶段你使用【杀】无距离限制且你可以额外使用一张【杀】,直到回合结束。", xinfu_jijie:"机捷", xinfu_jijie_info:"出牌阶段限一次。你可以观看牌堆底的一张牌,然后将其交给一名角色。", xinfu_jiyuan:"急援", xinfu_jiyuan_info:"当有角色进入濒死状态时,或你将牌交给一名其他角色后,你可以令该角色摸一张牌。", ganglie_three:'刚烈', ganglie_three_info:'当你受到伤害后,你可令一名敌方角色判定。若结果不为♥,其弃置两张牌或受到来自你的1点伤害。', zhongyi:'忠义', zhongyi2:'忠义', zhongyi_info:'限定技,出牌阶段,你可以将一张牌置于武将牌上。你的武将牌上有〖忠义〗牌时,己方角色使用【杀】造成的伤害+1。下轮游戏开始时,你将〖忠义〗牌置入弃牌堆。', zhanshen:'战神', zhanshen_info:'觉醒技,准备阶段,若场上有已死亡的其他己方角色且你已受伤,则你弃置装备区的武器牌,减1点体力上限,获得技能〖马术〗和〖神戟〗。', shenji:'神戟', shenji_info:'锁定技,你使用【杀】指定的目标数上限+2,次数上限+1。', rewangzun:'妄尊', rewangzun2:'妄尊', rewangzun_info:'锁定技,一名其他角色的准备阶段开始时,若其体力值大于你,你摸一张牌。然后若其身份为主公/主帅/君主/地主且明置,则你摸一张牌,且其本回合的手牌上限-1。', retongji:'同疾', retongji_info:'攻击范围内包含你的角色成为【杀】的目标时,若你不是此【杀】的使用者或目标,其可弃置一张牌,然后将此【杀】转移给你。', std_panfeng:'潘凤', stdkuangfu:'狂斧', stdkuangfu_info:'锁定技。出牌阶段限一次。当你使用【杀】对其他角色造成伤害后,若其体力值:小于你,你摸两张牌;不小于你,你失去1点体力。', ganfuren:'甘夫人', stdshushen:'淑慎', stdshushen_info:'当你回复1点体力时,你可以令一名其他角色摸一张牌(若其没有手牌则改为摸两张牌)。', old_re_lidian:'李典', standard_2008:"2008版标准包", standard_2013:"2013版标准包", standard_2019:"2019版标准包", standard_2023:"2023版标准包", }, }; });