'use strict'; game.import('mode',function(lib,game,ui,get,ai,_status){ return { name:'guozhan', startBefore:function(){ var playback=localStorage.getItem(lib.configprefix+'playback'); for(var i in lib.characterPack.mode_guozhan){ if(!get.config('onlyguozhan')&&!playback){ if(lib.character[i.slice(3)]) continue; } lib.character[i]=lib.characterPack.mode_guozhan[i]; if(!lib.character[i][4]){ lib.character[i][4]=[]; } if(!lib.translate[i]){ lib.translate[i]=lib.translate[i.slice(3)]; } } for(var i in lib.character){ if(lib.character[i][1]=='shen'){ if(lib.character[i][4]){ var group=lib.character[i][4].find(group=>lib.group.includes(group)||group=='key'||group.startsWith('gzgroup:')); if(group){ if(group.startsWith('gzgroup:')) lib.character[i][1]=group.slice(8); else lib.character[i][1]=group; } else lib.character[i][1]='qun'; } else lib.character[i][1]='qun'; } } }, onreinit:function(){ var pack=lib.characterPack.mode_guozhan; for(var i in pack){ lib.character[i]=pack[i]; if(!lib.character[i][4]){ lib.character[i][4]=[]; } if(!lib.translate[i]){ lib.translate[i]=lib.translate[i.slice(3)]; } } for(var i in lib.character){ if(lib.character[i][1]=='shen'){ if(lib.character[i][4]){ var group=lib.character[i][4].find(group=>lib.group.includes(group)||group=='key'||group.startsWith('gzgroup:')); if(group){ if(group.startsWith('gzgroup:')) lib.character[i][1]=group.slice(8); else lib.character[i][1]=group; } else lib.character[i][1]='qun'; } else lib.character[i][1]='qun'; } } }, start:function(){ "step 0" var playback=localStorage.getItem(lib.configprefix+'playback'); if(playback){ ui.create.me(); ui.arena.style.display='none'; ui.system.style.display='none'; _status.playback=playback; localStorage.removeItem(lib.configprefix+'playback'); var store=lib.db.transaction(['video'],'readwrite').objectStore('video'); store.get(parseInt(playback)).onsuccess=function(e){ if(e.target.result){ game.playVideoContent(e.target.result.video); } else{ alert('播放失败:找不到录像'); game.reload(); } } event.finish(); } else if(_status.connectMode){ game.waitForPlayer(); } else{ _status.mode=get.config('guozhan_mode'); if(!['normal','yingbian','old','free'].includes(_status.mode)) _status.mode='normal'; //决定牌堆 switch(_status.mode){ case 'old':lib.card.list=lib.guozhanPile_old.slice(0);break; case 'yingbian': lib.card.list=lib.guozhanPile_yingbian.slice(0); delete lib.translate.shuiyanqijunx_info_guozhan; const pack=lib.yingbian_guozhan; for(const i in pack){ if(!pack[i][4]) pack[i][4]=[]; lib.character[i]=pack[i]; lib.characterPack.mode_guozhan[i]=pack[i]; if(!lib.translate[i]) lib.translate[i]=lib.translate[i.slice(3)]; } break; case 'normal':lib.card.list=lib.guozhanPile.slice(0);break; } if(_status.mode!='free') game.fixedPile=true; else{ delete lib.translate.shuiyanqijunx_info_guozhan; } game.prepareArena(); // game.delay(); game.showChangeLog(); } if(!_status.connectMode){ _status.mode=get.config('guozhan_mode'); if(_status.brawl&&_status.brawl.submode){ _status.mode=_status.brawl.submode; } if(get.config('separatism')) _status.separatism=true; } "step 1" if(_status.connectMode){ _status.mode=lib.configOL.guozhan_mode; if(!['normal','yingbian','old'].includes(_status.mode)) _status.mode='normal'; if(lib.configOL.separatism) _status.separatism=true; //决定牌堆 switch(_status.mode){ case 'old':lib.card.list=lib.guozhanPile_old.slice(0);break; case 'yingbian': lib.card.list=lib.guozhanPile_yingbian.slice(0); delete lib.translate.shuiyanqijunx_info_guozhan; break; default:lib.card.list=lib.guozhanPile.slice(0);break; } game.fixedPile=true; game.broadcastAll((mode,separatism)=>{ _status.mode=mode; if(separatism) _status.separatism=true; var pack=lib.characterPack.mode_guozhan; if(mode=='yingbian'){ delete lib.translate.shuiyanqijunx_info_guozhan; const pack2=lib.yingbian_guozhan; for(const i in pack2){ if(!pack2[i][4]) pack2[i][4]=[]; pack[i]=pack2[i]; } } for(var i=0;ilib.group.includes(group)||group=='key'||group.startsWith('gzgroup:')); if(group){ if(group.startsWith('gzgroup:')) lib.character[i][1]=group.slice(8); else lib.character[i][1]=group; } else lib.character[i][1]='qun'; } else lib.character[i][1]='qun'; } } //lib.characterReplace={}; },_status.mode,_status.separatism); game.randomMapOL(); } else{ //lib.characterReplace={}; for(var i=0;i{ if(_status.connectMode) return true; return get.type(card)=='basic'&&lib.filter.cardDiscardable(card,player); }); }, async cost(event,trigger,player){ event.result=await player.chooseToDiscard(get.prompt2('fakexiaoguo',trigger.player),(card,player)=>{ return get.type(card)=='basic'; },[1,Infinity]).set('complexSelect',true).set('ai',card=>{ const player=get.event('player'),target=get.event().getTrigger().player; const effect=get.damageEffect(target,player,player); const cards=target.getCards('e',card=>get.attitude(player,target)*get.value(card,target)<0); if(effect<=0&&!cards.length) return 0; if(ui.selected.cards.length>cards.length-(effect<=0?1:0)) return 0; return 1/(get.value(card)||0.5); }).set('logSkill',['fakexiaoguo',trigger.player]).setHiddenSkill('fakexiaoguo').forResult(); }, popup:false, preHidden:true, async content(event,trigger,player){ const num=trigger.player.countCards('e'),num2=event.cards.length; await player.discardPlayerCard(trigger.player,'e',num2,true); if(num2>num) await trigger.player.damage(); }, }, fakeduanbing:{ audio:'duanbing', inherit:'reduanbing', preHidden:['fakeduanbing_sha'], group:['fakeduanbing_sha'], get content(){ let content=get.info('reduanbing').content; content=content.toString().replaceAll('reduanbing','fakeduanbing'); content=new Function('return '+content)(); delete this.content; this.content=content; return content; }, subSkill:{ sha:{ audio:'duanbing', trigger:{player:'useCardToPlayered'}, filter(event,player){ return event.card.name=='sha'&&!event.getParent().directHit.includes(event.target)&&event.targets.length==1; }, forced:true, logTarget:'target', content(){ var id=trigger.target.playerid; var map=trigger.getParent().customArgs; if(!map[id]) map[id]={}; if(typeof map[id].shanRequired=='number') map[id].shanRequired++; else map[id].shanRequired=2; }, ai:{ directHit_ai:true, skillTagFilter(player,tag,arg){ if(!arg||!arg.card||!arg.target||arg.card.name!='sha'||arg.target.countCards('h','shan')>1||get.distance(player,arg.target)>1) return false; }, }, }, }, }, fakeduoshi:{ audio:'duoshi', global:'fakeduoshi_global', subSkill:{ global:{ audio:'duoshi', forceaudio:true, enable:'chooseToUse', filter(event,player){ const info=get.info('fakeduoshi').subSkill.global; return game.hasPlayer(target=>{ return info.filterTarget(null,player,target); })&&player.countCards('hs',card=>{ return info.filterCard(card,player); }); }, filterTarget(card,player,target){ return target.hasSkill('fakeduoshi')&&!target.isTempBanned('fakeduoshi')&&target.isFriendOf(player); }, filterCard(card,player){ if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) return false; return get.color(card)=='red'&&player.hasUseTarget(get.autoViewAs({name:'yiyi'},[card])); }, discard:false, lose:false, delay:false, line:false, prompt:'选择一张红色手牌当作【以逸待劳】使用,并选择一名拥有【度势】的角色', async content(event,trigger,player){ const target=event.target; target.tempBanSkill('fakeduoshi','roundStart',false); let {result}=await player.chooseUseTarget(true,{name:'yiyi'},event.cards); if(result.bool&&result.targets.length&&target.isNotMajor()){ const num=result.targets.length,str='将'+get.cnNumber(num)+'张手牌当作不可被响应的【火烧连营】使用?'; const {result:{bool,targets}}=await player.chooseTarget('是否令一名友方角色'+str,(card,player,target)=>{ return target.isFriendOf(player)&&target.countCards('h',card=>{ if(!target.hasUseTarget(get.autoViewAs({name:'huoshaolianying'},[card]))) return false; return target!=player||game.checkMod(card,player,'unchanged','cardEnabled2',player); })>=get.event('num'); }).set('num',num).set('ai',target=>{ return target.getUseValue(new lib.element.VCard({name:'huoshaolianying'})); }); if(bool){ player.line(targets[0]); game.broadcastAll(num=>{ lib.skill.fakeduoshi_backup.selectCard=num; lib.skill.fakeduoshi.subSkill.backup.selectCard=num; },num); await targets[0].chooseToUse() .set('openskilldialog','度势:是否'+str) .set('norestore',true) .set('_backupevent','fakeduoshi_backup') .set('custom',{ add:{}, replace:{window:function(){}} }) .set('addCount',false) .set('oncard',()=>_status.event.directHit.addArray(game.players)) .backup('fakeduoshi_backup'); } } }, ai:{ order(item,player){ const card=new lib.element.VCard({name:'huoshaolianying'}); return get.order(card,player)+0.1; }, result:{target:1}, }, }, backup:{ filterCard:true, position:'hs', check(card){ return 7-get.value(card); }, log:false, viewAs:{name:'huoshaolianying'}, precontent(){ delete event.result.skill; }, }, }, }, fakehanzhan:{ audio:'hanzhan', trigger:{ player:['chooseToCompareAfter','compareMultipleAfter'], target:['chooseToCompareAfter','compareMultipleAfter'], }, filter(event,player){ if(event.preserve) return false; const list=[event.player,event.target]; const targets=list.slice().filter(i=>(event.num1-event.num2)*get.sgn(0.5-list.indexOf(i))<=0); return targets.some(i=>i.countGainableCards(list[1-list.indexOf(i)],'e')); }, async cost(event,trigger,player){ let users=[]; const list=[event.player,event.target]; let targets=list.slice().filter(i=>(event.num1-event.num2)*get.sgn(0.5-list.indexOf(i))<=0); targets=targets.filter(i=>i.countGainableCards(list[1-list.indexOf(i)],'e')).sortBySeat(player); for(const i of targets){ const aim=list[1-list.indexOf(i)]; const {result:{bool}}=await i.chooseBool(get.prompt('fakehanzhan'),'获得'+get.translation(aim)+'装备区的一张牌').set('choice',target.hasCard(card=>{ return get.value(card,aim)*get.attitude(i,aim)<0; },'e')); if(bool) users.push(i); } event.result={bool:Boolean(users.length),targets:users}; }, async content(event,trigger,player){ const list=[trigger.player,trigger.target]; let targets=list.slice().filter(i=>(trigger.num1-trigger.num2)*get.sgn(0.5-list.indexOf(i))<=0); targets=targets.filter(i=>i.countGainableCards(list[1-list.indexOf(i)],'e')&&event.targets.includes(i)).sortBySeat(player); for(const i of targets){ const aim=list[1-list.indexOf(i)]; await i.gainPlayerCard(aim,'e',true); } }, }, fakeshuangxiong:{ audio:'shuangxiong', subfrequent:['tiandu'], group:['fakeshuangxiong_effect','fakeshuangxiong_tiandu'], subSkill:{ effect:{ audio:'shuangxiong1', inherit:'shuangxiong1', content(){ player.judge().set('callback',get.info('fakeshuangxiong').subSkill.effect.callback); trigger.changeToZero(); }, callback(){ player.addTempSkill('shuangxiong2'); player.markAuto('shuangxiong2',[event.judgeResult.color]); }, }, tiandu:{ audio:'shuangxiong', inherit:'tiandu', filter(event,player){ return _status.currentPhase==player&&get.info('tiandu').filter(event,player); }, }, }, }, fakeyicheng:{ audio:'yicheng', inherit:'yicheng', async content(event,trigger,player){ const target=trigger.target; await target.draw(); await target.chooseToUse(function(card){ if(get.type(card)!='equip') return false; return lib.filter.cardEnabled(card,_status.event.player,_status.event); },'疑城:是否使用装备牌?'); if(!target.storage.fakeyicheng){ target.when({global:'phaseEnd'}).then(()=>{ player.chooseToDiscard('he',player.countMark('fakeyicheng'),true); delete player.storage.fakeyicheng; }); } target.addMark('fakeyicheng',1,false); }, }, fakefenming:{ audio:'fenming', enable:'phaseUse', filter(event,player){ return player.isLinked(); }, filterTarget(card,player,target){ return target.isLinked(); }, selectTarget:-1, usable:1, multiline:true, multitarget:true, async content(event,trigger,player){ for(const target of event.targets){ if(player==target) await player.chooseToDiscard(true,'he'); else await player.discardPlayerCard(true,'he',target); } }, ai:{ order(item,player){ return get.order({name:'sha'},player)+0.1; }, result:{ target(player,target){ return get.sgn(get.attitude(player,target))*get.effect(target,{name:'guohe_copy2'},player,player); }, }, }, }, fakebaoling:{ audio:'baoling', inherit:'baoling', init(player){ player.checkMainSkill('fakebaoling'); }, content(){ 'step 0' player.removeCharacter(1); 'step 1' player.gainMaxHp(3); player.recover(3); 'step 2' player.addSkills('fakebenghuai'); }, derivation:'fakebenghuai', }, fakebenghuai:{ audio:'benghuai', inherit:'benghuai', async content(event,trigger,player){ const {result:{control}}=await player.chooseControl('体力','上限','背水!').set('prompt','崩坏:请选择一项').set('choiceList',[ '失去1点体力','减1点体力上限','背水!依次执行前两项,然后执行一个额外的摸牌阶段', ]).set('ai',()=>{ const player=get.event('player'); if(player.maxHp>1&&(player.getHp()==2||!player.countCards('h'))) return '背水!'; return player.isDamaged()?'上限':'体力'; }); player.popup(control); game.log(player,'选择了','#g'+control); if(control!='上限') await player.loseHp(); if(control!='体力') await player.loseMaxHp(); if(control=='背水!'){ const next=player.phaseDraw(); event.next.remove(next); trigger.getParent().next.push(next); } }, }, fakediaodu:{ audio:'diaodu', inherit:'xindiaodu', group:'fakediaodu_use', get content(){ let content=get.info('xindiaodu').content; content=content.toString().replaceAll('xindiaodu','fakediaodu'); content=new Function('return '+content)(); delete this.content; this.content=content; return content; }, subSkill:{ use:{ trigger:{global:'useCard'}, filter(event,player){ if(!lib.skill.xindiaodu.isFriendOf(player,event.player)||!(event.targets||[]).includes(player)) return false; return (player==event.player||player.hasSkill('fakediaodu'))&&!event.player.getStorage('fakediaodu_temp').includes(get.type2(event.card)); }, direct:true, async content(event,trigger,player){ const target=trigger.target,next=await target.chooseBool(get.prompt('fakediaodu'),'摸一张牌?'); if(player.hasSkill('fakediaodu')) next.set('frequentSkill','fakediaodu'); if(player==trigger.player) next.setHiddenSkill('fakediaodu'); const {result:{bool}}=next; if(bool){ player.logSkill('fakediaodu',target); target.draw('nodelay'); target.addTempSkill('fakediaodu_temp'); target.markAuto('fakediaodu_temp',[get.type2(trigger.card)]); } }, }, temp:{ charlotte:true, onremove:true, }, }, }, fakeyigui:{ audio:'yigui', hiddenCard(player,name){ if(['shan','wuxie'].includes(name)||!['basic','trick'].includes(get.type(name))) return false; return lib.inpile.includes(name)&&player.getStorage('fakeyigui').length&&!player.getStorage('fakeyigui2').includes(get.type2(name)); }, enable:'chooseToUse', filter(event,player){ if(event.type=='wuxie'||event.type=='respondShan') return false; const storage=player.getStorage('fakeyigui'),storage2=player.getStorage('fakeyigui2'); if(!storage.length||storage2.length>1) return false; if(event.type=='dying'){ if(storage2.includes('basic')) return false; if(!event.filterCard({name:'tao'},player,event)&&!event.filterCard({name:'jiu'},player,event)) return false; const target=event.dying; return target.identity=='unknown'||target.identity=='ye'||storage.some(i=>{ var group=get.character(i,1); if(group=='ye'||target.identity==group) return true; var double=get.is.double(i,true); if(double&&double.includes(target.identity)) return true; }); } return get.inpileVCardList(info=>{ const name=info[2]; if(storage2.includes(get.type(name))) return false; return get.type(name)=='basic'||get.type(name)=='trick'; }).some(cardx=>{ const card={name:cardx[2],nature:cardx[3]},info=get.info(card); return storage.some(character=>{ if(!lib.filter.filterCard(card,player,event)) return false; if(event.filterCard&&!event.filterCard(card,player,event)) return false; const group=get.character(character,1),double=get.is.double(character,true); if(info.changeTarget){ const list=game.filterPlayer(current=>player.canUse(card,current)); for(let i=0;i{ return event.filterTarget(card,player,current)&&(group=='ye'||current.identity=='unknown'||current.identity=='ye'||current.identity==group||(double&&double.includes(current.identity))); }); }); }); }, chooseButton:{ select:2, dialog(event,player){ var dialog=ui.create.dialog('役鬼','hidden'); dialog.add([player.getStorage('fakeyigui'),'character']); const list=get.inpileVCardList(info=>{ const name=info[2]; if(player.getStorage('fakeyigui2').includes(get.type(name))) return false; return get.type(name)=='basic'||get.type(name)=='trick'; }); dialog.add([list,'vcard']); return dialog; }, filter(button,player){ var evt=_status.event.getParent('chooseToUse'); if(!ui.selected.buttons.length){ if(typeof button.link!='string') return false; if(evt.type=='dying'){ if(evt.dying.identity=='unknown'||evt.dying.identity=='ye') return true; var double=get.is.double(button.link,true); return evt.dying.identity==lib.character[button.link][1]||lib.character[button.link][1]=='ye'||(double&&double.includes(evt.dying.identity)); } return true; } else{ if(typeof ui.selected.buttons[0].link!='string') return false; if(typeof button.link!='object') return false; var name=button.link[2]; if(player.getStorage('fakeyigui2').includes(get.type(name))) return false; var card={name:name}; if(button.link[3]) card.nature=button.link[3]; var info=get.info(card); var group=lib.character[ui.selected.buttons[0].link][1]; var double=get.is.double(ui.selected.buttons[0].link,true); if(evt.type=='dying') return evt.filterCard(card,player,evt); if(!lib.filter.filterCard(card,player,evt)) return false; else if(evt.filterCard&&!evt.filterCard(card,player,evt)) return false; if(info.changeTarget){ var list=game.filterPlayer(function(current){ return player.canUse(card,current); }); for(var i=0;i1) return (1.7+Math.random())*Math.max(num,1); } } return 1+Math.random(); }, backup(links,player){ var name=links[1][2],nature=links[1][3]||null; var character=links[0],group=lib.character[character][1]; var next={ character:character, group:group, filterCard:()=>false, selectCard:-1, popname:true, audio:'yigui', viewAs:{ name:name, nature:nature, isCard:true, }, filterTarget(card,player,target){ var xx=lib.skill.fakeyigui_backup; var evt=_status.event; var group=xx.group; var double=get.is.double(xx.character,true); var info=get.info(card); if((!(info.singleCard&&ui.selected.targets.length))&&group!='ye'&&target.identity!='unknown'&&target.identity!='ye'&&target.identity!=group&&(!double||!double.includes(target.identity))) return false; if(info.changeTarget){ var targets=[target]; info.changeTarget(player,targets); for(var i=0;idelete player.storage.fakeyigui2); } player.markAuto('fakeyigui2',[get.type(result.card.name)]); }, }; return next; }, prompt(links,player){ var name=links[1][2],character=links[0],nature=links[1][3]; return '移除「'+get.translation(character)+'」并视为使用'+(get.translation(nature)||'')+get.translation(name); }, }, ai:{ order:()=>1+10*Math.random(), result:{player:1}, }, group:'fakeyigui_init', marktext:'魂', intro:{ onunmark(storage){ _status.characterlist.addArray(storage); storage=[]; }, mark(dialog,storage,player){ if(storage&&storage.length){ if(player.isUnderControl(true)) dialog.addSmall([storage,'character']); else return '共有'+get.cnNumber(storage.length)+'张“魂”'; } else return '没有“魂”'; }, content(storage){ return '共有'+get.cnNumber(storage.length)+'张“魂”'; }, }, gainHun(player,num){ const list=_status.characterlist.randomGets(num); if(list.length){ _status.characterlist.removeArray(list); player.markAuto('fakeyigui',list); get.info('rehuashen').drawCharacter(player,list); game.log(player,'获得了'+get.cnNumber(list.length)+'张','#g“魂”'); } }, subSkill:{ backup:{}, init:{ audio:'fakeyigui', trigger:{player:'showCharacterAfter'}, filter(event,player){ if(!event.toShow.some(i=>get.character(i,3).includes('fakeyigui'))) return false; return game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakeyigui')); },event).indexOf(event)==0; }, forced:true, locked:false, content(){ get.info('fakeyigui').gainHun(player,2); }, }, }, }, fakejihun:{ audio:'jihun', inherit:'jihun', content(){ get.info('fakeyigui').gainHun(player,1); }, ai:{combo:'fakeyigui'}, group:'fakejihun_zhiheng', subSkill:{ zhiheng:{ audio:'jihun', trigger:{player:'phaseZhunbeiBegin'}, filter(event,player){ return player.getStorage('fakeyigui').length; }, async cost(event,trigger,player){ const {result:{bool,links}}=await player.chooseButton([ get.prompt('fakejihun'),'
弃置至多两张“魂”,然后获得等量的“魂”
', [player.getStorage('fakeyigui'),'character'], ],[1,2]).set('ai',button=>{ const getNum=(character)=>{ return game.countPlayer(target=>{ const group=get.character(character,1); if(group=='ye'||target.identity==group) return true; const double=get.is.double(character,true); if(double&&double.includes(target.identity)) return true; })+1; }; return game.countPlayer()-getNum(button.link); }); event.result={bool:bool,cost_data:links}; }, async content(event,trigger,player){ player.unmarkAuto('fakeyigui',event.cost_data); _status.characterlist.addArray(event.cost_data); game.log(player,'移除了'+get.cnNumber(event.cost_data.length)+'张','#g“魂”'); get.info('fakeyigui').gainHun(player,event.cost_data.length); }, }, }, }, fakejueyan:{ mainSkill:true, init(player){ if(player.checkMainSkill('fakejueyan')) player.removeMaxHp(); }, audio:'drlt_jueyan', derivation:'fakejizhi', trigger:{player:'phaseZhunbeiBegin'}, async cost(event,trigger,player){ const {result:{control}}=await player.chooseControl('判定区','装备区','手牌区','cancel2') .set('prompt','###'+get.prompt('fakejueyan')+'###
于本回合结束阶段弃置一个区域的所有牌,然后…
') .set('choiceList',[ '判定区:跳过判定阶段,获得〖集智〗直到回合结束', '装备区:摸三张牌,本回合手牌上限+3', '手牌区:本回合使用【杀】的额定次数+3', ]).set('ai',()=>{ const player=get.event('player'); if(player.countCards('j',{type:'delay'})) return '判定区'; if(player.countCards('h')<3) return '装备区'; if(player.countCards('hs',card=>{ return get.name(card)=='sha'&&player.hasUseTarget(card); })>player.getCardUsable('sha')) return '手牌区'; return '判定区'; }); event.result={bool:(control!='cancel2'),cost_data:control}; }, async content(event,trigger,player){ const position={'判定区':'j','装备区':'e','手牌区':'h'}[event.cost_data]; switch(position){ case 'j': player.skip('phaseJudge'); player.addTempSkills('fakejizhi'); break; case 'e': await player.draw(3); player.addTempSkill('drlt_jueyan3'); break; case 'h': player.addTempSkill('drlt_jueyan1'); break; } player.when('phaseJieshuBegin').then(()=>{ if(player.countCards(pos)) player.discard(player.getCards(pos)); }).vars({pos:position}); }, }, fakejizhi:{ audio:'rejizhi', audioname:['lukang'], inherit:'jizhi', }, fakequanji:{ audio:'gzquanji', inherit:'gzquanji', filter(event,player,name){ return !player.hasHistory('useSkill',evt=>{ return evt.skill=='fakequanji'&&evt.event.triggername==name; }); }, content(){ 'step 0' const num=Math.max(1,Math.min(player.maxHp,player.getExpansions('fakequanji').length)); event.num=num; player.draw(num); 'step 1' var hs=player.getCards('he'); if(hs.length>0){ if(hs.length<=event.num) event._result={bool:true,cards:hs}; else player.chooseCard('he',true,'选择'+get.cnNumber(event.num)+'张牌作为“权”',event.num); } else event.finish(); 'step 2' if(result.bool){ var cs=result.cards; player.addToExpansion(cs,player,'give').gaintag.add('fakequanji'); } }, mod:{ maxHandcard(player,num){ return num+player.getExpansions('fakequanji').length; }, }, }, fakepaiyi:{ audio:'gzpaiyi', enable:'phaseUse', filterTarget:true, usable:1, async content(event,trigger,player){ const target=event.target; const {result:{junling,targets}}=await player.chooseJunlingFor(target); if(junling){ const str=get.translation(player),num=get.cnNumber(player.getExpansions('fakequanji').length); const {result:{index}}=await target.chooseJunlingControl(player,junling,targets).set('prompt','排异').set('choiceList',[ '执行此军令,然后'+str+'摸'+num+'张牌并将一张“权”置入弃牌堆', '不执行此军令,然后'+str+'可以对至多'+num+'名与你势力相同的角色各造成1点伤害并移去等量的“权”', ]).set('ai',()=>{ const all=player.getExpansions('fakequanji').length; const effect=get.junlingEffect(player,junling,target,targets,target); const eff1=(effect-get.effect(player,{name:'draw'},player,target)*all); const eff2=((source,player,num)=>{ let targets=game.filterPlayer(current=>{ return current.isFriendOf(player)&&get.damageEffect(current,source,source)>0&&get.damageEffect(current,source,player)<0; }).sort((a,b)=>{ return (get.damageEffect(b,source,source)>0-get.damageEffect(b,source,player))-(get.damageEffect(a,source,source)>0-get.damageEffect(a,source,player)); }).slice(0,num); return targets.reduce((sum,target)=>{ return sum+(get.damageEffect(target,source,source)-get.damageEffect(target,source,player))/2; },0); })(player,target,all); return Math.max(0,get.sgn(eff1-eff2)); }); const cards=player.getExpansions('fakequanji'); if(index==0){ await target.carryOutJunling(player,junling,targets); if(cards.length){ await player.draw(cards.length); const {result:{bool,links}}=await player.chooseButton(['排异:请移去一张“权”',cards],true); if(bool) await player.loseToDiscardpile(links); } } else if(cards.length){ const {result}=await player.chooseTarget('排异:是否对至多'+get.cnNumber(cards.length)+'名与'+get.translation(target)+'势力相同的角色各造成1点伤害并移去等量的“权”?',(card,player,target)=>{ return target.isFriendOf(get.event('target')); },[1,cards.length]).set('target',target).set('ai',target=>{ return get.damageEffect(target,get.event('player'),get.event('player')); }); if(result.bool){ const targetx=result.targets.sortBySeat(); player.line(targetx); for(const i of targetx) await i.damage(); const {result:{bool,links}}=await player.chooseButton(['排异:请移去'+get.cnNumber(targetx.length)+'张“权”',cards],targetx.length,true); if(bool) await player.loseToDiscardpile(links); } } } }, ai:{ order:1, result:{ target(player,target){ return -game.countPlayer(current=>{ return current==target||current.isFriendOf(target); }); }, }, }, }, fakeshilu:{ audio:'gzshilu', trigger:{player:['phaseZhunbeiBegin','phaseUseEnd']}, filter(event,player){ if(event.name=='phaseZhunbei') return player.getStorage('fakeshilu').length; if(!player.hasViceCharacter()) return false; const skills=get.character(player.name2,3).filter(i=>!get.is.locked(i,player)); return !player.hasHistory('useSkill',evt=>evt.event.getParent('phaseUse')==event&&skills.includes(evt.sourceSkill||evt.skill)); }, forced:true, async content(event,trigger,player){ if(trigger.name=='phaseZhunbei'){ const num=player.getStorage('fakeshilu').length; await player.chooseToDiscard(num,'h',true); await player.draw(num); } else{ await player.changeVice().setContent(get.info('fakeshilu').changeVice); } }, getGroups(player){ return player.getStorage('fakeshilu').map(i=>{ const double=get.is.double(i,true); return double?double:[get.character(i,1)]; }).reduce((all,groups)=>{ all.addArray(groups); return all; },[]); }, changeVice(){ 'step 0' player.showCharacter(2); if(!event.num) event.num=3; var group=player.identity; if(!lib.group.includes(group)) group=lib.character[player.name1][1]; _status.characterlist.randomSort(); event.tochange=[]; for(var i=0;i<_status.characterlist.length;i++){ if(_status.characterlist[i].indexOf('gz_jun_')==0) continue; var goon=false,group2=lib.character[_status.characterlist[i]][1]; if(group=='ye'){ if(group2!='ye') goon=true; } else{ if(group==group2) goon=true; else{ var double=get.is.double(_status.characterlist[i],true); if(double&&double.includes(group)) goon=true; } } if(goon){ event.tochange.push(_status.characterlist[i]); if(event.tochange.length==event.num) break; } } event.tochange=event.tochange.filter(character=>{ const groups=get.info('fakeshilu').getGroups(player); const doublex=get.is.double(character,true); const group=(doublex?doublex:[get.character(character,1)]); return !group.some(j=>groups.includes(j)); }); if(!event.tochange.length) event.finish(); else{ if(event.tochange.length==1) event._result={ bool:true, links:event.tochange, } else player.chooseButton(true,['请选择要变更的武将牌,并将原副将武将牌置于武将牌上',[event.tochange,'character']]).ai=function(button){ return get.guozhanRank(button.link); }; } 'step 1' var name=result.links[0]; _status.characterlist.remove(name); if(player.hasViceCharacter()) event.change=true; event.toRemove=player.name2; event.toChange=name; if(event.change) event.trigger('removeCharacterBefore'); if(event.hidden){ if(!player.isUnseen(1)) player.hideCharacter(1); } 'step 2' var name=event.toChange; if(event.hidden) game.log(player,'替换了副将','#g'+get.translation(player.name2)); else game.log(player,'将副将从','#g'+get.translation(player.name2),'变更为','#g'+get.translation(name)); player.viceChanged=true; player.reinitCharacter(player.name2,name,false); 'step 3' if(event.change&&event.toRemove){ const list=[event.toRemove]; player.markAuto('fakeshilu',list); game.log(player,'将','#g'+get.translation(list),'置于武将牌上作为','#y“戮”'); game.broadcastAll((player,list)=>{ var cards=[]; for(var i=0;igroups.includes(target.identity)); return !goon&&groups.includes(event.source.identity); }, forced:true, logTarget(event,player){ return event.source==player?event.player:event.source; }, async content(event,trigger,player){ trigger[parseInt(name.slice('damageBegin'.length))==4?'decrease':'increase']('num'); }, ai:{ combo:'fakeshilu', effect:{ target(card,player,target){ if(card&&card.name=='sha') return; if(player.hasSkillTag('jueqing',false,target)) return; const groups=get.info('fakeshilu').getGroups(target); if(groups.includes(player.identity)){ var num=get.tag(card,'damage'); if(num){ if(num>1) return 0.5; return 0; } } }, }, }, }, fakehuaiyi:{ audio:'gzhuaiyi', enable:'phaseUse', filter(event,player){ if(!game.hasPlayer(target=>target.isMajor())) return false; return player.hasViceCharacter()||['h','e','j'].some(pos=>player.getCards(pos).every(card=>lib.filter.cardDiscardable(card,player))); }, usable:1, chooseButton:{ dialog(){ return ui.create.dialog('###怀异###'+get.translation('fakehuaiyi_info')); }, chooseControl(event,player){ let list=[],map={'h':'手牌区','e':'装备区','j':'判定区'}; list.addArray(['h','e','j'].filter(pos=>{ return player.getCards(pos).every(card=>lib.filter.cardDiscardable(card,player)); }).map(i=>map[i])); if(player.hasViceCharacter()) list.push('移除副将'); list.push('cancel2'); return list; }, check(){ const player=get.event('player'); if(player.getCards('j').every(card=>lib.filter.cardDiscardable(card,player))) return '判定区'; if(player.hasViceCharacter()&&get.guozhanRank(player.name2,player)<=3) return '移除副将'; if(player.getCards('e').every(card=>lib.filter.cardDiscardable(card,player))&&player.getCards('e')<=1) return '装备区'; if(player.getCards('h').every(card=>lib.filter.cardDiscardable(card,player))&&player.getCards('h')<=1) return '手牌区'; return 'cancel2'; }, backup(result,player){ return { audio:'gzhuaiyi', filterCard:()=>false, selectCard:-1, info:result.control, async content(event,trigger,player){ const control=get.info('fakehuaiyi_backup').info; if(info=='移除副将'){ await player.removeCharacter(1); } else{ const map={'手牌区':'h','装备区':'e','判定区':'j'}; await player.discard(player.getCards(map[control])); } let num={}; const targetx=game.filterPlayer(target=>target.isMajor()); for(const target of targetx){ if(typeof num[target.identity]!='number') num[target.identity]=0; } let groups=Object.keys(num); const competition=groups.length>1; for(const target of targetx){ if(target==player) continue; const {result:{bool,cards}}=await target.chooseToGive(player,'he',true,[1,Infinity],'怀异:交给'+get.translation(player)+'至少一张牌').set('ai',card=>{ const player=get.event('player'),targets=get.event('targetx'); if(!get.event('competition')||!game.hasPlayer(target=>{ return target.isFriendOf(player)&&target.hasViceCharacter()&&get.guozhanRank(target.name2,target)>4; })) return -get.value(card); if(ui.selected.cards.length>=get.rand(2,3)) return 0; return 7.5-get.value(card); }).set('targets',targetx).set('num',num).set('prompt2',competition?'交牌最少的势力的一名角色的副将会被移除':'').set('complexCard',true).set('competition',competition); if(bool){ num[target.identity]+=cards.length; } } groups.sort((a,b)=>num[a]-num[b]); const group=groups[0]; if(num[group]target.identity==group)); if(targetx.some(target=>target.identity==group&&target.hasViceCharacter())){ const {result:{bool,targets}}=await player.chooseTarget('怀异:移除'+get.translation(group)+'势力的其中一名角色的副将',(card,player,target)=>{ return target.identity==get.event('group')&&target.hasViceCharacter(); },true).set('group',group).set('ai',target=>-get.guozhanRank(target.name2,target)); if(bool){ const target=targets[0]; player.line(target); game.log(player,'选择了',target); await target.removeCharacter(1); } } } }, ai:{result:{player:1}}, } }, }, ai:{ order:10, result:{ player(player,target){ if(!game.hasPlayer(i=>i.isMajor()&&get.attitude(player,i)<0)) return 0; if(player.getCards('j').every(card=>lib.filter.cardDiscardable(card,player))) return 1; if(player.hasViceCharacter()&&get.guozhanRank(player.name2,player)<=3) return 1; if(player.getCards('e').every(card=>lib.filter.cardDiscardable(card,player))&&player.getCards('e')<=1) return 1; if(player.getCards('h').every(card=>lib.filter.cardDiscardable(card,player))&&player.getCards('h')<=1) return 1; return 0; }, }, }, subSkill:{backup:{}}, }, fakezisui:{ audio:'gzzisui', trigger:{global:'removeCharacterEnd'}, filter(event,player){ return event.getParent().player==player; }, forced:true, content(){ const list=[trigger.toRemove]; player.markAuto('fakezisui',list); game.log(player,'将','#g'+get.translation(list),'置于武将牌上作为','#y“异”'); game.broadcastAll((player,list)=>{ var cards=[]; for(var i=0;iplayer.maxHp; }, forced:true, content(){ const num=player.getStorage('fakezisui').length; if(trigger.name=='phaseDraw') trigger.num+=num; else player.die(); }, }, }, }, fakejujian:{ audio:'gzjujian', init(player){ if(player.checkViceSkill('fakejujian')&&!player.viceChanged) player.removeMaxHp(); }, viceSkill:true, filter(event,player){ return player.countCards('he',card=>{ return _status.connectMode||(get.type(card)!='basic'&&lib.filter.cardDiscardable(card,player)); }); }, async cost(event,trigger,player){ event.result=await player.chooseCardTarget({ prompt:get.prompt2('fakejujian'), filterTarget(card,player,target){ return target.isFriendOf(player); }, filterCard(card,player){ return get.type(card)!='basic'&&lib.filter.cardDiscardable(card,player); }, position:'he', ai1(card){ return 7.5-get.value(card); }, ai2(target){ const player=get.event('player'); return Math.max(get.effect(target,{name:'wuzhong'},player,player),get.recoverEffect(target,player,player)); }, }); }, async content(event,trigger,player){ await player.discard(event.cards); const target=event.targets[0]; await target.chooseDrawRecover(2,'举荐:摸两张牌或回复1点体力',true); await target.mayChangeVice(); }, }, fakexibing:{ audio:'xibing', inherit:'xibing', content(){ 'step 0' var num=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'); } }, }, fakechengshang:{ audio:'chengshang', trigger:{player:'useCardAfter'}, filter(event,player){ if(!lib.suit.includes(get.suit(event.card,false))||typeof get.number(event.card)!='number') return false; if(player.getHistory('sourceDamage',evt=>{ return evt.card==event.card; }).length) return false; const phsu=event.getParent('phaseUse'); if(!phsu||phsu.player!=player) return false; return event.targets.some(i=>i.isEnemyOf(player)); }, usable:1, preHidden:true, async content(event,trigger,player){ await player.draw(); player.tempBanSkill('fakechengshang','phaseUseAfter',false); player.addTempSkill('fakechengshang_effect'); player.markAuto('fakechengshang_effect',[[get.suit(trigger.card),get.number(trigger.card),trigger.card.name]]); }, subSkill:{ effect:{ charlotte:true, onremove:true, hiddenCard(player,name){ const type=get.type(name); if(type!='basic'&&type!='trick') return false; const storage=player.getStorage('fakechengshang_effect'); return lib.card.list.some(list=>{ return name==list[2]&&storage.some(card=>{ return card[0]==list[0]&&card[1]==list[1]&&card[2]!=list[2]; }); }); }, audio:'chengshang', enable:'phaseUse', chooseButton:{ dialog(event,player){ const storage=player.getStorage('fakechengshang_effect'); const list=lib.card.list.filter(list=>{ const type=get.type(card[2]); if(type!='basic'&&type!='trick') return false; return storage.some(card=>card[0]==list[0]&&card[1]==list[1]&&card[2]!=list[2]); }).map(card=>[get.translation(type),'',card[2],card[3]]); return ui.create.dialog('承赏',[list,'vcard']); }, filter(button,player){ return get.event().getParent().filterCard({name:button.link[2],nature:button.link[3]},player,event); }, check(button){ const player=get.event('player'); const card={name:button.link[2],nature:button.link[3]}; if(player.countCards('hes',cardx=>cardx.name==card.name)) return 0; return player.getUseValue(card); }, backup(links,player){ return { audio:'chengshang', filterCard:true, position:'hs', popname:true, precontent(){ player.logSkill('fakechengshang_effect'); delete event.result.skill; const cardx=event.result.card; const removes=player.getStorage('fakechengshang_effect').filter(card=>{ return lib.card.list.some(list=>{ return cardx.name==list[2]&&card[0]==list[0]&&card[1]==list[1]&&card[2]!=list[2]; }); }); player.unmarkAuto('fakechengshang_effect',removes); }, viewAs:{ name:links[0][2], nature:links[0][3], }, } }, prompt(links,player){ return '将一张手牌当作'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; }, }, }, }, }, fakezhente:{ audio:'zhente', inherit:'zhente', filter(event,player){ var color=get.color(event.card),type=get.type(event.card); if(player==event.player||event.player.isDead()||color=='none') return false; return type=='trick'||(type=='basic'&&color=='black'); }, }, fakezhiwei:{ audio:'zhiwei', inherit:'zhiwei', content(){ 'step 0' player.chooseTarget('请选择【至微】的目标',true,lib.filter.notMe).set('ai',target=>{ var att=get.attitude(_status.event.player,target); if(att>0) return 1+att; return Math.random(); }).set('prompt2',lib.translate.fakezhiwei_info); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('fakezhiwei',target); player.storage.fakezhiwei_effect=target; player.addSkill('fakezhiwei_effect'); } }, subSkill:{ effect:{ charlotte:true, onremove:true, audio:'zhiwei', trigger:{player:'hideCharacterBefore'}, filter(event,player){ return get.character(event.toHide,3).includes('fakezhiwei'); }, forced:true, content(){ trigger.cancel(); }, mark:'character', intro:{content:'已选择$'}, group:['fakezhiwei_draw','fakezhiwei_discard','fakezhiwei_gain','fakezhiwei_clear'], }, draw:{ audio:'zhiwei', trigger:{global:'damageSource'}, forced:true, filter(event,player){ return event.source==player.storage.fakezhiwei_effect; }, logTarget:'source', content(){ player.draw(); }, }, discard:{ audio:'zhiwei', trigger:{global:'damageEnd'}, forced:true, filter(event,player){ return event.player==player.storage.fakezhiwei_effect&&player.hasCard(card=>{ return _status.connectMode||lib.filter.cardDiscardable(card,player); },'h'); }, logTarget:'player', content(){ player.chooseToDiscard('h',true); }, }, gain:{ audio:'zhiwei', trigger:{ player:'loseAfter', global:'loseAsyncAfter', }, forced:true, filter(event,player){ if(event.type!='discard'||event.getlx===false||event.getParent('phaseDiscard').player!=player||!player.storage.fakezhiwei_effect||!player.storage.fakezhiwei_effect.isIn()) return false; var evt=event.getl(player); return evt&&evt.cards2.filterInD('d').length>0; }, logTarget(event,player){ return player.storage.fakezhiwei_effect; }, content(){ if(trigger.delay===false) game.delay(); player.storage.fakezhiwei_effect.gain(trigger.getl(player).cards2.filterInD('d'),'gain2'); }, }, clear:{ audio:'zhiwei', trigger:{ global:'die', player:['hideCharacterEnd','removeCharacterEnd'], }, forced:true, filter(event,player){ if(event.name=='die') return event.player==player.storage.fakezhiwei_effect; if(event.name=='removeCharacter') return get.character(event.toRemove,3).includes('fakezhiwei'); return get.character(event.toHide,3).includes('fakezhiwei'); }, content(){ 'step 0' player.removeSkill('fakezhiwei_effect'); if(trigger.name!='die') event.finish(); 'step 1' if(get.character(player.name1,3).includes('fakezhiwei')) player.hideCharacter(0); if(get.character(player.name2,3).includes('fakezhiwei')) player.hideCharacter(1); }, }, }, }, fakekuangcai:{ inherit:'gzrekuangcai', content(){ const goon=Boolean(player.getHistory('useCard').length); get.info('rekuangcai').change(player,goon?-1:1); player.when({global:'phaseAfter'}).then(()=>{ get.info('rekuangcai').change(player,goon?1:-1); }).vars({goon:goon}); }, }, faketunchu:{ audio:'tunchu', trigger:{player:'phaseDrawBegin2'}, filter(event,player){ return !event.numFixed; }, check(event,player){ return player.countCards('h')<=2; }, locked:false, preHidden:true, content(){ trigger.num+=2; player.when(['phaseDrawEnd','phaseDrawSkipped','phaseDrawCancelled']) .filter(evt=>evt==trigger) .then(()=>{ var nh=player.countCards('h'); if(nh){ player.chooseCard('h',[1,Math.min(nh,2)],'将至多两张手牌置于你的武将牌上',true).set('ai',card=>{ return 7.5-get.value(card); }); } else{ player.addTempSkill('faketunchu_effect'); event.finish(); } }) .then(()=>{ if(result.bool) player.addToExpansion(result.cards,player,'giveAuto').gaintag.add('faketunchu'); }) .then(()=>{ player.addTempSkill('faketunchu_effect'); }); }, intro:{ content:'expansion', markcount:'expansion', }, marktext:'粮', onremove(player,skill){ var cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); }, subSkill:{ effect:{ charlotte:true, mod:{ cardEnabled(card,player){ if(card.name=='sha') return false; }, }, mark:true, intro:{content:'本回合不能使用【杀】'}, }, }, }, fakeshuliang:{ audio:'shuliang', trigger:{global:'phaseJieshuBegin'}, direct:true, filter(event,player){ if(!event.player.isFriendOf(player)) return false; return event.player.isIn()&&get.distance(player,event.player)<=player.getExpansions('faketunchu').length; }, async cost(event,trigger,player){ const {result:{bool,links}}=await player.chooseButton([get.prompt2('fakeshuliang',trigger.player),player.getExpansions('faketunchu')]).set('ai',button=>{ if(get.attitude(get.event('player'),get.event().getTrigger().player)<=0) return 0; return 1+Math.random(); }); event.result={bool:bool,cards:links,targets:[trigger.player]}; }, content(){ player.loseToDiscardpile(event.cards); trigger.player.draw(2); }, ai:{combo:'faketunchu'}, }, fakedujin:{ audio:'dujin', inherit:'dujin', filter(event,player){ return player.countCards('e')&&!event.numFixed; }, content(){ trigger.num+=Math.ceil(player.countCards('e')/2); }, group:'fakedujin_first', subSkill:{ first:{ audio:'dujin', trigger:{player:'showCharacterEnd'}, filter(event,player){ if(game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakedujin')); },event).indexOf(event)!=0) return false; return game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player.isFriendOf(player); })[0].player==player; }, forced:true, locked:false, content(){ player.addMark('xianqu_mark',1); }, }, }, }, fakezhufu:{ audio:'spwuku', enable:'phaseUse', filter(event,player){ return player.hasCard(card=>{ return get.info('fakezhufu').filterCard(card,player); },'he'); }, filterCard(card,player){ return lib.filter.cardDiscardable(card,player)&&!player.getStorage('fakezhufu_effect').includes(get.suit(card)); }, position:'he', check(card){ const player=get.event('player'); if(player.hasUseTarget(card,true,true)) return 0; return 5+3*Math.random()-get.value(card); }, async content(event,trigger,player){ const suit=get.suit(event.cards[0],player); player.addTempSkill('fakezhufu_effect','phaseUseAfter'); player.markAuto('fakezhufu_effect',[[suit,false]]); }, ai:{ order:7, result:{player:1}, }, subSkill:{ effect:{ charlotte:true, onremove:true, intro:{ content(storage){ const suitStorage=storage.slice().sort((a,b)=>lib.suit.indexOf(a[0])-lib.suit.indexOf(b[0])); const suits=suitStorage.reduce((str,list)=>str+get.translation(list[0]),''); const usedSuits=suitStorage.filter(list=>list[1]).reduce((str,list)=>str+get.translation(list[0]),''); let str=''; str+='
  • 已弃置过的花色:'; str+=suits; if(used.length){ str+='
  • 已触发过的花色:'; str+=usedSuits; } return str; }, }, audio:'spwuku', trigger:{player:'yingbian'}, filter(event,player){ return player.getStorage('fakezhufu_effect').some(list=>!list[1]); }, forced:true, content(){ if(!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian=[]; trigger.forceYingbian=true trigger.temporaryYingbian.addArray(player.getStorage('fakezhufu_effect').filter(list=>{ return !list[1]; }).map(list=>{ return get.info('fakezhufu').YingBianMap[list[0]]; })); }, }, }, YingBianMap:{ 'heart':'yingbian_zhuzhan', 'diamond':'yingbian_fujia', 'spade':'yingbian_canqu', 'club':'yingbian_kongchao', }, }, fakeguishu:{ inherit:'hmkguishu', usable:1, }, fakeyuanyu:{ inherit:'hmkyuanyu', filter(event,player){ if(event.num<=0||!event.source) return false; return !event.source.inRange(player); }, content(){ trigger.num--; }, ai:{ effect:{ target(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return; if(player.inRange(target)) return; const num=get.tag(card,'damage'); if(num){ if(num>1) return 0.5; return 'zeroplayertarget'; } }, }, }, }, fakemibei:{ audio:'mibei', trigger:{player:'phaseZhunbeiBegin'}, filter(event,player){ return !player.isMaxHandcard(); }, async cost(event,trigger,player){ const filterTarget=(card,player,target)=>{ return target!=player&&target.isMaxHandcard(); },targetx=game.filterPlayer(current=>filterTarget(null,player,current)); if(targetx.length==1) event.result={bool:true,targets:targetx}; else event.result=await player.chooseTarget(filterTarget,true) .set('prompt2',lib.translate.fakemibei_info) .set('prompt','请选择【秘备】的目标').set('ai',target=>{ const player=get.event('player'); return get.attitude(player,target); }).forResult(); }, preHidden:true, async content(event,trigger,player){ const target=event.targets[0]; const {result:{junling,targets}}=await target.chooseJunlingFor(player); const {result:{index}}=await player.chooseJunlingControl(target,junling,targets).set('prompt','秘备:是否执行军令?'); if(index==0) await player.carryOutJunling(target,junling,targets); }, group:'fakemibei_junling', subSkill:{ junling:{ audio:'mibei', trigger:{player:['carryOutJunlingEnd','chooseJunlingControlEnd']}, filter(event,player){ if(event.name=='carryOutJunling'){ return event.source.countCards('h')>player.countCards('h'); } return event.result.index==1&&player.countCards('h'); }, forced:true, locked:false, async content(event,trigger,player){ if(trigger.name=='carryOutJunling'){ const num=Math.min(5,trigger.source.countCards('h')-player.countCards('h')); await player.draw(num); } else{ const {result:{bool,cards}}=await player.chooseCard('秘备:展示一至三张手牌,本回合你可以将其中一张牌当作另一张基本牌或普通锦囊牌使用一次',[1,3],true).set('ai',card=>{ const player=get.event('player'),goon=_status.currentPhase==player; if(goon) return player.getUseValue(card)/get.value(card); return get.value(card); }); if(bool){ await player.showCards(cards,get.translation(player)+'发动了【秘备】'); player.addGaintag(cards,'fakemibei_effect'); player.addTempSkill('fakemibei_effect'); } } }, }, effect:{ charlotte:true, onremove(player){ player.removeGaintag('fakemibei_effect'); }, hiddenCard(player,name){ const cards=player.getCards('h',card=>card.hasGaintag('fakemibei_effect')); if(cards.length<2) return false; const type=get.type(name); if(type!='basic'&&type!='trick') return false; return cards.slice().map(i=>i.name).includes(name); }, audio:'mibei', enable:'phaseUse', chooseButton:{ dialog(event,player){ const list=player.getCards('h',card=>{ const type=get.type(card); if(type!='basic'&&type!='trick') return false; return card.hasGaintag('fakemibei_effect'); }).sort((a,b)=>{ return lib.inpile.indexOf(a.name)+get.natureList(a,false).reduce((sum,nature)=>{ return sum+lib.inpile_nature.indexOf(nature); },0)-lib.inpile.indexOf(b.name)-get.natureList(b,false).reduce((sum,nature)=>{ return sum+lib.inpile_nature.indexOf(nature); },0); }).slice().map(card=>[get.translation(get.type(card)),'',card.name,card.nature]); return ui.create.dialog('秘备',[list,'vcard']); }, filter(button,player){ const event=get.event().getParent(); return event.filterCard({name:button.link[2],nature:button.link[3]},player,event); }, check(button){ const player=get.event('player'); const card={name:button.link[2],nature:button.link[3]}; if(player.countCards('hes',cardx=>cardx.name==card.name)) return 0; return player.getUseValue(card); }, backup(links,player){ return { audio:'chengshang', filterCard(card,player){ const cardx=get.info('fakemibei_effect_backup').viewAs; if(cardx.name==card.name&&cardx.nature==card.nature) return false; return card.hasGaintag('fakemibei_effect'); }, position:'h', popname:true, precontent(){ player.logSkill('fakemibei_effect'); delete event.result.skill; player.tempBanSkill('fakemibei_effect',null,false); }, viewAs:{ name:links[0][2], nature:links[0][3], }, } }, prompt(links,player){ return '将一张“秘备”牌当作'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; }, }, }, }, }, fakeqizhi:{ audio:'qizhi', inherit:'qizhi', trigger:{player:'useCard'}, filter(event,player){ if(!event.targets||!event.targets.length) return false; if(_status.currentPhase!=player) return false; if(get.type(event.card)=='equip') return false; return game.hasPlayer(target=>!event.targets.includes(target)&&target.countCards('he')>0); }, direct:false, async cost(event,trigger,player){ event.result=await player.chooseTarget(get.prompt2('fakeqizhi'),(card,player,target)=>{ return !get.event().getTrigger().targets.includes(target)&&target.countCards('he')>0; }).set('ai',target=>{ const player=get.event('player'); if(target==player) return 2; if(get.attitude(player,target)<=0) return 1; return 0.5; }).forResult(); }, async content(event,trigger,player){ const target=event.targets[0]; const {result:{bool,cards}}=await player.discardPlayerCard(target,'he',true); if(get.is.yingbianConditional(trigger.card)&&bool){ if(cards.some(i=>get.suit(i,target)==get.suit(trigger.card))){ player.when('yingbian') .filter(evt=>evt.card==trigger.card) .then(()=>trigger.forceYingbian=true); } } }, }, fakejinqu:{ audio:'jinqu', trigger:{player:'phaseJieshuBegin'}, check(event,player){ return player.getHistory('useSkill',evt=>{ return evt.skill=='fakeqizhi'; }).length>=player.countCards('h'); }, prompt2(event,player){ const num=player.getHistory('useSkill',evt=>evt.skill=='fakeqizhi').length; return '摸两张牌,然后将手牌弃置至'+get.cnNumber(num)+'张'; }, content(){ 'step 0' player.draw(2); 'step 1' var dh=player.countCards('h')-player.getHistory('useSkill',evt=>{ return evt.skill=='fakeqizhi'; }).length; if(dh>0) player.chooseToDiscard(dh,true); }, ai:{combo:'fakeqizhi'}, }, fakejuzhan:{ zhuanhuanji:true, locked:false, marktext:'☯', intro:{ content(storage){ if(storage) return '当你使用【杀】指定目标后,你可以获得其X张牌,然后若你的武将牌均明置,则其可以暗置此武将牌,且你本回合不能明置此武将牌(X为你已损失的体力值且至少为1)'; return '当你成为【杀】的目标后,你可以与其各摸X张牌,然后其武将牌均明置,则你可以暗置其一张武将牌,且其本回合不能明置此武将牌(X为其已损失的体力值且至少为1)'; }, }, audio:'nzry_juzhan_1', trigger:{ player:'useCardToPlayered', target:'useCardToTargeted', }, filter(event,player){ if(event.card.name!='sha') return false; const storage=player.storage.fakejuzhan; if((event.player==player)!=Boolean(storage)) return false; if(storage&&!event.target.countCards('he')) return false; return true; }, logTarget(event,player){ const storage=player.storage.fakejuzhan; return event[Boolean(storage)?'target':'player']; }, async content(event,trigger,player){ const storage=player.storage.fakejuzhan; player.changeZhuanhuanji('fakejuzhan'); const target=trigger[Boolean(storage)?'target':'player']; const num=Math.max(target.getDamagedHp(),1); if(!storage){ await player.draw(num,'nodelay'); await target.draw(num); if(!target.isUnseen(2)){ const {result:{bool,links}}=await player.chooseButton([ '拒战:是否暗置'+get.translation(target)+'的一张武将牌?', '
    '+get.translation(target)+'的武将牌
    ', [[target.name1,target.name2],'character'], ]).set('filterButton',button=>!get.is.jun(button.link)); if(bool){ await target.hideCharacter(target.name1==links[0]?0:1); target.addTempSkill('donggui2'); } } } else{ await player.gainPlayerCard(target,num,'he',true); const names=[player.name1,player.name2].filter(i=>{ return get.character(i,3).includes('fakejuzhan'); }); if(!player.isUnseen(2)&&names.length){ const {result:{bool,links}}=await target.chooseBool('拒战:是否暗置'+get.translation(player)+'的'+(names.includes(player.name1)?'主将':'')+(names.length>1?'和':'')+(names.includes(player.name2)?'副将':'')+'?'); if(bool){ if(names.includes(player.name1)) await player.hideCharacter(0); if(names.includes(player.name2)) await player.hideCharacter(1); player.addTempSkill('donggui2'); } } } }, group:'fakejuzhan_mark', subSkill:{ mark:{ charlotte:true, trigger:{player:['hideCharacterEnd','showCharacterEnd']}, filter(event,player){ return get.character(event[event.name=='hideCharacter'?'toHide':'toShow'],3).includes('fakejuzhan'); }, forced:true, popup:false, firstDo:true, content(){ player[(trigger.name=='hideCharacter'?'un':'')+'markSkill']('fakejuzhan'); }, }, }, }, fakedanshou:{ audio:'mobiledanshou', trigger:{global:'phaseZhunbeiBegin'}, filter(event,player){ return ['h','e','j'].some(pos=>player.getCards(pos).every(card=>lib.filter.cardDiscardable(card,player))); }, async cost(event,trigger,player){ let list=[],map={'h':'手牌区','e':'装备区','j':'判定区'}; list.addArray(['h','e','j'].filter(pos=>{ return player.getCards(pos).every(card=>lib.filter.cardDiscardable(card,player)); }).map(i=>map[i])); list.push('cancel2'); const {result:{control}}=await player.chooseControl(list).set('prompt',get.prompt2('fakedanshou',trigger.player)).set('ai',()=>{ const player=get.event().player,controls=get.event().controls.slice(); if(controls.includes('判定区')) return '判定区'; if(controls.includes('装备区')&&player.countCards('e')<3) return '装备区'; if(controls.includes('手牌区')&&player.countCards('e')<5) return '手牌区'; return 'cancel2'; }); event.result={bool:(control!='cancel2'),cost_data:control}; }, round:1, logTarget:'player', async content(event,trigger,player){ player.popup(event.cost_data); await player.discard(player.getCards({'手牌区':'h','装备区':'e','判定区':'j'}[event.cost_data])); player.addTempSkill('fakedanshou_effect'); player.addMark('fakedanshou_effect',1,false); }, subSkill:{ effect:{ charlotte:true, onremove(player){ delete player.storage.fakedanshou_effect; delete player._fakedanshou_effect; }, audio:'mobiledanshou', trigger:{global:['phaseJudgeBegin','phaseDrawBegin','phaseUseBegin','phaseDiscardBegin']}, async cost(event,trigger,player){ const {result:{control}}=await player.chooseControl('摸牌','增加摸牌数').set('prompt','胆守:请选择一项').set('ai',()=>{ const player=get.event().player,trigger=get.event().getTrigger(); if(trigger.name=='phaseJudge') return '增加摸牌数'; if(trigger.name=='phaseDiscard') return '摸牌'; if(trigger.name=='phaseDraw'){ if(get.damageEffect(trigger.player,player,player)>0){ player._fakedanshou_effect=true; return '增加摸牌数'; } } return player._fakedanshou_effect?'增加摸牌数':'摸牌'; }); event.result={bool:true,cost_data:control}; }, logTarget:'player', async content(event,trigger,player){ if(event.cost_data=='增加摸牌数'){ player.addMark('fakedanshou_effect',1,false); } else{ const num=player.countMark('fakedanshou_effect'); await player.draw(num); if(num>=4){ const {result:{bool}}=await player.chooseBool('胆守:是否对'+get.translation(trigger.player)+'造成1点伤害?').set('choice',get.damageEffect(trigger.player,player,player)>0); if(bool){ player.line(trigger.player); await trigger.player.damage(); } } } }, }, }, }, fakexunxi:{ trigger:{global:'showCharacterEnd'}, filter(event,player){ const card=new lib.element.VCard({name:'sha'}); return event.player!=player&&event.player!=_status.currentPhase&&player.canUse(card,event.player,false); }, check(event,player){ const card=new lib.element.VCard({name:'sha'}); return get.effect(event.player,card,player,player)>0; }, logTarget:'player', async content(event,trigger,player){ const card=new lib.element.VCard({name:'sha'}); await player.useCard(card,trigger.player,false); }, }, fakehuanjia:{ trigger:{ player:'useCardToPlayered', target:'useCardToTargeted', }, filter(event,player){ if(event.card.name!='sha') return false; if(event.target==player){ if(player.getStorage('fakehuanjia_used').includes(2)) return false; return event.player.getEquips(2).length; } if(event.targets.length!=1) return false; if(player.getStorage('fakehuanjia_used').includes(1)) return false; return event.target.getEquips(1).length; }, logTarget(event,player){ return event.target==player?event.player:event.target; }, forced:true, async content(event,trigger,player){ player.addTempSkill('fakehuanjia_used'); if(trigger.target==player){ player.markAuto('fakehuanjia_used',[2]); if(!player.getEquips(2).length&&player.hasEmptySlot(2)){ player.addSkill('fakehuanjia_equip2'); player.markAuto('fakehuanjia_equip2',[trigger.player]); player.when({global:'phaseAfter',player:['equipEnd','disableEquipEnd','die']}) .filter((evt,player)=>{ if(evt.name=='phase'||evt.name=='die') return true; if(evt.name=='discardEquip') return !player.hasEmptySlot(2); return get.type(evt.card)=='equip2'; }) .then(()=>player.removeSkill('fakehuanjia_equip2')); const cards=trigger.player.getEquips(2); if(cards.length){ const skills=cards.reduce((list,card)=>{ if(get.info(card)&&get.info(card).skills) list.addArray(get.info(card).skills); return list; },[]); if(skills.length) player.addAdditionalSkill('fakehuanjia_equip2',skills); } } } else{ player.markAuto('fakehuanjia_used',[1]); if(!player.getEquips(1).length&&player.hasEmptySlot(1)){ player.addSkill('fakehuanjia_equip1'); player.markAuto('fakehuanjia_equip1',[trigger.target]); player.when({global:'phaseAfter',player:['equipEnd','disableEquipEnd','die']}) .filter((evt,player)=>{ if(evt.name=='phase'||evt.name=='die') return true; if(evt.name=='discardEquip') return !player.hasEmptySlot(1); return get.type(evt.card)=='equip1'; }) .then(()=>player.removeSkill('fakehuanjia_equip1')); const cards=trigger.target.getEquips(1); if(cards.length){ const skills=cards.reduce((list,card)=>{ if(get.info(card)&&get.info(card).skills) list.addArray(get.info(card).skills); return list; },[]); if(skills.length) player.addAdditionalSkill('fakehuanjia_equip1',skills); } } } }, subSkill:{ used:{ charlotte:true, onremove:true, }, equip1:{ charlotte:true, onremove:true, mark:true, marktext:'攻', mod:{ attackRange(player,num){ const targets=player.getStorage('fakehuanjia_equip1').filter(i=>i.isIn()); return num+targets.reduce((sum,target)=>{ return sum+target.getEquipRange(); },0); }, }, intro:{content:'视为装备$的武器'}, trigger:{global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter','die']}, filter(event,player){ return game.hasPlayer(target=>{ if(!player.getStorage('fakehuanjia_equip1').includes(target)) return false; if(event.name=='die'&&event.player==target) return true; if(event.name=='equip'&&event.player==target) return get.subtype(event.card)=='equip1'; if(event.getl){ const evt=event.getl(target); return evt&&evt.player==target&&evt.es&&evt.es.some(i=>get.subtype(i)=='equip1'); } return false; }); }, forced:true, popup:false, content(){ const targets=player.getStorage('fakehuanjia_equip1').filter(i=>i.isIn()); const skills=targets.reduce((list,target)=>{ const cards=target.getEquips(1); if(cards.length){ const skills=cards.reduce((listx,card)=>{ if(get.info(card)&&get.info(card).skills) listx.addArray(get.info(card).skills); return listx; },[]); if(skills.length) list.addArray(skills); } return list; },[]); player.addAdditionalSkill('fakehuanjia_equip1',skills); }, }, equip2:{ charlotte:true, onremove:true, mark:true, marktext:'防', intro:{content:'视为装备$的防具'}, trigger:{global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter','die']}, filter(event,player){ return game.hasPlayer(target=>{ if(!player.getStorage('fakehuanjia_equip2').includes(target)) return false; if(event.name=='die'&&event.player==target) return true; if(event.name=='equip'&&event.player==target) return get.subtype(event.card)=='equip2'; if(event.getl){ const evt=event.getl(target); return evt&&evt.player==target&&evt.es&&evt.es.some(i=>get.subtype(i)=='equip2'); } return false; }); }, forced:true, popup:false, content(){ const targets=player.getStorage('fakehuanjia_equip2').filter(i=>i.isIn()); const skills=targets.reduce((list,target)=>{ const cards=target.getEquips(2); if(cards.length){ const skills=cards.reduce((listx,card)=>{ if(get.info(card)&&get.info(card).skills) listx.addArray(get.info(card).skills); return listx; },[]); if(skills.length) list.addArray(skills); } return list; },[]); player.addAdditionalSkill('fakehuanjia_equip2',skills); }, }, }, }, fakexiongshu:{ audio:'xiongshu', trigger:{global:'useCardToPlayered'}, filter(event,player){ if(!event.isFirstTarget) return false; if(event.player==player&&game.countPlayer()<2) return false; if(event.player!=player&&!player.countDiscardableCards(player,'he')) return false; return event.card.name=='sha'||(get.type(event.card)=='trick'&&get.tag(event.card,'damage')); }, check(event,player){ if(event.player==player){ if(event.targets.some(i=>i.hasSkill('gzduanchang'))) return true; return !event.targets.some(i=>i.getHp()==1&&!i.hasSkill('gzbuqu')&&i.isEnemyOf(player)); } if(event.targets.some(i=>i.hasSkill('gzduanchang'))) return false; return event.targets.some(i=>i.getHp()==1&&!i.hasSkill('gzbuqu')&&i.isEnemyOf(player)); }, usable:1, async content(event,trigger,player){ if(trigger.player==player){ await player.draw(); const {result:{bool,targets}}=await player.chooseTarget('令一名其他角色成为'+get.translation(trigger.card)+'的伤害来源',true,lib.filter.notMe).set('ai',target=>{ const player=get.event('player'),targets=get.event().getTrigger().targets; const goon=(player.hasSkill('fakejianhui')&&targets.some(i=>i!=target&&i.isFriendOf(target))); return targets.reduce((sum,i)=>sum+get.damageEffect(i,target,player),0)*(goon?3:1); }); if(bool){ const target=targets[0]; player.line(target); game.log(target,'成为了',trigger.card,'的伤害来源'); trigger.getParent().customArgs.default.customSource=target; } } else{ await player.chooseToDiscard('he',true); game.log(player,'成为了',trigger.card,'的伤害来源'); trigger.getParent().customArgs.default.customSource=player; } }, }, fakejianhui:{ audio:'jianhui', trigger:{global:'damageSource'}, filter(event,player){ if(!event.source||!event.player||!event.source.isIn()||!event.player.isIn()||event.source==event.player) return false; return event.source.isFriendOf(event.player)&&[event.source,event.player].some(target=>target.countCards('he')); }, async cost(event,trigger,player){ event.result=await player.chooseTarget(get.prompt2('fakejianhui'),(card,player,target)=>{ const trigger=get.event().getTrigger(); if(!(trigger.source==target||trigger.player==target)) return false; if(!ui.selected.targets.length) return true; return target.countCards('he'); },2).set('targetprompt',['摸牌','拆牌']).set('ai',target=>{ const player=get.event('player'),trigger=get.event().getTrigger(); const source=trigger.source,playerx=trigger.player; const min=-Math.min(get.effect(source,{name:'draw'},player,player),get.effect(playerx,{name:'draw'},player,player)); const max=Math.max(get.effect(source,{name:'guohe_copy'},player,player),get.effect(playerx,{name:'guohe_copy'},player,player)); if(min>max) return 0; if(!ui.selected.targets.length) return -1/Math.min(get.effect(target,{name:'draw'},player,player),-0.001); return get.effect(target,{name:'guohe_copy'},player,player); }).set('complexSelect',true).set('complexTarget',true).forResult(); }, popup:false, async content(event,trigger,player){ player.logSkill('fakejianhui',event.targets,false); player.line2(event.targets); await event.targets[0].draw(); await player.discardPlayerCard(event.targets[1],'he',true); }, }, fakechongxin:{ audio:'chongxin', enable:'phaseUse', filter(event,player){ const card=new lib.element.VCard({name:'yiyi'}); return lib.filter.targetEnabled2(card,player,player)&&game.hasPlayer(target=>{ return lib.filter.targetEnabled2(card,player,target)&&target.isEnemyOf(player); }); }, filterTarget(cardx,player,target){ const card=new lib.element.VCard({name:'yiyi'}); return lib.filter.targetEnabled2(card,player,target)&&target.isEnemyOf(player); }, usable:1, async content(event,trigger,player){ const card=new lib.element.VCard({name:'yiyi'}); await player.useCard(card,[player].concat(event.targets),false); }, ai:{ order(item,player){ return get.order({name:'yiyi'},player)+0.1; }, result:{ target(player,target){ const card=new lib.element.VCard({name:'yiyi'}); const num=get.sgn(get.attitude(player,target)); return num*(get.effect(player,card,player,player)-get.effect(target,card,player,player)); }, }, }, }, fakeweirong:{ zhuanhuanji:true, locked:false, marktext:'☯', intro:{ content(storage){ if(storage) return '出牌阶段,你可以摸X张牌,然后当你于本轮不因此法失去牌后,你弃置一张牌。(X为你上一轮以此法摸和弃置的牌数之和,且X至少为1,至多为你的体力上限)'; return '出牌阶段,你可以弃置X张牌,然后当你于本轮不因此法得到牌后,你摸一张牌。(X为你上一轮以此法摸和弃置的牌数之和,且X至少为1,至多为你的体力上限)'; }, }, audio:'weishu', enable:'phaseUse', filter(event,player){ if(!get.info('fakeweirong').getNum(player)) return false; const storage=player.storage.fakeweirong; return storage||player.countCards('he',card=>lib.filter.cardDiscardable)>=get.info('fakeweirong').getNum(player); }, filterCard(card,player){ return !Boolean(player.storage.fakeweirong)&&lib.filter.cardDiscardable(card,player); }, selectCard(){ const player=get.event('player'); return player.storage.fakeweirong?-1:get.info('fakeweirong').getNum(player); }, check(card){ return 7.5-get.value(card); }, prompt(){ const player=get.event('player'); const num=get.info('fakeweirong').getNum(player); if(player.storage.fakeweirong) return '摸'+get.cnNumber(num)+'张牌,然后当你于本轮不因此法失去牌后,你弃置一张牌'; return '弃置'+get.cnNumber(num)+'张牌,然后当你于本轮不因此法得到牌后,你摸一张牌'; }, round:1, async content(event,trigger,player){ const storage=player.storage.fakeweirong; player.changeZhuanhuanji('fakeweirong'); if(storage) await player.draw(get.info('fakeweirong').getNum(player)); player.addTempSkill('fakeweirong_'+(storage?'lose':'gain'),'roundStart'); }, ai:{ order(item,player){ const storage=player.storage.fakeweirong; return storage?0.01:9; }, result:{player:1}, }, group:'fakeweirong_mark', subSkill:{ mark:{ charlotte:true, trigger:{player:['hideCharacterEnd','showCharacterEnd']}, filter(event,player){ return get.character(event[event.name=='hideCharacter'?'toHide':'toShow'],3).includes('fakeweirong'); }, forced:true, popup:false, firstDo:true, content(){ player[(trigger.name=='hideCharacter'?'un':'')+'markSkill']('fakeweirong'); }, }, gain:{ charlotte:true, mark:true, marktext:'↑', intro:{content:'不因此法得到牌后,你摸一张牌'}, audio:'weishu', trigger:{player:'gainAfter',global:'loseAsyncAfter'}, filter(event,player){ if(!event.getg||!event.getg(player).length) return false; return event.getParent(2).name!='fakeweirong_gain'; }, forced:true, content(){ player.draw(); }, }, lose:{ charlotte:true, mark:true, marktext:'↓', intro:{content:'不因此法失去牌后,你弃置一张牌'}, trigger:{player:'loseAfter',global:'loseAsyncAfter'}, filter(event,player){ if(!player.countCards('he')) return false; const evt=event.getl(player); if(!evt||!evt.cards2||!evt.cards2.length) return false; return event.getParent(3).name!='fakeweirong_lose'; }, forced:true, content(){ player.chooseToDiscard('he',true); }, }, }, getNum(player){ let num=0,count=false; const history=player.actionHistory; for(let i=history.length-1;i>=0;i--){ if(history[i].isRound){ if(!count){ count=true; continue; } else break; } if(!count) continue; const allHistory=history[i].gain.filter(evt=>{ return evt.getParent(2).name=='fakeweirong'||evt.getParent(2).name=='fakeweirong_gain'; }).slice().concat(history[i].lose.filter(evt=>{ return evt.getParent(2).skill=='fakeweirong'||evt.getParent(3).name=='fakeweirong_lose'; })); for(const evt of allHistory) num+=evt.cards.length; } return Math.max(1,Math.min(player.maxHp,num)); }, }, fakequanbian:{ audio:'quanbian', trigger:{player:['useCard','respond']}, filter(event,player){ if(!Array.from(ui.cardPile.childNodes).length) return false; return player.countCards('h')&&_status.currentPhase==player; }, async cost(event,trigger,player){ const cards=Array.from(ui.cardPile.childNodes); const {result:{bool,moved}}=await player.chooseToMove(get.prompt2('fakequanbian')) .set('list',[ ['牌堆顶',cards.slice(0,Math.min(player.maxHp,cards.length)),'fakequanbian_tag'], ['手牌',player.getCards('h')], ]).set('filterOk',moved=>moved[1].filter(i=>!get.owner(i)).length==1) .set('filterMove',(from,to)=>typeof to!='number').set('processAI',list=>{ const player=get.event('player'),goon=player.hasSkill('fakezhouting'); let cards1=list[0][1].slice(),cards2=list[1][1].slice(); let card1=cards1.slice().sort((a,b)=>get[goon?'useful':'value'](goon?a:b)-get[goon?'useful':'value'](goon?b:a))[0]; let card2=cards2.slice().sort((a,b)=>get[goon?'useful':'value'](goon?b:a)-get[goon?'useful':'value'](goon?a:b))[0]; if(get[goon?'useful':'value'](card1)*(goon?-1:1)get.owner(i))[0], moved[1].filter(i=>!get.owner(i))[0], ], }; } else event.result={bool:false}; }, async content(event,trigger,player){ await player.lose(event.cost_data[0],ui.cardPile).set('insert_index',()=>{ return ui.cardPile.childNodes[Array.from(ui.cardPile.childNodes).indexOf(get.event('card2'))]; }).set('card2',event.cost_data[1]); await player.gain(event.cost_data[1],'gain2'); }, }, fakezhouting:{ unique:true, limited:true, audio:'xiongzhi', enable:'phaseUse', skillAnimation:true, animationColor:'thunder', async content(event,trigger,player){ player.awakenSkill('fakezhouting'); let gains=[]; const cards=Array.from(ui.cardPile.childNodes).slice(0,Math.min(player.maxHp,Array.from(ui.cardPile.childNodes).length)); await game.cardsGotoOrdering(cards); for(const card of cards){ if(player.hasUseTarget(card,false,false)){ await player.chooseUseTarget(card,true,false,'nodistance'); } else gains.push(card); } if(gains.length) await player.gain(gains,'gain2'); if(game.getGlobalHistory('everything',evt=>{ return evt.name=='die'&&evt.getParent(6).name=='fakezhouting'&&evt.getParent(6).player==player; }).length) player.restoreSkill('fakezhouting'); }, ai:{ order:1, result:{ player(player){ return player.hasUnknown()?0:1; }, }, }, }, fakexuanbei:{ audio:'xuanbei', trigger:{player:'showCharacterEnd'}, filter(event,player){ return game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakexuanbei')); },event).indexOf(event)==0; }, forced:true, locked:false, async content(event,trigger,player){ await player.draw(2); player.addTempSkill('fakexuanbei_effect'); }, group:['fakexuanbei_change','fakexuanbei_give'], subSkill:{ effect:{ charlotte:true, mark:true, intro:{content:'使用应变牌时直接获得强化,使用合纵牌时摸一张牌。'}, }, give:{ audio:'xuanbei', trigger:{player:'useCardAfter'}, filter(event,player){ return (event.card.yingbian||get.is.yingbian(event.card))&&event.cards.filterInD().length; }, usable:1, async cost(event,trigger,player){ const cards=trigger.cards.filterInD(); const {result:{bool,targets}}=await player.chooseTarget(get.prompt('fakexuanbei'),'令一名其他角色获得'+get.translation(event.cards),lib.filter.notMe).set('ai',target=>{ const att=get.attitude(get.event('player'),target); if(att<0) return 0; if(target.hasJudge('lebu')) att/=2; if(target.hasSkillTag('nogain')) att/=10; return att/(1+get.distance(player,target,'absolute')); }); event.result={bool:bool,targets:targets,cards:cards}; }, async content(event,trigger,player){ await event.targets[0].gain(event.cards,'gain2').set('giver',player); }, }, change:{ audio:'xuanbei', trigger:{player:'die'}, direct:true, forceDie:true, skillAnimation:true, animationColor:'thunder', async cost(event,trigger,player){ const {result:{bool,targets}}=await player.chooseTarget(get.prompt('fakexuanbei'),'令一名其他角色变更副将',lib.filter.notMe).set('ai',target=>{ const player=get.event('player'); const rank=get.guozhanRank(target.name2,target)<=3; const att=get.attitude(player,target); if(att>0) return (4-rank)*att; return -(rank-6)*att; }).set('forceDie',true); event.result={bool:bool,targets:targets}; }, async content(event,trigger,player){ await event.targets[0].changeVice(); }, }, }, }, fakeqingleng:{ audio:'qingleng', trigger:{global:'phaseEnd'}, filter(event,player){ var target=event.player; return target!=player&&target.isIn()&&!target.isUnseen(2)&&player.countCards('he')&&player.canUse({name:'sha',nature:'ice'},target,false); }, direct:true, preHidden:true, async content(event,trigger,player){ const target=trigger.player; const {result:{bool}}=await player.chooseToUse() .set('openskilldialog',get.prompt2('fakeqingleng',target)) .set('norestore',true).set('_backupevent','fakeqingleng_backup') .set('custom',{ add:{}, replace:{window:function(){}} }).set('targetRequired',true).set('complexSelect',true) .set('filterTarget',function(card,player,target){ if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; return lib.filter.targetEnabled.apply(this,arguments); }).set('sourcex',target).set('addCount',false).set('hiddenSkill','fakeqingleng') .backup('fakeqingleng_backup').set('logSkill',['fakeqingleng',target]); if(bool&&!player.getHistory('sourceDamage',evt=>{ return evt.getParent(4)==event; }).length){ const {result:{bool,links}}=await player.chooseButton([ '清冷:暗置'+get.translation(target)+'的一张武将牌', '
    '+get.translation(target)+'的武将牌
    ', [[target.name1,target.name2],'character'], ],true).set('filterButton',button=>!get.is.jun(button.link)); if(bool){ player.line(target); player.addSkill('fakeqingleng_effect'); if(player.getStorage('fakeqingleng_effect').some(list=>list[0]==target)){ player.storage.fakeqingleng_effect.indexOf(player.getStorage('fakeqingleng_effect').find(list=>list[0]==target))[1].addArray(links); } else player.markAuto('fakeqingleng_effect',[[target,links[0]]]); target.when(['phaseBegin','die']) .vars({target:player}).then(()=>{ const removes=target.getStorage('fakeqingleng_effect').filter(list=>list[0]==player); target.unmarkAuto('fakeqingleng_effect',removes); if(!target.getStorage('fakeqingleng_effect').length){ target.removeSkill('fakeqingleng_effect'); } }); await target.hideCharacter(target.name1==links[0]?0:1); } } }, subSkill:{ backup:{ filterCard:true, check(card){ return 7.5-get.value(card); }, position:'he', popname:true, viewAs:{name:'sha',nature:'ice'}, precontent(){ delete event.result.skill; }, }, effect:{ charlotte:true, onremove:true, intro:{ content(storage){ return '•'+storage.map(list=>{ return get.translation(list[0])+'明置'+get.translation(list[1])+'后,对其造成1点伤害'; }).join('
    •'); }, }, audio:'qingleng', trigger:{global:'showCharacterEnd'}, filter(event,player){ const list=player.getStorage('fakeqingleng_effect').find(list=>list[0]==event.player); return list&&list[1].includes(event.toShow); }, forced:true, logTarget:'player', content(){ trigger.player.damage(); }, }, }, }, fakexijue:{ audio:'xijue', trigger:{player:'showCharacterEnd'}, filter(event,player){ return game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakexijue')); },event).indexOf(event)==0; }, forced:true, popup:false, preHidden:['xijue_tuxi','fakexijue_xiaoguo'], content(){ player.addMark('xijue',2); }, derivation:['xijue_tuxi','fakexijue_xiaoguo'], group:['fakexijue_effect','xijue_tuxi','fakexijue_xiaoguo'], subSkill:{ effect:{ audio:'xijue', trigger:{player:['phaseDrawBegin2','phaseEnd']}, filter(event,player){ if(event.name=='phaseDraw') return !event.numFixed; return player.getHistory('sourceDamage').length; }, forced:true, popup:false, content(){ if(trigger.name=='phaseDraw') trigger.num=Math.min(player.countMark('xijue'),player.maxHp); else player.addMark('xijue',1); }, }, xiaoguo:{ audio:'xijue_xiaoguo', trigger:{global:'phaseZhunbeiBegin'}, filter(event,player){ if(!player.hasMark('xijue')) return false; return event.player!=player&&player.countCards('h',card=>{ if(_status.connectMode) return true; return get.type(card)=='basic'&&lib.filter.cardDiscardable(card,player); }); }, async cost(event,trigger,player){ event.result=await player.chooseToDiscard(get.prompt2('fakexijue_xiaoguo',trigger.player),(card,player)=>{ return get.type(card)=='basic'; },[1,Math.min(player.countMark('xijue'),player.maxHp)]).set('complexSelect',true).set('ai',card=>{ const player=get.event('player'),target=get.event().getTrigger().player; const effect=get.damageEffect(target,player,player); const cards=target.getCards('e',card=>get.attitude(player,target)*get.value(card,target)<0); if(effect<=0&&!cards.length) return 0; if(ui.selected.cards.length>cards.length-(effect<=0?1:0)) return 0; return 1/(get.value(card)||0.5); }).set('logSkill',['fakexijue_xiaoguo',trigger.player]).setHiddenSkill('fakexijue_xiaoguo').forResult(); }, preHidden:true, popup:false, async content(event,trigger,player){ const num=trigger.player.countCards('e'),num2=event.cards.length; await player.discardPlayerCard(trigger.player,'e',num2,true); if(num2>num) await trigger.player.damage(); player.removeMark('xijue',1); }, }, }, }, fakeqimei:{ audio:'qimei', trigger:{player:'phaseZhunbeiBegin'}, direct:true, preHidden:true, content(){ 'step 0' player.chooseTarget(get.prompt('fakeqimei'),'选择一名其他角色并获得“齐眉”效果',lib.filter.notMe).set('ai',target=>{ var player=_status.event.player; return get.attitude(player,target)/(Math.abs(player.countCards('h')+2-target.countCards('h'))+1) }).setHiddenSkill('fakeqimei'); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('fakeqimei',target); player.addTempSkill('fakeqimei_draw'); player.storage.fakeqimei_draw=target; game.delayx(); } }, subSkill:{ draw:{ audio:'qimei', charlotte:true, forced:true, popup:false, trigger:{global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','loseAfter','addToExpansionAfter']}, filter(event,player){ var target=player.storage.fakeqimei_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)&&target.isDamaged())||(hasChange(event,target)&&player.isDamaged()); }, content(){ 'step 0' if(trigger.delay===false) game.delayx(); 'step 1' var target=player.storage.fakeqimei_draw; player.logSkill('fakeqimei_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); for(const i of drawer){ if(i.isDamaged()) i.recover(); } }, group:'fakeqimei_hp', onremove:true, mark:true, intro:{content:'已和$组成齐眉组合'}, }, hp:{ audio:'qimei', trigger:{global:'changeHp'}, charlotte:true, forced:true, logTarget(event,player){ return player.storage.fakeqimei_draw; }, filter(event,player){ var target=player.storage.fakeqimei_draw; if(!target||!target.isIn()) return false; if(player!=event.player&&target!=event.player) return false; return player.hp==target.hp; }, content(){ game.delayx(); (player==trigger.player?player.storage.fakeqimei_draw:player).draw(); }, }, }, }, fakebaoqie:{ audio:'baoqie', trigger:{player:'showCharacterEnd'}, filter(event,player){ if(!game.hasPlayer(target=>{ return target.getGainableCards(player,'e').some(card=>get.subtype(card)=='equip5'); })) return false; return game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakebaoqie')); },event).indexOf(event)==0; }, async cost(event,trigger,player){ event.result=await player.chooseTarget(get.prompt('fakebaoqie'),'获得一名角色的宝物牌,然后你可以使用此牌',(card,player,target)=>{ return target.getGainableCards(player,'e').some(card=>get.subtype(card)=='equip5'); }).set('ai',target=>{ const player=get.event('player'); return -get.sgn(get.attitude(player,target))*target.getGainableCards(player,'e').filter(card=>{ return get.subtype(card)=='equip5'; }).reduce((sum,card)=>sum+get.value(card,target),0); }).forResult(); }, async content(event,trigger,player){ const target=event.targets[0]; let cards=target.getGainableCards(player,'e').filter(card=>get.subtype(card)=='equip5'); await player.gain(cards,target,'giveAuto'); cards=cards.filter(i=>get.owner(i)==player&&get.position(i)=='h'&&player.hasUseTarget(i)); if(cards.length){ const {result:{bool,links}}=await player.chooseButton(['宝箧:是否使用其中一张宝物牌?',cards]).set('ai',button=>{ return get.equipValue(button.link,get.event('player')); }); if(bool) await player.chooseUseTarget(card,true); } }, ai:{mingzhi_no:true}, group:'fakebaoqie_damage', subSkill:{ damage:{ audio:'baoqie', trigger:{player:'damageBegin4'}, filter(event,player){ if(!player.getStockSkills(true,true,true).includes('fakebaoqie')) return false; return !game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakebaoqie')); }).length; }, check(event,player){ return !event.source||get.damageEffect(player,event.source,player)<0; }, prompt:'宝箧:是否明置此武将牌并防止此伤害?', content(){ trigger.cancel(); }, }, }, }, fakeciwei:{ audio:'ciwei', trigger:{global:'useCard'}, filter(event,player){ if(event.all_excluded||event.player==player||!player.countCards('he')) return false; return event.player.getHistory('useCard').indexOf(event)%2==1; }, async cost(event,trigger,player){ let str='弃置一张牌,取消'+get.translation(trigger.card)+'的所有目标'; if(get.type(trigger.card)=='equip') str+=',然后你获得此牌且你可以使用之'; event.result=await player.chooseToDiscard(get.prompt('fakeciwei',trigger.player),str,'he').set('ai',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('fakeciwei').set('logSkill',['fakeciwei',trigger.player]).forResult(); }, preHidden:true, popup:false, async content(event,trigger,player){ trigger.targets.length=0; trigger.all_excluded=true; if(get.type(trigger.card)=='equip'&&!get.owner(trigger.card)){ await player.gain(trigger.card,'gain2'); if(get.owner(trigger.card)==player&&player.hasUseTarget(trigger.card)){ await player.chooseUseTarget(trigger.card); } } }, global:'fakeciwei_ai', subSkill:{ ai:{ mod:{ aiOrder(player,card,num){ if(!player.getHistory('useCard').length%2||!game.hasPlayer(current=>{ return current!=player&&(get.realAttitude||get.attitude)(current,player)<0&¤t.hasSkill('fakeciwei')&¤t.countCards('he')>0; })) return; if(!player._fakeciwei_temp){ player._fakeciwei_temp=true; num/=Math.max(1,player.getUseValue(card)); } delete player._fakeciwei_temp; return num; }, }, }, }, }, fakehuirong:{ audio:'huirong', trigger:{player:'showCharacterEnd'}, filter(event,player){ if(!game.hasPlayer(target=>{ return target.countCards('h')!=target.getHp(); })) return false; return game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakehuirong')); },event).indexOf(event)==0; }, async cost(event,trigger,player){ event.result=await player.chooseTarget(get.prompt('fakehuirong'),'令一名角色将手牌数摸至/弃置至与其体力值相同',(card,player,target)=>{ return target.countCards('h')!=target.getHp(); }).set('ai',target=>{ const att=get.attitude(get.event('player'),target); const num=target.countCards('h'); if(num>target.hp) return -att*(num-target.getHp()); return att*Math.max(0,target.getHp()-target.countCards('h')); }).forResult(); }, preHidden:true, content(){ const target=event.targets[0]; if(target.countCards('h'){ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakehuirong')); }).length; }, check(event,player){ return !event.source||get.damageEffect(player,event.source,player)<0; }, prompt:'慧容:是否明置此武将牌并防止此伤害?', content(){ trigger.cancel(); }, }, }, }, fakeyanxi:{ audio:'yanxi', enable:'phaseUse', filter(event,player){ return game.hasPlayer(target=>{ return get.info('fakeyanxi').filterTarget(null,player,target); }); }, filterTarget(card,player,target){ return target!=player&&target.countCards('h'); }, usable:1, async content(event,trigger,player){ const target=event.target,str=get.translation(target); const {result:{bool,links}}=await player.choosePlayerCard(target,'宴戏:展示'+str+'的一张手牌','h',true); if(bool){ let cards=get.cards(2),gains=[]; await game.cardsGotoOrdering(cards); cards=links.slice().concat(cards); await player.showCards(cards,get.translation(player)+'发动了【宴戏】'); for(const card of cards){ gains.unshift(get.color(card)); gains.add(get.type2(card)); } gains=gains.unique().map(i=>i=='none'?'none2':i); const {result:{control}}=await player.chooseControl(gains).set('cards',cards).set('ai',()=>{ const player=get.event('player'),cards=get.event('cards'),getNum=function(cards,control,player){ cards=cards.filter(i=>get.type2(i)==control||get.color(i)==control); return cards.reduce((sum,card)=>sum+get.value(card,player),0); }; let controls=get.event('controls').slice().map(i=>i=='none2'?'none':i); controls.sort((a,b)=>getNum(cards,b,player)-getNum(cards,a,player)); return controls[0]=='none'?'none2':controls[0]; }).set('dialog',['获得其中一种颜色或类别的所有牌,然后'+str+'获得剩余牌','hidden',cards]); if(control){ const choice=(control=='none2'?'none':control); gains=cards.filter(i=>get.type2(i)==choice||get.color(i)==choice); const num=gains.length; cards.removeArray(gains); if(gains.includes(links[0])){ gains.removeArray(links); await player.gain(links,target,'give','bySelf'); } if(gains.length) await player.gain(gains,'gain2'); player.addTempSkill('fakeyanxi_maxHand'); player.addMark('fakeyanxi_maxHand',num,false); cards=cards.filter(i=>!links.includes(i)); if(cards.length) await target.gain(cards,'gain2'); } } }, ai:{ order:9, result:{ target(player,target){ return [-1,1,2][get.sgn(get.attitude(player,target))+1]/target.countCards('h'); }, }, }, subSkill:{ maxHand:{ charlotte:true, onremove:true, intro:{content:'手牌上限+#'}, mod:{ maxHandcard(player,num){ return num+player.countMark('fakeyanxi_maxHand'); }, }, }, }, }, fakeshiren:{ audio:'shiren', trigger:{player:'showCharacterEnd'}, filter(event,player){ if(!game.hasPlayer(target=>{ return get.info('fakeyanxi').filterTarget(null,player,target); })) return false; return game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakeshiren')); },event).indexOf(event)==0; }, async cost(event,trigger,player){ event.result=await player.chooseTarget(get.prompt('fakeshiren'),'发动一次【宴戏】',(card,player,target)=>{ return get.info('fakeyanxi').filterTarget(null,player,target); }).set('ai',target=>{ const player=get.event('player'); return -get.sgn(get.attitude(player,target))*get.info('fakeyanxi').ai.result.target(player,target); }).forResult(); }, async content(event,trigger,player){ const target=event.targets[0]; player.useResult({skill:'fakeyanxi',target:target,targets:[target]},event); }, ai:{mingzhi_no:true}, group:'fakeshiren_damage', subSkill:{ damage:{ audio:'shiren', trigger:{player:'damageBegin4'}, filter(event,player){ if(!player.getStockSkills(true,true,true).includes('fakeshiren')) return false; return !game.getAllGlobalHistory('everything',evt=>{ return evt.name=='showCharacter'&&evt.player==player&&evt.toShow.some(i=>get.character(i,3).includes('fakeshiren')); }).length; }, check(event,player){ return !event.source||get.damageEffect(player,event.source,player)<0; }, prompt:'识人:是否明置此武将牌并防止此伤害?', content(){ trigger.cancel(); }, }, }, }, fakecanmou:{ audio:'canmou', trigger:{global:'useCardToPlayer'}, filter(event,player){ if(!event.player.isMaxHandcard(true)||!event.isFirstTarget||get.type(event.card)!='trick') return false; if(event.targets.length>1&&!player.getStorage('fakecanmou_used').includes('-')) return true; return get.info('fakecanmou').filter_add(event,player); }, filter_add(event,player){ const info=get.info(event.card); if(info.allowMultiple==false) return false; if(event.targets&&!info.multitarget&&!player.getStorage('fakecanmou_used').includes('+')){ if(game.hasPlayer(current=>{ return !event.targets.includes(current)&&lib.filter.targetEnabled2(event.card,event.player,current); })) return true; } return false; }, async cost(event,trigger,player){ let str='',goon=get.info('fakecanmou').filter_add(trigger,player),bool=(trigger.targets.length>1&&!player.getStorage('fakecanmou_used').includes('-')); if(goon) str+='增加'; if(goon&&bool) str='或'; if(bool) str+='减少'; event.result=await player.chooseTarget(get.prompt('fakecanmou'),(card,player,target)=>{ const trigger=get.event().getTrigger(); if(trigger.targets.length>1&&!player.getStorage('fakecanmou_used').includes('-')&&trigger.targets.includes(target)) return true; return !player.getStorage('fakecanmou_used').includes('+')&&!trigger.targets.includes(target)&&lib.filter.targetEnabled2(trigger.card,trigger.player,target); }).set('prompt2','为'+get.translation(trigger.card)+str+'一个目标').set('ai',target=>{ const player=get.event('player'),trigger=get.event().getTrigger(); return get.effect(target,trigger.card,trigger.player,player)*(trigger.targets.includes(target)?-1:1); }).setHiddenSkill('fakecanmou').forResult(); }, preHidden:true, async content(event,trigger,player){ const target=event.targets[0],goon=trigger.targets.includes(target); player.addTempSkill('fakecanmou_used'); player.markAuto('fakecanmou_used',[goon?'-':'+']); if(goon){ trigger.targets.remove(target); game.log(target,'被',player,'移除了目标'); } else{ trigger.targets.add(target); game.log(target,'成为了',trigger.card,'移除了目标'); } }, subSkill:{used:{charlotte:true,onremove:true}}, }, fakezhuosheng:{ hiddenCard(player,name){ return player.countCards('hs')>1&&get.type(name)=='basic'&&lib.inpile.includes(name)&&!player.getStorage('fakezhuosheng_count').includes(name); }, audio:'zhuosheng', enable:'chooseToUse', filter(event,player){ if(event.type=='wuxie') return false; if(player.countCards('hs')<2) return false; return get.inpileVCardList(info=>{ const name=info[2]; return !player.getStorage('fakezhuosheng_count').includes(name)&&get.type(name)=='basic'; }).some(card=>event.filterCard({name:card[2],nature:card[3]},player,event)); }, chooseButton:{ dialog(event,player){ var list=get.inpileVCardList(info=>{ const name=info[2]; return !player.getStorage('fakezhuosheng_count').includes(name)&&get.type(name)=='basic'; }).filter(card=>event.filterCard({name:card[2],nature:card[3]},player,event)); return ui.create.dialog('擢升',[list,'vcard'],'hidden'); }, check(button){ var player=_status.event.player; var evt=_status.event.getParent(); var name=button.link[2],card={name:name,nature:button.link[3]}; if(name=='shan') return 2; if(evt.type=='dying'){ if(get.attitude(player,evt.dying)<2) return 0; if(name=='jiu') return 2.1; return 1.9; } if(evt.type=='phase'){ if(button.link[2]=='jiu'){ if(player.getUseValue({name:'jiu'})<=0) return 0; var cards=player.getCards('hs',cardx=>get.value(cardx)<8); cards.sort((a,b)=>get.value(a)-get.value(b)); if(cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) return player.getUseValue({name:'jiu'}); return 0; } return player.getUseValue(card)/4; } return 1; }, backup(links,player){ return { audio:'zhuosheng', filterCard:true, selectCard:[2,Infinity], position:'hs', complexCard:true, check(card){ if(ui.selected.cards.length>=2) return 0; return 8-get.value(card); }, popname:true, viewAs:{ name:links[0][2], nature:links[0][3], }, precontent(){ var name=event.result.card.name; player.addTempSkill('fakezhuosheng_count'); player.markAuto('fakezhuosheng_count',[name]); player.when('yingbian') .filter(evt=>evt.skill=='fakezhuosheng_backup') .then(()=>{ if(trigger.cards&&trigger.cards.length){ let cards=trigger.cards.slice(); cards=cards.filter(i=>get.is.yingbian(i)); if(cards.length){ if(!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian=[]; trigger.temporaryYingbian.add('force'); trigger.temporaryYingbian.addArray(Array.from(lib.yingbian.effect.keys()).filter(value=>{ return cards.some(card=>get.cardtag(card,`yingbian_${value}`)); })); } } }); }, } }, prompt(links,player){ var name=links[0][2]; var nature=links[0][3]; return '将至少两张手牌当作'+(get.translation(nature)||'')+get.translation(name)+'使用'; }, }, ai:{ order(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('fakezhuosheng_count').includes(name)); if(names.includes('sha')) add=true; names=names.map(namex=>{return {name:namex}}); if(add) lib.inpile_nature.forEach(nature=>names.push({name:'sha',nature:nature})); names.forEach(card=>{ if(player.getUseValue(card)>0){ var temp=get.order(card); if(card.name=='jiu'){ var cards=player.getCards('hs',cardx=>get.value(cardx)<8); cards.sort((a,b)=>get.value(a)-get.value(b)); if(!cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) temp=0; } if(temp>max) max=temp; } }); if(max>0) max-=0.001; return max; } return 0.5; }, respondShan:true, respondSha:true, fireAttack:true, skillTagFilter(player,tag,arg){ if(arg=='respond') return false; const name=(tag=='respondShan'?'shan':'sha'); return get.info('fakezhuosheng').hiddenCard(player,name); }, result:{ player(player){ if(_status.event.dying) return get.attitude(player,_status.event.dying); return 1; }, }, }, subSkill:{ count:{charlotte:true,onremove:true}, backup:{}, }, }, fakejuhou:{ zhenfa:'inline', trigger:{global:'useCardToTargeted'}, filter(event,player){ return (event.card.name=='sha'||get.type(event.card)=='trick')&&event.target.inline(player); }, logTarget:'target', async content(event,trigger,player){ const target=trigger.target; const {result:{bool,cards}}=await target.chooseCard('he',[1,Infinity],'是否将任意张牌置于武将牌上?').set('ai',card=>{ const trigger=get.event().getTrigger(),player=trigger.target; if(card.name=='baiyin'&&get.position(card)=='e'&&player.isDamaged()&&get.recoverEffect(player,player,player)>0) return 1; if(['guohe','shunshou','zhujinqiyuan','chuqibuyi','huogong'].includes(trigger.card.name)&&get.effect(player,trigger.card,trigger.player,player)<0) return 1; return 0; }); if(bool){ target.addToExpansion(cards,'giveAuto',target).gaintag.add('fakejuhou'); target.addSkill('fakejuhou'); target.when({global:'useCardAfter'}) .filter(evt=>evt==trigger.getParent()) .then(()=>{ const cards=player.getExpansions('fakejuhou'); if(cards.length) player.gain(cards,'gain2'); }); } }, intro:{ content:'expansion', markcount:'expansion', }, }, gznaxiang:{ audio:'naxiang', inherit:'naxiang', }, fakecaiwang:{ audio:'caiwang', trigger:{player:'loseAfter'}, filter(event,player){ const evt=event.getParent(2); if(evt.name!='yingbianZhuzhan') return false; const color=(get.color(evt.card)==get.color(event.cards[0])).toString(); if(color=='true'&&!game.hasPlayer(target=>{ return target!=player&&target.countCards('he'); })) return false; return !player.getStorage('fakecaiwang_used').includes(color); }, async cost(event,trigger,player){ const color=(get.color(trigger.getParent(2).card)==get.color(trigger.cards[0])).toString(); if(color=='false'){ //event.result=await player.chooseBool(get.prompt('fakecaiwang'),'摸一张牌').forResult(); event.result={bool:true}; } else{ event.result=await player.chooseTarget(get.prompt('fakecaiwang'),'弃置一名其他角色的一张牌',(card,player,target)=>{ return target!=player&&target.countCards('he'); }).set('ai',target=>{ const player=get.event('player'); return get.effect(target,{name:'guohe_copy2'},player,player); }).forResult(); } }, async content(event,trigger,player){ const color=(get.color(trigger.getParent(2).card)==get.color(trigger.cards[0])).toString(); player.addTempSkill('fakecaiwang_used'); player.markAuto('fakecaiwang_used',[color]); if(color=='false') await player.draw(); else await player.discardPlayerCard(event.targets[0],'he',true); }, group:'fakecaiwang_zhuzhan', subSkill:{ used:{ charlotte:true, onremove:true, }, zhuzhan:{ trigger:{player:'yingbianZhuzhanBegin'}, forced:true, locked:false, popup:false, firstDo:true, content(){ trigger.setContent(get.info('fakecaiwang').yingbian); }, }, }, yingbian(){ 'step 0'; event._global_waiting = true; event.send = (player, card, source, targets, id, id2, yingbianZhuzhanAI, skillState) => { if (skillState) player.applySkills(skillState); var type = get.type2(card), str = get.translation(source); if (targets && targets.length) str += `对${get.translation(targets)}`; str += `使用了${get.translation(card)},是否弃置一张${get.translation(type)}为其助战?`; player.chooseCard({ filterCard: (card, player) => get.type2(card) == type && lib.filter.cardDiscardable(card, player), prompt: str, position: 'h', _global_waiting: true, id: id, id2: id2, ai: typeof yingbianZhuzhanAI == 'function' ? yingbianZhuzhanAI(player, card, source, targets) : cardx => { var info = get.info(card); if (info && info.ai && info.ai.yingbian) { var ai = info.ai.yingbian(card, source, targets, player); if (!ai) return 0; return ai - get.value(cardx); } else if (get.attitude(player, source) <= 0) return 0; return 5 - get.value(cardx); } }); if (!game.online) return; _status.event._resultid = id; game.resume(); }; 'step 1'; var type = get.type2(card); event.list = game.filterPlayer(current => current.countCards('h') && (_status.connectMode || current.hasCard(cardx => get.type2(cardx) == type, 'h'))).sortBySeat(_status.currentPhase || player); event.id = get.id(); 'step 2'; if (!event.list.length) event.finish(); else if (_status.connectMode && (event.list[0].isOnline() || event.list[0] == game.me)) event.goto(4); else event.send(event.current = event.list.shift(), event.card, player, trigger.targets, event.id, trigger.parent.id, trigger.yingbianZhuzhanAI); 'step 3'; if (result.bool) { event.zhuzhanresult = event.current; event.zhuzhanresult2 = result; if (event.current != game.me) game.delayx(); event.goto(8); } else event.goto(2); 'step 4'; var id = event.id, sendback = (result, player) => { if (result && result.id == id && !event.zhuzhanresult && result.bool) { event.zhuzhanresult = player; event.zhuzhanresult2 = result; game.broadcast('cancel', id); if (_status.event.id == id && _status.event.name == 'chooseCard' && _status.paused) return () => { event.resultOL = _status.event.resultOL; ui.click.cancel(); if (ui.confirm) ui.confirm.close(); }; } else if (_status.event.id == id && _status.event.name == 'chooseCard' && _status.paused) return () => event.resultOL = _status.event.resultOL; }, withme = false, withol = false, list = event.list; for (var i = 0; i < list.length; i++) { var current = list[i]; if (current.isOnline()) { withol = true; current.wait(sendback); current.send(event.send, current, event.card, player, trigger.targets, event.id, trigger.parent.id, trigger.yingbianZhuzhanAI, get.skillState(current)); list.splice(i--, 1); } else if (current == game.me) { withme = true; event.send(current, event.card, player, trigger.targets, event.id, trigger.parent.id, trigger.yingbianZhuzhanAI); list.splice(i--, 1); } } if (!withme) event.goto(6); if (_status.connectMode && (withme || withol)) game.players.forEach(value => { if (value != player) value.showTimer(); }); event.withol = withol; 'step 5'; if (!result || !result.bool || event.zhuzhanresult) return; game.broadcast('cancel', event.id); event.zhuzhanresult = game.me; event.zhuzhanresult2 = result; 'step 6'; if (event.withol && !event.resultOL) game.pause(); 'step 7'; game.players.forEach(value => value.hideTimer()); 'step 8'; if (event.zhuzhanresult) { var target = event.zhuzhanresult; if(target==player&&player.hasSkill('fakecaiwang')) player.logSkill('fakecaiwang'); target.line(player, 'green'); target.discard(event.zhuzhanresult2.cards).discarder = target; if (typeof event.afterYingbianZhuzhan == 'function') event.afterYingbianZhuzhan(event, trigger); var yingbianCondition = event.name.slice(8).toLowerCase(), yingbianConditionTag = `yingbian_${yingbianCondition}_tag`; target.popup(yingbianConditionTag, lib.yingbian.condition.color.get(yingbianCondition)); game.log(target, '响应了', '' + (target==player?'自己':get.translation(player)) + '', '发起的', yingbianConditionTag); target.addExpose(0.2); event.result = { bool: true }; } else event.result = { bool: false }; }, }, fakenaxiang:{ audio:'naxiang', trigger:{ source:'damageSource', player:'damageEnd', }, filter(event,player){ if(!event.source||!event.player||!event.source.isIn()||!event.player.isIn()||!event.source.isEnemyOf(event.player)) return false; return !player.getStorage('fakenaxiang').includes(get.info('fakenaxiang').logTarget(event,player)); }, logTarget(event,player){ return event.source==player?event.player:event.source; }, forced:true, async content(event,trigger,player){ const target=get.info('fakenaxiang').logTarget(trigger,player); const {result:{junling,targets}}=await player.chooseJunlingFor(target); const {result:{index}}=await target.chooseJunlingControl(player,junling,targets).set('prompt','纳降:是否执行军令?'); if(index==0) await target.carryOutJunling(player,junling,targets); else{ if(!player.storage.fakenaxiang){ player.when(['phaseBegin','die']).then(()=>{ player.unmarkSkill('fakenaxiang'); delete player.storage.fakenaxiang; }); } player.markAuto('fakenaxiang',[target]); } }, onremove:true, marktext:'', intro:{content:'无法对$发动【纳降】'}, group:['fakenaxiang_discard','fakenaxiang_yingbian'], subSkill:{ discard:{ trigger:{player:'chooseCardBegin'}, filter(event,player){ return event.getParent().name=='yingbianZhuzhan'; }, forced:true, popup:false, firstDo:true, content(){ trigger.filterCard=lib.filter.cardDiscardable; }, }, yingbian:{ trigger:{player:'yingbian'}, filter(event,player){ if(event.card.yingbian) return false; const temporaryYingbian=event.temporaryYingbian||[],card=event.card; if(temporaryYingbian.includes('force')||get.cardtag(card,'yingbian_force')) return true; return get.yingbianConditions(event.card).length; }, forced:true, popup:false, firstDo:true, content(){ 'step 0' trigger.card.yingbian=true; event.card=trigger.card; event.temporaryYingbian=(trigger.temporaryYingbian||[]); if(event.temporaryYingbian.includes('force')||get.cardtag(event.card,'yingbian_force')||trigger.forceYingbian||player.hasSkillTag('forceYingbian')){ player.popup('yingbian_force_tag',lib.yingbian.condition.color.get('force')); game.log(player,'触发了',event.card,'的应变条件'); event._result={bool:true}; } else{ 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); }; lib.yingbian.condition.complex.get('zhuzhan')(trigger); } 'step 1' if(!result.bool) return; var yingbianEffectExecuted=false; lib.yingbian.effect.forEach((value,key)=>{ if(!event.temporaryYingbian.includes(key)&&!get.cardtag(card,`yingbian_${key}`)) return; game.yingbianEffect(trigger,value); if(!yingbianEffectExecuted) yingbianEffectExecuted=true; }); if(!yingbianEffectExecuted){ var defaultYingbianEffect=get.defaultYingbianEffect(card); if(lib.yingbian.effect.has(defaultYingbianEffect)){ game.yingbianEffect(trigger,lib.yingbian.effect.get(defaultYingbianEffect)); if(!yingbianEffectExecuted) yingbianEffectExecuted=true; } } if(yingbianEffectExecuted) player.addTempSkill('yingbian_changeTarget'); }, }, }, }, //国战典藏2023补充 //吕范 gzdiaodu:{ audio:'diaodu', trigger:{player:'phaseUseBegin'}, filter:function(event,player){ return game.hasPlayer(function(current){ return current.isFriendOf(player)&¤t.countGainableCards(player,'e')>0; }); }, direct:true, frequent:true, preHidden:true, content:function(){ 'step 0' player.chooseTarget(get.prompt2('gzdiaodu'),function(card,player,current){ return current.isFriendOf(player)&¤t.countGainableCards(player,'e')>0; }).set('ai',function(target){ var 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 num; }).setHiddenSkill('gzdiaodu'); 'step 1' if(result.bool){ var target=result.targets[0] event.target=target; player.logSkill('gzdiaodu',target); player.gainPlayerCard(target,'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.target; },true).set('target',target); } else event.finish(); 'step 3' if(result.bool){ var target=result.targets[0]; player.line(target,'green'); player.give(card,target); } }, group:'gzdiaodu_use', subSkill:{ use:{ trigger:{global:'useCard'}, filter:function(event,player){ return get.type(event.card)=='equip'&&event.player.isIn()&&event.player.isFriendOf(player)&&(player==event.player||player.hasSkill('gzdiaodu')); }, direct:true, content:function(){ 'step 0' var next=trigger.player.chooseBool(get.prompt('gzdiaodu'),'摸一张牌'); if(player.hasSkill('gzdiaodu')) next.set('frequentSkill','gzdiaodu'); if(player==trigger.player) next.setHiddenSkill('gzdiaodu'); 'step 1' if(result.bool){ player.logSkill('gzdiaodu',trigger.player); trigger.player.draw('nodelay'); } }, }, }, }, //徐庶 gzqiance:{ trigger:{global:'useCardToPlayered'}, filter:function(event,player){ if(!event.isFirstTarget||get.type/*2*/(event.card)!='trick') return false;//延时锦囊不能响应有个锤用 return event.player.isFriendOf(player)&&event.targets.some(target=>target.isMajor()); }, check:function(event,player){ var num=0,targets=event.targets.filter(target=>target.isMajor()); for(var target of targets) num+=get.sgn(get.attitude(player,target)*get.effect(target,event.card,event.player,player)); return num>=0; }, logTarget:'player', content:function(){ trigger.getParent().directHit.addArray(trigger.targets.filter(target=>target.isMajor())); }, }, gzjujian:{ init:function(player){ if(player.checkViceSkill('gzjujian')&&!player.viceChanged) player.removeMaxHp(); }, viceSkill:true, audio:'gzjiancai', trigger:{global:'dying'}, filter:function(event,player){ return event.player.isFriendOf(player); }, forced:true, logTarget:'player', content:function(){ trigger.player.recover(1-trigger.player.hp); player.changeVice(); }, }, //彭羕 gztongling:{ audio:'daming', trigger:{source:'damageSource'}, filter:function(event,player){ if(event.player.isFriendOf(player)) return false; return player.isPhaseUsing()&&event.player.isIn()&&!player.hasSkill('gztongling_used'); }, direct:true, content:function(){ 'step 0' var str=''; if(get.itemtype(trigger.cards)=='cards'&&trigger.cards.filterInD().length) str+=';未造成伤害,其获得'+get.translation(trigger.cards.filterInD()); player.chooseTarget(get.prompt('gztongling'),'令一名势力与你相同的角色选择是否对其使用一张牌。若使用且此牌:造成伤害,你与其各摸两张牌'+str,function(card,player,target){ return target.isFriendOf(player); }).set('ai',function(target){ var aim=_status.event.aim; var cards=target.getCards('hs',function(card){ return target.canUse(card,aim,false)&&get.effect(aim,card,target,player)>0&&get.effect(aim,card,target,target)>0; }) if(cards.length) return cards.some(card=>get.tag(card,'damage'))?2:1; return 0; }).set('aim',trigger.player); 'step 1' if(result.bool){ var target=result.targets[0]; event.target=target; player.logSkill('gztongling',target); player.addTempSkill('gztongling_used','phaseUseAfter'); player.line2([target,trigger.player]); target.chooseToUse(function(card,player,event){ return lib.filter.filterCard.apply(this,arguments); },'通令:是否对'+get.translation(trigger.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',trigger.player).set('addCount',false); } else event.finish(); 'step 2' if(result.bool){ if(target.hasHistory('sourceDamage',evt=>evt.getParent(4).name=='gztongling')){ player.draw(2,'nodelay'); target.draw(2); } else{ if(get.itemtype(trigger.cards)=='cards'&&trigger.cards.filterInD().length&&trigger.player.isIn()) trigger.player.gain(trigger.cards.filterInD(),'gain2'); } } }, subSkill:{used:{charlotte:true}}, }, gzjinyu:{ audio:'xiaoni', trigger:{player:'showCharacterAfter'}, filter:function(event,player){ if(!game.hasPlayer(function(current){ return get.distance(player,current)<=1; })) return false; return event.toShow.some(name=>lib.character[name][3].includes('gzjinyu')); }, logTarget:function(event,player){ return game.filterPlayer(function(current){ return get.distance(player,current)<=1; }).sortBySeat(player); }, forced:true, locked:false, content:function(){ 'step 0' event.targets=game.filterPlayer(function(current){ return get.distance(player,current)<=1; }).sortBySeat(player); 'step 1' var target=event.targets.shift(); event.target=target; if(!target.isUnseen(2)){ if(get.is.jun(target)) event._result={control:'副将'}; else{ target.chooseControl('主将','副将').set('prompt','近谀:请暗置一张武将牌').set('ai',function(){ var target=_status.event.player; if(target.name=='gz_pengyang') return '主将'; if(target.name2=='gz_pengyang') return '副将'; if(lib.character[target.name][3].some(skill=>{ var info=get.info(skill); return info&&info.ai&&info.ai.maixie; })) return '主将'; if(target.name=='gz_zhoutai') return '副将'; if(target.name2=='gz_zhoutai') return '主将'; return '副将'; }); } } else{ target.chooseToDiscard(2,'he',true); event.goto(3); } 'step 2' if(result.control) target.hideCharacter(result.control=='主将'?0:1); 'step 3' if(event.targets.length) event.goto(1); }, }, //公孙渊 gzrehuaiyi:{ audio:'gzhuaiyi', enable:'phaseUse', filter:function(event,player){ return player.countCards('h')>0; }, usable:1, delay:false, content:function(){ 'step 0' var map={} player.showHandcards(); for(var i of ['red','black','none']){ if(player.countCards('h',{color:i})) map[i]=true; } if(Object.keys(map).length<2) event.finish(); else event.map=map; 'step 1' var mapx={'red':'红色','black':'黑色','none':'无色'}; player.chooseControl(Object.keys(event.map).map(color=>mapx[color])).set('ai',function(){ var list=_status.event.controls; var map={'红色':'red','黑色':'black','无色':'none'}; return list.sort((a,b)=>player.countCards('h',{color:map[a]})-player.countCards('h',{color:map[b]}))[0]; }).set('prompt','怀异:弃置一种颜色的所有牌'); 'step 2' var map={'红色':'red','黑色':'black','无色':'none'}; var cards=player.getCards('h',{color:map[result.control]}); player.discard(cards); event.num=cards.length; 'step 3' player.chooseTarget('请选择至多'+get.cnNumber(event.num)+'名有牌的其他角色,获得这些角色的各一张牌。',[1,event.num],function(card,player,target){ return target!=player&&target.countCards('he')>0; }).set('ai',function(target){ return -get.attitude(_status.event.player,target)+0.5; }); 'step 4' if(result.bool&&result.targets){ player.line(result.targets,'green'); event.targets=result.targets; event.targets.sort(lib.sort.seat); event.cards=[]; } else event.finish(); 'step 5' if(player.isIn()&&event.targets.length){ player.gainPlayerCard(event.targets.shift(),'he',true); } else event.finish(); 'step 6' if(result.bool&&result.cards&&result.cards.length) event.cards.addArray(result.cards); if(event.targets.length) event.goto(5); 'step 7' var hs=player.getCards('h'); cards=cards.filter(function(card){ return get.type(card)=='equip'&&hs.includes(card); }); if(cards.length){ player.$give(cards,player,false); game.log(player,'将',cards,'置于了武将牌上'); player.loseToSpecial(cards,'gzrehuaiyi').visible=true; } else event.finish(); 'step 8' player.addSkill('gzrehuaiyi_unmark'); player.markSkill('gzrehuaiyi'); game.delayx(); }, ai:{ order:10, result:{ player:function(player,target){ var map={}; for(var i of ['red','black','none']){ if(player.countCards('h',{color:i})) map[i]=true; } if(Object.keys(map).length<2) return 0; var num=player.maxHp-player.countCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); }); if(player.countCards('h',{color:'red'})<=num) return 1; if(player.countCards('h',{color:'black'})<=num) return 1; return 0; }, } }, marktext:'异', intro:{ mark:function(dialog,storage,player){ var cards=player.getCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); }); if(!cards||!cards.length) return; dialog.addAuto(cards); }, markcount:function(storage,player){ return player.countCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); }); }, onunmark:function(storage,player){ var cards=player.getCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); }); if(cards.length){ player.loseToDiscardpile(cards); } }, }, mod:{ aiOrder:function(player,card,num){ if(get.itemtype(card)=='card'&&card.hasGaintag('gzrehuaiyi')) return num+(player.countCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); })>player.maxHp?0.5:-0.5); }, }, subSkill:{ 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('gzrehuaiyi'); }); }, charlotte:true, forced:true, silent:true, content:function(){ player.unmarkSkill('gzrehuaiyi'); player.removeSkill('gzrehuaiyi_unmark'); }, }, }, }, gzrezisui:{ audio:'gzzisui', trigger:{player:'phaseDrawBegin2'}, filter:function(event,player){ return !event.numFixed&&player.countCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); })>0; }, forced:true, content:function(){ trigger.num+=player.countCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); }); }, group:'gzrezisui_die', subSkill:{ die:{ audio:'gzzisui', trigger:{player:'phaseJieshuBegin'}, filter:function(event,player){ return player.countCards('s',function(card){ return card.hasGaintag('gzrehuaiyi'); })>player.maxHp; }, forced:true, content:function(){ player.die(); }, }, }, }, //南华老仙 gztaidan:{ derivation:'taipingyaoshu', audio:'tianshu', locked:true, group:'gztaidan_taipingyaoshu', }, gztaidan_taipingyaoshu:{ equipSkill:true, mod:{ maxHandcard:function(player,num){ if(!player.hasEmptySlot(2)) return; if(player.hasSkill('huangjintianbingfu')){ num+=player.getExpansions('huangjintianbingfu').length; } return num+game.countPlayer(function(current){ return current.isFriendOf(player); }); } }, audio:'tianshu', inherit:'taipingyaoshu', filter:function(event,player){ if(!player.hasEmptySlot(2)) return false; return lib.skill.taipingyaoshu.filter(event,player); }, noHidden:true, ai:{ effect:{ target:function(card,player,target){ if(!target.hasEmptySlot(2)) return; if(player==target&&get.subtype(card)=='equip2'){ if(get.equipValue(card)<=7.5) return 0; } return lib.skill.taipingyaoshu.ai.effect.target.apply(this,arguments); }, }, }, }, gzrejinghe:{ audio:'jinghe', enable:'phaseUse', usable:1, //delay:0, content:function(){ 'step 0' if(!player.storage.gzrejinghe_tianshu){ var list=lib.skill.gzrejinghe.derivation.slice(0); list.remove('gzrejinghe_faq'); var list2=list.slice(0,get.rand(0,list.length)); list.removeArray(list2); list.addArray(list2); player.storage.gzrejinghe_tianshu=list; } else{ var first=player.storage.gzrejinghe_tianshu[0]; player.storage.gzrejinghe_tianshu.remove(first); player.storage.gzrejinghe_tianshu.push(first); } game.log(player,'转动了','#g“天书”'); player.markSkill('gzrejinghe'); var skill=player.storage.gzrejinghe_tianshu[0]; event.skill=skill; var cardname='gzrejinghe_'+skill; lib.card[cardname]={ fullimage:true, image:'character:re_nanhualaoxian' }; lib.translate[cardname]=get.translation(skill); event.videoId=lib.status.videoId++; game.broadcastAll(function(player,id,card){ ui.create.dialog(get.translation(player)+'转动了“天书”',[[card],'card']).videoId=id; },player,event.videoId,game.createCard(cardname,' ',' ')); game.delay(3); 'step 1' game.broadcastAll('closeDialog',event.videoId); var targets=game.filterPlayer(current=>!current.hasSkill(event.skill)); if(!targets.length){event.finish();return;} player.chooseTarget('经合:令一名角色获得技能【'+get.translation(event.skill)+'】',function(card,player,target){ return _status.event.targets.includes(target); },true).set('ai',function(target){ var player=_status.event.player; return get.attitude(player,target); }).set('targets',targets); 'step 2' if(result.bool){ var target=result.targets[0],skill=event.skill; player.line(target); player.addTempSkill('gzrejinghe_clear',{player:'phaseBegin'}); target.addAdditionalSkills('gzrejinghe_'+player.playerid,skill); target.popup(skill); } }, intro:{ name:'写满技能的天书', markcount:()=>8, mark:function(dialog,storage,player){ dialog.content.style['overflow-x']='visible'; var list=player.storage.gzrejinghe_tianshu; var core=document.createElement('div'); var centerX=-10,centerY=80,radius=80; var radian=Math.PI*2/list.length; for(var i=0;i0) player.chooseToDiscard(num,'he',true); } else{ player.addMark('gzrebushi',player.hp); event.finish(); } 'step 1' player.removeMark('gzrebushi',player.countMark('gzrebushi')); if(!player.hasMark('gzrebushi')) player.unmarkSkill('gzrebushi'); }, ai:{mingzhi_no:true}, subSkill:{ give:{ trigger:{global:'phaseZhunbeiBegin'}, filter:function(event,player){ if(event.player==player) return false; return player.hasMark('gzrebushi')&&player.countCards('he'); }, direct:true, content:function(){ 'step 0' player.chooseCard(get.prompt('gzrebushi'),'he','失去1个“义舍”标记,将一张牌交给'+get.translation(trigger.player)+'并摸两张牌').set('ai',function(card){ var player=_status.event.player; var trigger=_status.event.getTrigger(); var target=trigger.player; var num=0,current=target; while(current!=player){ if(current.isFriendOf(player)&&!current.isTurnedOver()) num++; current=current.next; } if(num>=player.countMark('gzrebushi')&&!target.isFriendOf(player)) return -1; return 6-get.value(card); }); 'step 1' if(result.bool){ player.logSkill('gzrebushi',trigger.player); player.removeMark('gzrebushi',1); if(!player.hasMark('gzrebushi')) player.unmarkSkill('gzrebushi'); trigger.player.gain(result.cards,player,'giveAuto'); player.draw(2); } }, }, }, }, gzremidao:{ group:'gzremidao_change', audio:'gzmidao', trigger:{player:'phaseJieshuBegin'}, filter:function(event,player){ return !player.getExpansions('gzremidao').length; }, 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('gzremidao'); }, marktext:'米', intro:{ content:'expansion', markcount:'expansion', }, onremove:function(player,skill){ var cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); }, subSkill:{ change:{ trigger:{global:'judge'}, filter:function(event,player){ return player.getExpansions('gzremidao').length&&event.player.isAlive(); }, direct:true, content:function(){ 'step 0' var list=player.getExpansions('gzremidao'); player.chooseButton([get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+get.translation(trigger.player.judging[0])+ ','+get.prompt('gzremidao'),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); if(result==0) return 0.5; 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,'gzremidao','highlight','noOrdering'); result.cards=result.links; var card=result.cards[0]; event.card=card; } else event.finish(); 'step 2' if(result.bool){ if(trigger.player.judging[0].clone){ trigger.player.judging[0].clone.classList.remove('thrownhighlight'); game.broadcast(function(card){ if(card.clone) card.clone.classList.remove('thrownhighlight'); },trigger.player.judging[0]); game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); } player.$gain2(trigger.player.judging[0]); player.gain(trigger.player.judging[0]); trigger.player.judging[0]=result.cards[0]; trigger.orderingCards.addArray(result.cards); game.log(trigger.player,'的判定牌改为',card); game.delay(2); } }, ai:{ rejudge:true, tag:{rejudge:0.6}, }, }, }, }, //许贡 gzbiaozhao:{ audio:'biaozhao', enable:'phaseUse', usable:1, filter:function(event,player){ var players=game.filterPlayer(current=>current!=player); if(players.length<2) return false; for(var i=0;i0&&targets[1].isAlive()){ player.chooseCard('he',true,'交给'+get.translation(targets[1])+'一张牌'); } else event.finish(); 'step 2' player.give(result.cards,targets[1]); player.draw(); }, ai:{ order:6, result:{ player:function(player,target){ if(ui.selected.targets.length) return 0.1; return get.effect(target,{name:'zhibi'},player,player)+0.1; }, target:function(player,target){ if(ui.selected.targets.length) return 2; return 0; }, }, }, }, gzyechou:{ audio:'yechou', trigger:{player:'die'}, forced:true, forceDie:true, skillAnimation:true, animationColor:'gray', logTarget:'source', filter:function(event,player){ return event.source&&event.source.isIn()&&player.canUse('sha',event.source,false); }, content:function(){ 'step 0' var target=trigger.source; event.target=target; target.addTempSkill('gzyechou_unsavable'); player.useCard({name:'sha',isCard:true},target).set('forceDie',true).set('oncard',function(){ _status.event.directHit.addArray(game.filterPlayer()); }); 'step 1' player.addTempSkill('gzyechou_unequip'); if(!target.isIn()||!player.canUse('sha',target,false)){ player.removeSkill('gzyechou_unequip'); event.goto(3); } else{ player.useCard({ name:'sha', isCard:true, storage:{gzyechou:true} },target).set('forceDie',true); } 'step 2' player.removeSkill('gzyechou_unequip'); if(!target.isIn()||!player.canUse('sha',target,false)){ event.goto(3); } else player.useCard({name:'sha',isCard:true},target).set('forceDie',true).set('oncard',function(){ _status.event.baseDamage++; }); 'step 3' target.removeSkill('gzyechou_unsavable'); }, ai:{ threaten:0.001, }, subSkill:{ unsavable:{ charlotte:true, mod:{ targetEnabled:function(card,player,target){ if(card.name=='tao'&&target.isDying()&&player.isFriendOf(target)&&target!=player) return false; }, }, }, unequip:{ charlotte:true, ai:{ unequip:true, skillTagFilter:function(player,tag,arg){ if(!arg||!arg.card||!arg.card.storage||!arg.card.storage.gzyechou) return false; }, }, }, }, }, //陈宫 gzyinpan:{ enable:'phaseUse', usable:1, filterTarget:lib.filter.notMe, content:function(){ 'step 0' event.targets=game.filterPlayer(function(current){ return current!=target&¤t.isEnemyOf(target) }).sortBySeat(); 'step 1' if(!event.target.isIn()){ event.finish(); return; } var target=targets.shift(); if(target.isIn()&&(_status.connectMode||!lib.config.skip_shan||target.hasSha())){ target.chooseToUse(function(card,player,event){ if(get.name(card)!='sha') return false; return lib.filter.filterCard.apply(this,arguments); },'是否对'+get.translation(event.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.filterTarget.apply(this,arguments); }).set('sourcex',event.target); } if(targets.length>0) event.redo(); 'step 2' if(target.isIn()){ var dying=false; var num=target.getHistory('damage',function(evt){ if(evt.card&&evt.card.name=='sha'){ var evtx=evt.getParent('useCard'); if(evt.card==evtx.card&&evtx.getParent(2)==event){ if(evt._dyinged) dying=true; return true; } } }).length; if(num>0){ target.addTempSkill('gzyinpan_effect',{player:'phaseAfter'}); target.addMark('gzyinpan_effect',num,false); if(dying) target.recover(); } } }, ai:{ order:1, result:{target:-1}, }, subSkill:{ effect:{ mod:{ cardUsable:function(card,player,num){ if(card.name=='sha') return num+player.countMark('gzyinpan_effect'); }, }, onremove:true, charlotte:true, intro:{content:'使用【杀】的次数上限+#'} }, }, }, gzxingmou:{ trigger:{global:'gainAfter'}, forced:true, preHidden:true, filter:function(event,player){ return event.getParent().name=='draw'&&event.getParent(2).name=='die'; }, content:function(){ player.draw(); }, ai:{ noDieAfter:true, noDieAfter2:true, }, }, //朱儁 gzgongjian:{ audio:'gongjian', trigger:{global:'useCardToPlayered'}, filter:function(event,player){ if(!event.isFirstTarget||event.card.name!='sha') return false; var history=game.getAllGlobalHistory('useCard',function(evt){ return evt.card.name=='sha'; }); var evt=event.getParent(),index=history.indexOf(evt); if(index<1) return false; var evt0=history[index-1]; for(var i of evt.targets){ if(evt0.targets.includes(i)&&i.countCards('he')>0) return true; } return false; }, prompt2:'弃置这些角色的各两张牌', preHidden:['gzgongjian_gain'], subfrequent:['gain'], logTarget:function(event,player){ var history=game.getAllGlobalHistory('useCard',function(evt){ return evt.card.name=='sha'; }); var evt=event.getParent(),index=history.indexOf(evt); var evt0=history[index-1]; return evt.targets.filter(function(target){ return (evt0.targets.includes(target)&&target.countCards('he')>0); }); }, check:function(event,player){ var targets=lib.skill.gzgongjian.logTarget(event,player),att=0; for(var i of targets){ att+=get.attitude(player,i); } return att<0; }, content:function(){ var history=game.getAllGlobalHistory('useCard',function(evt){ return evt.card.name=='sha'; }); var evt=trigger.getParent(),index=history.indexOf(evt); var evt0=history[index-1]; var targets=evt.targets.filter(function(target){ return evt0.targets.includes(target); }).sortBySeat(); for(var i of targets) i.chooseToDiscard(true,'he',2); }, group:'gzgongjian_gain', subSkill:{ gain:{ audio:'gongjian', trigger:{ global:['loseAfter','loseAsyncAfter'], }, filter:function(event,player){ if(event.name=='lose'){ if(event.type!='discard'||event.player==player) return false; if((event.discarder||event.getParent(event.getParent(2).name=='chooseToDiscard'?3:2).player)!=player) return false; for(var i of event.cards2){ if(i.name=='sha') return true; } } else if(event.type=='discard'){ if(!event.discarder||event.discarder!=player) return false; var cards=event.getd(null,'cards2'); cards.removeArray(event.getd(player,'cards2')); for(var i of cards){ if(i.name=='sha') return true; } } return false; }, frequent:true, prompt2:function(event,player){ var cards=event.getd(null,'cards2'); cards.removeArray(event.getd(player,'cards2')); cards=cards.filter(card=>card.name=='sha'); return '获得'+get.translation(cards); }, content:function(){ var cards=trigger.getd(null,'cards2'); cards.removeArray(trigger.getd(player,'cards2')); cards=cards.filter(card=>card.name=='sha'); if(cards.length) player.gain(cards,'gain2'); }, }, }, }, gzkuimang:{ audio:'kuimang', trigger:{source:'die'}, forced:true, preHidden:true, filter:function(event,player){ var target=event.player; if(target.isFriendOf(player)) return false; var prev=target.getPrevious(),next=target.getNext(); return (prev&&prev.isFriendOf(target))||(next&&next.isFriendOf(target)); }, content:function(){ player.draw(2); }, }, //毌丘俭 gzzhengrong:{ audio:'drlt_zhenrong', trigger:{ source:'damageBegin3', player:['damageBegin1','chooseJunlingForBegin'], }, forced:true, preHidden:true, filter:function(event,player){ if(event.name!='damage') return true; if(player.identity!='unknown') return !game.hasPlayer(function(current){ return current!=player&¤t.isFriendOf(player); }); return !player.wontYe('wei')||!game.hasPlayer(current=>current.identity=='wei') }, check:function(event,player){ return !event.player.hasSkillTag('filterDamage',null,{ player:event.source, card:event.card, })&&get.damageEffect(event.player,event.source,player,_status.event.player)>0; }, content:function(){ trigger.num++; }, mod:{ globalFrom:function(player,target,num){ if(target.isMajor()) return num-1; }, }, ai:{halfneg:true}, }, gzhongju:{ audio:'drlt_hongju', enable:'phaseUse', limited:true, skillAnimation:true, animationColor:'thunder', filterTarget:lib.filter.notMe, content:function(){ 'step 0' player.awakenSkill('gzhongju'); event.players=game.filterPlayer(function(current){ return current!=player&¤t!=target; }).sortBySeat(); game.delayx(); player.chooseJunlingFor(event.players[0]).set('prompt','请选择一项“军令”'); 'step 1' event.junling=result.junling; event.targets=result.targets; event.num=0; player.carryOutJunling(player,event.junling,event.targets); 'step 2' if(num0?0:1; }); } else event.goto(4); 'step 3' if(result.index==0){ event.current.carryOutJunling(player,event.junling,event.targets); } else{ event.current.addTempSkill('diaohulishan'); } 'step 4' game.delayx(); event.num++; if(event.num=player.hp) return true; return lib.skill.gzjingce.getDiscardNum()>=player.hp; }, prompt2:function(event,player){ var num1=player.getHistory('useCard').length,num2=lib.skill.gzjingce.getDiscardNum(); if(num1>=player.hp&&num2>=player.hp) return '执行一套额外的摸牌阶段和出牌阶段'; return '执行一个额外的'+(num1>num2?'出牌阶段':'摸牌阶段'); }, preHidden:true, frequent:true, content:function(){ var num1=player.getHistory('useCard').length,num2=lib.skill.gzjingce.getDiscardNum(); var num3=player.hp; if(num2>=num3){ var next=player.phaseDraw(); event.next.remove(next); trigger.after.push(next); } if(num1>=num3){ var next=player.phaseUse(); event.next.remove(next); trigger.after.push(next); } }, ai:{threaten:2.6}, }, //黄权 gzdianhu:{ audio:'xinfu_dianhu', trigger:{player:'showCharacterAfter'}, forced:true, filter:function(event,player){ return event.toShow.includes('gz_xf_huangquan')&&!player.storage.gzdianhu_effect; }, content:function(){ 'step 0' player.chooseTarget('请选择【点虎】的目标',true,'给一名角色标上“虎”标记。当你或你的队友对该角色造成伤害后摸一张牌。',lib.filter.notMe).set('ai',function(target){ var player=_status.event.player; var distance=game.countPlayer(function(current){ if(current.isFriendOf(player)) return Math.pow(get.distance(current,target),1.2); }); return 10/distance; }); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('gzdianhu',target); target.markSkill('gzdianhu_mark'); player.addSkill('gzdianhu_effect'); player.markAuto('gzdianhu_effect',[target]); } }, subSkill:{ mark:{ mark:true, marktext:'虎', intro:{content:'已成为“点虎”目标'}, }, effect:{ trigger:{global:'damageEnd'}, forced:true, charlotte:true, filter:function(event,player){ if(!player.getStorage('gzdianhu_effect').includes(event.player)) return false; var source=event.source; return source&&source.isAlive()&&source.isFriendOf(player); }, logTarget:'source', content:function(){ trigger.source.draw(); }, }, }, }, gzjianji:{ audio:'xinfu_jianji', inherit:'xinfu_jianji', filterTarget:true, content:function(){ 'step 0' target.draw('visible'); 'step 1' var card=result[0]; if(card&&game.hasPlayer(function(current){ return target.canUse(card,current); })&&get.owner(card)==target){ target.chooseToUse({ prompt:'是否使用'+get.translation(card)+'?', filterCard:function(cardx,player,target){ return cardx==_status.event.cardx; }, cardx:card, }); } }, ai:{ order:10, result:{target:1}, }, }, //杨婉 gzyouyan:{ audio:'youyan', trigger:{ player:'loseAfter', global:'loseAsyncAfter', }, filter:function(event,player){ if(event.type!='discard'||event.getlx===false||player!=_status.currentPhase) return false; var evt=event.getl(player); if(!evt||!evt.cards2||!evt.cards2.length) return false; var list=[]; for(var i of evt.cards2){ list.add(get.suit(i,player)); if(list.length>=lib.suit.length) return false; } return true; }, usable:1, preHidden:true, content:function(){ var cards=get.cards(4); game.cardsGotoOrdering(cards); player.showCards(cards,get.translation(player)+'发动了【诱言】'); var evt=trigger.getl(player); var list=[]; for(var i of evt.cards2){ list.add(get.suit(i,player)); } cards=cards.filter(card=>!list.includes(get.suit(card,false))); 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.gzyouyan)&& 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'; }, }, }, }, gzzhuihuan:{ audio:'zhuihuan', trigger:{player:'phaseJieshuBegin'}, direct:true, preHidden:true, content:function(){ 'step 0' player.chooseTarget([1,2],'选择至多两名角色获得“追还”效果').setHiddenSkill('gzzhuihuan').set('ai',function(target){ return get.attitude(_status.event.player,target); }); 'step 1' if(result.bool){ var targets=result.targets.sortBySeat(); player.logSkill('gzzhuihuan',targets); event.targets=targets; } else event.finish(); 'step 2' var next=player.chooseTarget('选择一名角色获得反伤效果','被选择的目标角色下次受到伤害后,其对伤害来源造成1点伤害;未被选择的目标角色下次受到伤害后,伤害来源弃置两张牌。',function(card,player,target){ return _status.event.getParent().targets.includes(target); }).set('ai',function(target){ return get.attitude(_status.event.player,target); }); if(targets.length>1) next.set('forced',true); 'step 3' for(var target of targets){ player.addTempSkill('gzzhuihuan_timeout',{player:'phaseZhunbeiBegin'}); var id='gzzhuihuan_'+player.playerid; if(result.targets.includes(target)){ player.line(target,'fire'); target.addAdditionalSkill(id,'gzzhuihuan_damage'); } else{ player.line(target,'thunder'); target.addAdditionalSkill(id,'gzzhuihuan_discard'); } } }, subSkill:{ timeout:{ charlotte:true, onremove:function(player){ var id='gzzhuihuan_'+player.playerid; game.countPlayer((current)=>current.removeAdditionalSkill(id)); }, }, damage:{ charlotte:true, trigger:{player:'damageEnd'}, forced:true, forceDie:true, filter:function(event,player){ return event.source&&event.source.isAlive(); }, logTarget:'source', content:function(){ player.removeSkill('gzzhuihuan_damage'); trigger.source.damage(); }, mark:true, marktext:'追', intro:{ content:'当你下次受到伤害后,你对伤害来源造成1点伤害。', }, ai:{ threaten:0.5, }, }, discard:{ charlotte:true, trigger:{player:'damageEnd'}, forced:true, forceDie:true, filter:function(event,player){ return event.source&&event.source.isAlive(); }, logTarget:'source', content:function(){ player.removeSkill('gzzhuihuan_discard'); trigger.source.chooseToDiscard(2,'he',true); }, mark:true, marktext:'还', intro:{ content:'当你下次受到伤害后,你令伤害来源弃置两张牌。', }, ai:{ threaten:0.8, }, }, }, }, //海外田豫 gzzhenxi:{ audio:'twzhenxi', trigger:{player:'useCardToPlayered'}, filter:function(event,player){ if(event.card.name!='sha') return false; if(event.target.countCards('he')||player.hasCard(function(card){ return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),event.target); },'he')||player.hasCard(function(card){ return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),event.target,false); },'he')) return true; return false; }, check:function(event,player){ return get.attitude(player,event.target)<0; }, direct:true, content:function(){ 'step 0' var target=trigger.target; event.target=target; var list=[],choiceList=[ '弃置'+get.translation(target)+'一张牌', '将一张♦非锦囊牌当做【乐不思蜀】或♣非锦囊牌当做【兵粮寸断】对'+get.translation(target)+'使用', '背水!若其有暗置的武将牌且你的武将牌均明置,你依次执行上述两项' ]; if(target.countDiscardableCards(player,'he')) list.push('选项一'); else choiceList[0]=''+choiceList[0]+''; if(player.countCards('he',function(card){ return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),target); })||player.countCards('he',function(card){ return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),target); })) list.push('选项二'); else choiceList[1]=''+choiceList[1]+''; if(target.isUnseen(2)&&!player.isUnseen(2)) list.push('背水!'); else choiceList[2]=''+choiceList[2]+''; player.chooseControl(list,'cancel2').set('prompt',get.prompt('gzzhenxi',target)).set('choiceList',choiceList).set('ai',function(){ var player=_status.event.player,trigger=_status.event.getTrigger(),list=_status.event.list; if(get.attitude(player,trigger.target)>0) return 'cancel2'; if(list.includes('背水!')) return '背水!'; if(list.includes('选项二')) return '选项二'; return '选项一'; }).set('list',list).set('hiddenSkill','gzzhenxi'); 'step 1' if(result.control=='cancel2'){ event.finish(); return; } player.logSkill('gzzhenxi',target); event.choice=result.control; if(event.choice!='选项二'&&target.countDiscardableCards(player,'he')) player.discardPlayerCard(target,'he',true); 'step 2' if(event.choice!='选项一'&&(player.hasCard(function(card){ return get.suit(card)=='diamond'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'lebu'},[card]),target); },'he')||player.hasCard(function(card){ return get.suit(card)=='club'&&get.type2(card)!='trick'&&player.canUse(get.autoViewAs({name:'bingliang'},[card]),target,false); },'he'))){ var next=game.createEvent('gzzhenxi_use'); next.player=player; next.target=target; next.setContent(lib.skill.gzzhenxi.contentx); } }, ai:{unequip_ai:true}, contentx:function(){ 'step 0' player.chooseCard({ position:'hes', forced:true, prompt:'震袭', prompt2:'将一张♦非锦囊牌当做【乐不思蜀】或♣非锦囊牌当做【兵粮寸断】对'+get.translation(target)+'使用', filterCard:function(card,player){ if(get.itemtype(card)!='card'||get.type2(card)=='trick'||!['diamond','club'].includes(get.suit(card))) return false; var cardx={name:get.suit(card)=='diamond'?'lebu':'bingliang'}; return player.canUse(get.autoViewAs(cardx,[card]),_status.event.getParent().target,false); }, }); 'step 1' if(result.bool) player.useCard({name:get.suit(result.cards[0],player)=='diamond'?'lebu':'bingliang'},target,result.cards); }, }, gzjiansu:{ init:function(player){ if(player.checkViceSkill('gzjiansu')&&!player.viceChanged) player.removeMaxHp(); }, viceSkill:true, audio:2, trigger:{ player:'gainAfter', global:'loseAsyncAfter', }, filter:function(event,player){ if(player==_status.currentPhase) return false; return event.getg(player).length; }, frequent:true, group:'gzjiansu_use', preHidden:['gzjiansu_use'], content:function(){ player.showCards(trigger.getg(player),get.translation(player)+'发动了【俭素】'); player.addGaintag(trigger.getg(player),'gzjiansu_tag'); player.markSkill('gzjiansu'); }, intro:{ mark:function(dialog,content,player){ var hs=player.getCards('h',function(card){ return card.hasGaintag('gzjiansu_tag'); }); if(hs.length) dialog.addSmall(hs); else dialog.addText('无已展示手牌'); }, content:function(content,player){ var hs=player.getCards('h',function(card){ return card.hasGaintag('gzjiansu_tag'); }); if(hs.length) return get.translation(hs); else return '无已展示手牌'; }, }, subSkill:{ use:{ audio:'gzjiansu', trigger:{player:'phaseUseBegin'}, filter:function(event,player){ var num=player.countCards('h',function(card){ return card.hasGaintag('gzjiansu_tag'); }); return num>0&&game.hasPlayer(function(current){ return current.isDamaged()&¤t.getDamagedHp()<=num; }); }, direct:true, content:function(){ 'step 0' player.chooseCardTarget({ prompt:get.prompt('gzjiansu'), prompt2:'弃置任意张“俭”,令一名体力值不大于你以此法弃置的牌数的角色回复1点体力', filterCard:function(card){ return get.itemtype(card)=='card'&&card.hasGaintag('gzjiansu_tag'); }, selectCard:[1,Infinity], filterTarget:function(card,player,target){ return target.isDamaged(); }, filterOk:function(){ return ui.selected.targets.length&&ui.selected.targets[0].hp<=ui.selected.cards.length; }, ai1:function(card){ if(ui.selected.targets.length&&ui.selected.targets[0].hp<=ui.selected.cards.length) return 0; return 6-get.value(card); }, ai2:function(target){ var player=_status.event.player; return get.recoverEffect(target,player,player); }, }).setHiddenSkill('gzjiansu_use'); 'step 1' if(result.bool){ var target=result.targets[0],cards=result.cards; player.logSkill('gzjiansu_use',target); player.discard(cards); target.recover(); } }, } }, }, //海外刘夫人 gzzhuidu:{ audio:'twzhuidu', trigger:{source:'damageBegin3'}, filter:function(event,player){ return player.isPhaseUsing(); }, check:function(event,player){ return get.attitude(player,event.player)<0; }, usable:1, logTarget:'player', content:function(){ 'step 0' var target=trigger.player; event.target=target; if(target.hasSex('female')&&target.countCards('e')>0) player.chooseToDiscard('he','追妒:是否弃置一张牌并令其执行两项?').set('ai',function(card){ return 8-get.value(card); }); else event.goto(2); 'step 1' if(result.bool){ event._result={control:'我全都要!'}; event.goto(3); } 'step 2' if(target.countCards('e')>0){ target.chooseControl().set('prompt','追妒:请选择一项').set('choiceList',[ '令'+get.translation(player)+'此次对你造成的伤害+1', '弃置装备区里的所有牌', ]).set('ai',function(){ var player=_status.event.player,cards=player.getCards('e'); if(player.hp<=2) return 1; if(get.value(cards)<=7) return 1; return 0; }); } else event._result={control:'选项一'}; 'step 3' player.line(target); if(result.control!='选项二') trigger.num++; if(result.control!='选项一') target.chooseToDiscard(target.countCards('e'),true,'e'); }, }, gzshigong:{ audio:'twshigong', trigger:{player:'dying'}, filter:function(event,player){ return _status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.isIn()&&player.hasViceCharacter()&&player.hp<=0; }, skillAnimation:true, animationColor:'gray', limited:true, logTarget:()=>_status.currentPhase, check:function(event,player){ 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; return true; }, content:function(){ 'step 0' var target=_status.currentPhase; event.target=target; player.awakenSkill('gzshigong'); var list=lib.character[player.name2][3].filter(function(skill){ return get.skillCategoriesOf(skill).length==0; }); if(!list.length){ event._result={control:'cancel2'}; event.goto(2); } else event.list=list; player.removeCharacter(1); 'step 1' target.chooseControl(event.list,'cancel2').set('choiceList',event.list.map(i=>{ return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,_status.currentPhase)+'
    '; })).set('displayIndex',false).set('ai',function(){ if(get.attitude(_status.event.player,_status.event.getParent().player)>0) return 0; return [0,1].randomGet(); }).set('prompt',get.translation(player)+'对你发动了【示恭】').set('prompt2','获得一个技能并令其将体力回复至体力上限;或点击“取消”,令其将体力值回复至1点。'); 'step 2' if(result.control=='cancel2'){ player.recover(1-player.hp); event.finish(); } else{ target.addSkills(result.control); target.line(player); player.recover(player.maxHp-player.hp); } }, }, //海外服华雄 gzyaowu:{ audio:'new_reyaowu', limited:true, trigger:{source:'damageSource'}, filter:function(event,player){ if(player.isUnseen(0)&&lib.character[player.name1][3].includes('gzyaowu')) return true; if(player.isUnseen(1)&&lib.character[player.name2][3].includes('gzyaowu')) return true; return false; }, skillAnimation:true, animationColor:'fire', check:function(event,player){ return player.isDamaged()||player.hp<=2; }, content:function(){ player.awakenSkill('gzyaowu'); player.gainMaxHp(2); player.recover(2); player.addSkill('gzyaowu_die'); }, ai:{mingzhi_no:true}, subSkill:{ die:{ audio:'new_reyaowu', trigger:{player:'dieAfter'}, filter:function(event,player){ return game.hasPlayer(function(current){ return current!=player&¤t.isFriendOf(player); }); }, forced:true, forceDie:true, charlotte:true, skillAnimation:true, animationColor:'fire', logTarget:function(event,player){ return game.filterPlayer(function(current){ return current!=player&¤t.isFriendOf(player); }); }, content:function(){ for(var target of lib.skill.gzyaowu_die.logTarget(trigger,player)) target.loseHp(); }, }, }, }, gzshiyong:{ audio:'shiyong', derivation:'gzshiyongx', trigger:{player:'damageEnd'}, filter:function(event,player){ if(!event.card) return false; if(player.awakenedSkills.includes('gzyaowu')) return event.source&&event.source.isIn()&&get.color(event.card)!='black'; return get.color(event.card)!='red'; }, forced:true, logTarget:function(event,player){ if(player.awakenedSkills.includes('gzyaowu')) return event.source; return; }, content:function(){ (lib.skill.gzshiyong.logTarget(trigger,player)||player).draw(); }, }, //海外服夏侯尚 gztanfeng:{ audio:'twtanfeng', trigger:{player:'phaseZhunbeiBegin'}, filter:function(event,player){ return game.hasPlayer(function(current){ return !current.isFriendOf(player)&¤t.countDiscardableCards('hej',player)>0; }); }, direct:true, preHidden:true, content:function(){ 'step 0' player.chooseTarget(get.prompt2('gztanfeng'),function(card,player,target){ return !target.isFriendOf(player)&&target.countDiscardableCards(player,'hej')>0; }).set('ai',function(target){ var player=_status.event.player; if(target.hp+target.countCards('hs',{name:['tao','jiu']})<=2) return 3*get.effect(target,{name:'guohe'},player,player); return get.effect(target,{name:'guohe'},player,player); }).setHiddenSkill(event.name); 'step 1' if(result.bool){ var target=result.targets[0]; event.target=target; player.logSkill('gztanfeng',target); player.discardPlayerCard(target,'hej',true); } else event.finish(); 'step 2' target.chooseBool('是否受到'+get.translation(player)+'造成的1点火焰伤害,令其跳过一个阶段?').set('ai',()=>_status.event.choice).set('choice',get.damageEffect(target,player,target)>=-5); 'step 3' if(result.bool){ player.line(target); target.damage(1,'fire'); } else event.finish(); 'step 4' var list=[]; var list2=[]; event.map={phaseJudge:'判定阶段',phaseDraw:'摸牌阶段',phaseUse:'出牌阶段',phaseDiscard:'弃牌阶段'}; for(var i of ['phaseJudge','phaseDraw','phaseUse','phaseDiscard']){ if(!player.skipList.includes(i)){ i=event.map[i]; list.push(i); if(i!='判定阶段'&&i!='弃牌阶段') list2.push(i); } } target.chooseControl(list).set('prompt','探锋:令'+get.translation(player)+'跳过一个阶段').set('ai',function(){ return _status.event.choice; }).set('choice',function(){ var att=get.attitude(target,player); var num=player.countCards('j'); if(att>0){ if(list.includes('判定阶段')&&num>0) return '判定阶段'; return '弃牌阶段'; } if(list.includes('摸牌阶段')&&player.hasJudge('lebu')) return '摸牌阶段'; if(list.includes('出牌阶段')&&player.hasJudge('bingliang')||player.needsToDiscard()>0) return '出牌阶段'; return list2.randomGet(); }()); 'step 5' for(var i in event.map){ if(event.map[i]==result.control) player.skip(i); } target.popup(result.control); target.line(player); game.log(player,'跳过了','#y'+result.control); }, }, //杨芷 gzwanyi:{ audio:'wanyi', enable:'phaseUse', filter:function(event,player){ if(player.getStorage('gzwanyi2').length>=4) return false; if(_status.mode=='yingbian') return player.hasCard(function(i){ return get.is.yingbian(i); },'hs'); return player.hasCard(function(card){ return card.hasTag('lianheng'); },'hs'); }, chooseButton:{ dialog:function(event,player){ var list=['lianjunshengyan','huoshaolianying','xietianzi','lulitongxin']; if(_status.mode=='yingbian') list=['zhujinqiyuan','chuqibuyi','shuiyanqijunx','dongzhuxianji']; list.removeArray(player.getStorage('gzwanyi2')); return ui.create.dialog('婉嫕',[list,'vcard'],'hidden'); }, filter:function(button,player){ return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); }, check:function(button){ return _status.event.player.getUseValue({name:button.link[2]}); }, backup:function(links){ return { audio:'wanyi', popname:true, viewAs:{ name:links[0][2], }, filterCard:function(card){ if(_status.mode=='yingbian') return get.is.yingbian(card); return card.hasTag('lianheng'); }, check:function(card){ return 1/Math.max(1,get.value(card)); }, position:'hs', onuse:function(links,player){ if(!player.storage.gzwanyi2) player.storage.gzwanyi2=[]; player.storage.gzwanyi2.add(links.card.name); player.addTempSkill('gzwanyi2'); }, } }, prompt:function(links){ if(_status.mode=='yingbian') return '将一张应变牌当做'+get.translation(links[0][2])+'使用'; return '将一张合纵牌当做'+get.translation(links[0][2])+'使用'; }, }, subSkill:{backup:{}}, ai:{order:8,result:{player:1}}, }, gzwanyi2:{onremove:true}, gzmaihuo:{ audio:'maihuo', limited:true, trigger:{global:'useCardToTarget'}, logTarget:'player', filter:function(event,player){ return event.card.name=='sha'&&event.target.isIn()&&event.target.isFriendOf(player); }, preHidden:true, skillAnimation:true, animationColor:'thunder', check:function(event,player){ var source=event.player,targets=event.targets,card=event.card; for(var target of targets){ if(target.hasShan()||get.effect(target,card,source,player)>=0) continue; if(player.hp<=1||target.hp<=(event.getParent().baseDamage||1)) return true; } return false; }, content:function(){ player.awakenSkill('gzmaihuo'); trigger.targets.length=0; trigger.getParent().triggeredTargets2.length=0; player.addSkill('gzmaihuo_effect'); player.markAuto('gzmaihuo_effect',[trigger.player]); trigger.player.addMark('gzmaihuo_mark',1,false); }, subSkill:{ effect:{ audio:'maihuo', trigger:{global:'phaseBegin'}, forced:true, charlotte:true, popup:false, filter:function(event,player){ return player.getStorage('gzmaihuo_effect').includes(event.player)&&event.player.canUse('sha',player,false); }, content:function(){ 'step 0' var target=trigger.player; player.unmarkAuto('gzmaihuo_effect',[target]); target.removeMark('gzmaihuo_mark',1,false); target.useCard({name:'sha',isCard:true},player,'gzmaihuo_effect',false); 'step 1' if(!player.getStorage('gzmaihuo_effect').length) player.removeSkill('gzmaihuo_effect'); }, group:'gzmaihuo_remove', }, remove:{ trigger:{player:'damageBegin2'}, forced:true, filter:function(event,player){ return event.card&&event.card.name=='sha'&&event.getParent().skill=='gzmaihuo_effect'; }, content:function(){ trigger.cancel(); player.draw(2); if(player.checkMainSkill('gzmaihuo',false)){ player.removeCharacter(0); } else if(player.checkViceSkill('gzmaihuo',false)){ player.changeVice(); } }, }, mark:{ marktext:'祸', intro:{ content:'mark', onunmark:true, }, }, }, }, //羊徽瑜 gzcaiyuan:{ audio:2, trigger:{player:'phaseJieshuBegin'}, forced:true, preHidden:true, filter:function(event,player){ var num1=player.countCards('h'),num2=num1; player.getHistory('gain',function(evt){ num2-=evt.cards.length; }); player.getHistory('lose',function(evt){ if(evt.hs) num2+=evt.hs.length; }); return num1>=num2; }, content:function(){ player.chooseDrawRecover(2,true); }, }, //左棻 gzzhaosong:{ audio:'zhaosong', enable:'phaseUse', preHidden:['gzzhaosong_dying','gzzhaosong_sha'], filter:function(event,player){ return !player.getStorage('gzzhaosong').includes('效果②')&&game.hasPlayer((current)=>lib.skill.gzzhaosong.filterTarget(null,player,current)); }, filterTarget:function(card,player,target){ return target!=player&&(target.isUnseen(2)||target.countCards('h')>0); }, promptfunc:()=>'出牌阶段,你可观看一名其他角色的所有暗置武将牌和手牌,然后可以获得其区域内的一张牌。', content:function(){ player.markAuto('gzzhaosong',['效果②']); if(target.isUnseen(2)) player.viewCharacter(target,2); if(target.countCards('hej')>0) player.gainPlayerCard(target,'hej','visible'); }, ai:{ order:11, result:{ player:function(player,target){ return get.effect(target,{name:'zhibi'},player,player)+get.effect(target,{name:'shunshou_copy'},player,player); }, }, }, group:['gzzhaosong_dying','gzzhaosong_sha'], subSkill:{ dying:{ audio:'zhaosong', trigger:{global:'dying'}, logTarget:'player', filter:function(event,player){ return !player.getStorage('gzzhaosong').includes('效果①')&&event.player.isDying()&&event.player.hp<=0; }, prompt2:'令该角色回复至2点体力并摸一张牌', check:function(event,player){ return event.player.isFriendOf(player)&&get.attitude(player,event.player)>0; }, content:function(){ player.markAuto('gzzhaosong',['效果①']); var target=trigger.player,num=2-target.hp; if(num>0) target.recover(num); target.draw(); }, }, sha:{ audio:'zhaosong', trigger:{global:'useCard2'}, direct:true, filter:function(event,player){ if(event.card.name!='sha'||player.getStorage('gzzhaosong').includes('效果③')) return false; return game.hasPlayer(function(current){ return !event.targets.includes(current)&&lib.filter.filterTarget(event.card,event.player,current); }); }, content:function(){ 'step 0' player.chooseTarget([1,2],get.prompt('gzzhaosong'),'为'+get.translation(trigger.card)+'增加至多两个目标',function(card,player,target){ var event=_status.event.getTrigger(); return !event.targets.includes(target)&&lib.filter.filterTarget(event.card,event.player,target); }).set('ai',function(target){ var event=_status.event.getTrigger(); return get.effect(target,event.card,event.player,_status.event.player); }).set('goon',game.countPlayer(function(current){ return !trigger.targets.includes(current)&&lib.filter.filterTarget(trigger.card,trigger.player,current)&&get.effect(current,trigger.card,trigger.player,player)>0; })>=Math.min(2,game.countPlayer(function(current){ return !trigger.targets.includes(current)&&lib.filter.filterTarget(trigger.card,trigger.player,current); }))).setHiddenSkill('gzzhaosong_sha'); 'step 1' if(result.bool){ if(!event.isMine()&&!event.isOnline()) game.delayx(); } else event.finish(); 'step 2' var targets=result.targets; player.markAuto('gzzhaosong',['效果③']); player.logSkill('gzzhaosong_sha',targets); trigger.targets.addArray(targets); }, }, }, }, gzlisi:{ audio:'lisi', trigger:{global:'dieAfter'}, filter:function(event,player){ return event.player.isFriendOf(player)&&player.getStorage('gzzhaosong').length>0; }, direct:true, content:function(){ 'step 0' var list=player.getStorage('gzzhaosong').slice(0); list.push('cancel2'); player.chooseControl(list).set('prompt',get.prompt('gzlisi')).set('prompt2','恢复〖诏颂〗的一个已发动的选项'); 'step 1' if(result.control!='cancel2'){ player.logSkill('gzlisi'); player.unmarkAuto('gzzhaosong',[result.control]) } }, }, //杨艳 gzxuanbei:{ audio:'xuanbei', trigger:{player:'showCharacterAfter'}, filter:function(event,player){ return !player.storage.gzxuanbei&&event.toShow.includes('gz_yangyan'); }, forced:true, locked:false, content:function(){ 'step 0' player.storage.gzxuanbei=true; var cards=[]; while(cards.length<2){ var card=get.cardPile2(function(card){ if(cards.includes(card)) return false; return card.hasTag('lianheng')||get.is.yingbian(card); }); if(!card) break; else cards.push(card); } if(cards.length) player.gain(cards,'gain2'); if(cards.length<2) player.draw(2-cards.length); 'step 1' player.addTempSkill('gzxuanbei_effect'); }, group:'gzxuanbei_change', subSkill:{ effect:{ trigger:{player:'useCard'}, forced:true, popup:false, charlotte:true, filter:function(event,player){ return get.cardtag(event.card,'lianheng'); }, content:function(){ player.draw(); }, ai:{forceYingbian:true}, mark:true, intro:{content:'使用应变牌时直接获得强化,使用合纵牌时摸一张牌。'}, }, change:{ audio:'xuanbei', trigger:{player:'die'}, direct:true, forceDie:true, skillAnimation:true, animationColor:'thunder', content:function(){ 'step 0' player.chooseTarget(get.prompt('gzxuanbei'),'令一名其他角色变更副将',lib.filter.notMe).set('forceDie',true).set('ai',function(target){ var player=_status.event.player; var rank=get.guozhanRank(target.name2,target)<=3; var att=get.attitude(player,target); if(att>0){ return (4-rank)*att; } return -(rank-6)*att; }); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('gzxuanbei_change',target); game.delayx(); target.changeVice(); } }, }, }, }, //司马师 gzyimie:{ audio:'yimie', inherit:'yimie', init:function(player){ if(player.checkMainSkill('gzyimie')){ player.removeMaxHp(2); } }, }, gztairan:{ audio:'tairan', trigger:{player:'phaseUseBegin'}, check:function(event,player){ return player.isDamaged()&&player.hasCard(function(card){ return 5.5-get.value(card); },'he'); }, content:function(){ 'step 0' var list=[],num=0; if(player.isHealthy()||!player.hasCard(function(card){ return lib.filter.cardDiscardable(card,player,'gztairan'); },'he')) num=1; event.num=num; for(var i=num;i<=player.hp;i++){ list.push(i+'点'); } player.chooseControl(list).set('prompt','###请先失去任意点体力###此回合结束时,你将恢复等量的体力'); 'step 1' var num1=result.index+num; event.num1=num1; if(num1>0) player.loseHp(num1); 'step 2' if(player.isDamaged()&&player.hasCard(function(card){ return lib.filter.cardDiscardable(card,player,'gztairan') },'he')){ var next=player.chooseToDiscard('he',[1,player.getDamagedHp()],'然后请弃置任意张牌','此回合结束时,你将摸等量的牌。').set('ai',function(card){ return 5.5-get.value(card); }); if(event.num1==0) next.set('forced',true); } 'step 3' var num2=0; if(result.bool) num2=result.cards.length; var storage=[event.num1,num2]; player.addTempSkill('gztairan_effect'); player.storage.gztairan_effect=storage; }, subSkill:{ effect:{ audio:'tairan', trigger:{player:'phaseEnd'}, filter:function(event,player){ var storage=player.storage.gztairan_effect; return storage&&storage.length==2&&(storage[1]>0||player.isDamaged()); }, forced:true, charlotte:true, onremove:true, content:function(){ var storage=player.storage.gztairan_effect; if(storage[0]>0) player.recover(storage[0]); if(storage[1]>0) player.draw(storage[1]); }, }, }, }, //杜预 gzsanchen:{ audio:'sanchen', enable:'phaseUse', filter(event,player){ var stat=player.getStat('sanchen'); return game.hasPlayer(function(current){ return (!stat||!stat.includes(current)); }); }, filterTarget(card,player,target){ var stat=player.getStat('sanchen'); return (!stat||!stat.includes(target)); }, usable:1, content(){ 'step 0' if(!player._fakesanchen){ player._fakesanchen=true; player.when({global:'phaseAfter'}) .then(()=>{ delete player._fakesanchen; if(player.hasMark('gzsanchen')){ player.removeMark('gzsanchen',player.countMark('gzsanchen'),false); } }); } var stat=player.getStat(); if(!stat.sanchen) stat.sanchen=[]; stat.sanchen.push(target); target.draw(3); 'step 1' if(!target.countCards('he')) event.finish(); else target.chooseToDiscard('he',true,3).set('ai',function(card){ var list=ui.selected.cards.map(function(i){ return get.type2(i); }); if(!list.includes(get.type2(card))) return 7-get.value(card); return -get.value(card); }); 'step 2' if(result.bool&&result.cards&&result.cards.length){ var list=[]; for(var i of result.cards) list.add(get.type2(i)); if(list.length==result.cards.length){ target.draw(); player.getStat('skill').gzsanchen--; player.addMark('gzsanchen',1,false); } } else{ target.draw(); player.getStat('skill').gzsanchen--; player.addMark('gzsanchen',1,false); } }, ai:{ order:9, threaten:1.7, result:{ target(player,target){ if(target.hasSkillTag('nogain')) return 0.1; return Math.sqrt(target.countCards('he')); }, }, }, marktext:'陈', intro:{ name2:'陈', content:'mark', }, }, gzpozhu:{ audio:'pozhu', enable:'phaseUse', mainSkill:true, init(player){ if(player.checkMainSkill('gzpozhu')) player.removeMaxHp(); }, viewAsFilter(player){ return !player.hasSkill('pozhu3',null,null,false)&&player.countMark('gzsanchen')>0&&player.countCards('hs')>0; }, viewAs:{name:'chuqibuyi'}, filterCard:true, position:'hs', check(card){ return 7-get.value(card); }, onuse(result,player){ player.removeMark('gzsanchen',1,false); }, }, //钟琰 gzbolan:{ audio:'bolan', global:'gzbolan_global', enable:'phaseUse', usable:1, content:function(){ 'step 0' if((event.num&&event.num>0)||!_status.characterlist.length){ event.finish(); return; } var character=_status.characterlist.randomGet(); var groups,double=get.is.double(character,true); if(double) groups=double.slice(0); else groups=[lib.character[character][1]]; event.groups=groups; event.videoId=lib.status.videoId++; game.broadcastAll(function(player,id,character){ ui.create.dialog(get.translation(player)+'发动了【博览】',[[character],'character']).videoId=id; },player,event.videoId,character); game.delay(3); 'step 1' game.broadcastAll('closeDialog',event.videoId); var list1=['wei','shu','wu','qun','jin'],list2=['gzqice','tiaoxin','gzzhiheng','new_chuli','gzsanchen']; var skills=[]; for(var i=0;i0) return 3; if(player.isHealthy()) return 1; return -1; }, }, }, }, }, }, //司马昭 gzchoufa:{ 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'); } }, }, //张春华 gzhuishi:{ audio:2, trigger:{player:'phaseDrawBegin1'}, filter:function(event,player){ return ui.discardPile.childNodes.length>0; }, preHidden:true, prompt:function(){ return get.prompt('huishi')+'(可观看牌数:'+lib.skill.gzhuishi.getNum()+')'; }, check:function(event,player){ return lib.skill.gzhuishi.getNum()>3; }, getNum:function(){ var list=[]; list.push(ui.discardPile.lastChild); if(list[0].previousSibling) list.push(list[0].previousSibling); var num=0; for(var i of list){ var name=get.translation(i.name); if(name=='挟令') name='挟天子以令诸侯'; num+=name.length; } return num; }, content:function(){ 'step 0' trigger.changeToZero(); var cards=game.cardsGotoOrdering(get.cards(lib.skill.gzhuishi.getNum())).cards; var num=Math.ceil(cards.length/2); var next=player.chooseToMove('慧识:将'+get.cnNumber(num)+'张牌置于牌堆底并获得其余的牌',true); next.set('list',[ ['牌堆顶的展示牌',cards], ['牌堆底'], ]); next.set('filterMove',function(from,to,moved){ if(moved[0].includes(from)&&to==1) return moved[1].length<_status.event.num; return true; }); next.set('filterOk',function(moved){ return moved[1].length==_status.event.num; }); next.set('num',num); next.set('processAI',function(list){ var cards=list[0][1].slice(0).sort(function(a,b){ return get.value(b)-get.useful(a); }); return [cards,cards.splice(cards.length-_status.event.num)]; }); 'step 1' if(result.bool){ var list=result.moved; if(list[0].length) player.gain(list[0],'gain2'); while(list[1].length) ui.cardPile.appendChild(list[1].shift().fix()); } }, }, gzqingleng:{ audio:2, trigger:{global:'phaseEnd'}, direct:true, preHidden:true, filter:function(event,player){ var target=event.player; return target!=player&&target.isIn()&&target.isUnseen(2)&&player.countCards('he')>0&&player.canUse({name:'sha',nature:'ice'},target,false); }, content:function(){ 'step 0' player.chooseCard('he',get.prompt('gzqingleng',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,'gzqingleng'); if(trigger.player.isUnseen()){ player.draw(); } } }, }, //司马懿 gzquanbian:{ audio:'quanbian', preHidden:true, trigger:{player:['useCard','respond']}, filter:function(event,player){ if(player.hasSkill('gzquanbian_blocker')) return false; 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(player.maxHp); for(var i=cards.length-1;i>=0;i--){ ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); } game.updateRoundNumber(); player.chooseButton(['权变:选择获得一张牌',cards],true).set('ai',function(button){ var player=_status.event.player,card=button.link; var suit=get.suit(card,false),val=get.value(card); if(player.hasHistory('useCard',function(evt){ return get.suit(evt.card,false)==suit; })||player.hasHistory('respond',function(evt){ return get.suit(evt.card,false)==suit; })) return val; return val+8; }); 'step 1' if(result.bool){ var card=result.links[0]; player.gain(card,'gain2'); var suit=get.suit(card,false); if(player.hasHistory('useCard',function(evt){ return get.suit(evt.card,false)==suit; })||player.hasHistory('respond',function(evt){ return get.suit(evt.card,false)==suit; })) player.addTempSkill('gzquanbian_blocker'); } }, subSkill:{blocker:{charlotte:true}}, }, gzxiongzhi:{ audio:'xiongzhi', enable:'phaseUse', limited:true, skillAnimation:true, animationColor:'thunder', content:function(){ 'step 0' player.awakenSkill('gzxiongzhi'); event.cards=game.cardsGotoOrdering(get.cards(player.maxHp)).cards.slice(0); 'step 1' var card=cards.shift(); event.card=card; player.showCards(card); if(!player.hasUseTarget(card)){ if(cards.length>0) event.redo(); else event.finish(); } 'step 2' var next=player.chooseUseTarget(card,true); if(get.info(card).updateUsable=='phaseUse') next.addCount=false; 'step 3' if(result.bool&&cards.length>0) event.goto(1); }, ai:{ order:1, result:{ player:function(player){ if(!player.hasSkill('smyyingshi')) return 1; var cards=[]; for(var i=0;i0; }, logTarget:'player', content:function(){ player.discardPlayerCard(trigger.player,true,'he'); }, }, gzmingfa:{ audio:'dcmingfa', enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ return player!=target&&target.isEnemyOf(player); }, content:function(){ player.markAuto('gzmingfa',targets); game.delayx(); }, onremove:true, ai:{ order:1, result:{target:-1}, }, group:'gzmingfa_effect', subSkill:{ effect:{ audio:'dcmingfa', trigger:{global:'phaseEnd'}, forced:true, filter:function(event,player){ return player.getStorage('gzmingfa').includes(event.player); }, logTarget:'player', content:function(){ var target=trigger.player; player.unmarkAuto('gzmingfa',[target]); if(target.isIn()){ var num=player.countCards('h')-target.countCards('h'); if(num>0){ target.damage(); player.gainPlayerCard(target,true,'h'); } else if(num<0){ player.draw(Math.min(5,-num)); } } }, }, }, }, //海外服国战 //杨修 gzdanlao:{ audio:'danlao', inherit:'danlao', preHidden:true, filter:function(event,player){ return get.type(event.card)=='trick'&&event.targets&&event.targets.length>1; }, }, gzjilei:{ inherit:'jilei', preHidden:true, 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).setHiddenSkill('gzjilei'); 'step 1' if(result.control!='cancel2'){ player.logSkill('gzjilei',trigger.source); player.chat(get.translation(result.control)+'牌'); game.log(player,'声明了','#y'+get.translation(result.control)+'牌'); trigger.source.addTempSkill('jilei2'); trigger.source.storage.jilei2.add(result.control); trigger.source.updateMarks('jilei2'); game.delayx(); } }, }, //诸葛瑾 gzhuanshi:{ audio:'huanshi', trigger:{global:'judge'}, direct:true, preHidden:true, filter:function(event,player){ return player.countCards('hes')>0&&event.player.isFriendOf(player); }, content:function(){ "step 0" player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+ get.translation(trigger.player.judging[0])+','+get.prompt('gzhuanshi'),'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]).setHiddenSkill('gzhuanshi'); "step 1" if(result.bool){ player.respond(result.cards,'gzhuanshi','highlight','noOrdering'); } else{ event.finish(); } "step 2" if(result.bool){ if(trigger.player.judging[0].clone){ trigger.player.judging[0].clone.classList.remove('thrownhighlight'); game.broadcast(function(card){ if(card.clone){ card.clone.classList.remove('thrownhighlight'); } },trigger.player.judging[0]); game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone])); } game.cardsDiscard(trigger.player.judging[0]); trigger.player.judging[0]=result.cards[0]; trigger.orderingCards.addArray(result.cards); game.log(trigger.player,'的判定牌改为',result.cards[0]); game.delay(2); } }, ai:{ rejudge:true, tag:{ rejudge:1, } } }, gzhongyuan:{ audio:'hongyuan', enable:'phaseUse', usable:1, filter:function(event,player){ return player.hasCard(function(card){ return lib.skill.gzhongyuan.filterCard(card); },'h'); }, filterCard:function(card){ return !card.hasTag('lianheng')&&!card.hasGaintag('_lianheng'); }, position:'h', discard:false, lose:false, content:function(){ cards[0].addGaintag('_lianheng'); player.addTempSkill('gzhongyuan_clear') }, check:function(card){ return 4.5-get.value(card); }, group:'gzhongyuan_draw', preHidden:true, ai:{order:2,result:{player:1}}, subSkill:{ clear:{ charlotte:true, onremove:function(player){ player.removeGaintag('_lianheng'); }, }, draw:{ audio:'hongyuan', trigger:{player:'drawBefore'}, direct:true, filter:function(event,player){ return event.getParent().name=='_lianheng'&&game.hasPlayer(function(current){ return current!=player&¤t.isFriendOf(player); }); }, content:function(){ 'step 0' player.chooseTarget(get.prompt('gzhongyuan'),'将摸牌('+get.cnNumber(trigger.num)+'张)转移给一名同势力角色',function(card,player,target){ return target!=player&&target.isFriendOf(player); }).setHiddenSkill('gzhongyuan').set('ai',()=>-1); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('gzhongyuan',target); trigger.cancel(); target.draw(trigger.num); } }, }, }, }, gzmingzhe:{ audio:'mingzhe', trigger:{ player:['loseAfter','useCard','respond'], global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, filter:function(event,player){ if(player==_status.currentPhase) return false; if(event.name=='useCard'||event.name=='respond'){ return get.color(event.card,false)=='red'&&player.hasHistory('lose',function(evt){ return evt.getParent()==event&&evt.hs&&evt.hs.length>0; }); } var evt=event.getl(player); if(!evt||!evt.es||!evt.es.length) return false; for(var i of evt.es){ if(get.color(i,player)=='red') return true; } return false; }, frequent:true, preHidden:true, content:function(){ player.draw(); }, }, //廖化 gzdangxian:{ trigger:{player:'phaseBegin'}, forced:true, preHidden:true, audio:'dangxian', audioname:['guansuo'], content:function(){ var next=player.phaseUse(); event.next.remove(next); trigger.next.push(next); }, group:'gzdangxian_show', subSkill:{ show:{ audio:'dangxian', trigger:{player:'showCharacterAfter'}, forced:true, filter:function(event,player){ return event.toShow.includes('gz_liaohua')&&!player.storage.gzdangxian_draw; }, content:function(){ player.storage.gzdangxian_draw=true; player.addMark('xianqu_mark',1) }, }, }, }, //新国标2022 //许褚 gzluoyi:{ audio:'luoyi', trigger:{player:'phaseDrawEnd'}, direct:true, preHidden:true, filter:function(event,player){ return player.countCards('he')>0; }, content:function(){ 'step 0' player.chooseToDiscard('he',get.prompt2('gzluoyi')).setHiddenSkill('gzluoyi').set('ai',function(card){ var player=_status.event.player; if(player.hasCard(function(cardx){ if(cardx==card) return false; return (cardx.name=='sha'||cardx.name=='juedou')&&player.hasValueTarget(cardx,null,true); },'hs')) return 5-get.value(card); return -get.value(card); }).logSkill='gzluoyi'; 'step 1' if(result.bool) player.addTempSkill('gzluoyi_buff') }, subSkill:{ buff:{ audio:'luoyi', charlotte:true, forced:true, trigger:{source:'damageBegin1'}, filter:function(event,player){ return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.getParent().type=='card'; }, content:function(){ trigger.num++; }, }, }, }, //典韦 gzqiangxi:{ audio:'qiangxi', inherit:'qiangxi', filterTarget:function(card,player,target){ return target!=player; }, }, //小乔 gztianxiang:{ audio:'tianxiang', audioname:['daxiaoqiao','re_xiaoqiao','ol_xiaoqiao'], trigger:{player:'damageBegin4'}, direct:true, preHidden:true, usable:1, 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('gztianxiang'), prompt2:lib.translate.gztianxiang_info }).setHiddenSkill(event.name); "step 1" if(result.bool){ player.discard(result.cards); var target=result.targets[0]; player.chooseControlList(true,function(event,player){ var target=_status.event.target; var att=get.attitude(player,target); if(target.hasSkillTag('maihp')) att=-att; if(att>0){ return 0; } else{ return 1; } }, ['令'+get.translation(target)+'受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)', '令'+get.translation(target)+'失去1点体力,然后获得'+get.translation(result.cards)]).set('target',target); player.logSkill(event.name,target); trigger.cancel(); event.target=target; event.card=result.cards[0]; } else{ player.storage.counttrigger.gztianxiang--; event.finish(); } "step 2" if(typeof result.index=='number'){ event.index=result.index; if(result.index){ event.related=event.target.loseHp(); } else{ event.related=event.target.damage(trigger.source||'nosource','nocard'); } } else event.finish(); "step 3" //if(event.related.cancelled||target.isDead()) return; if(event.index&&card.isInPile()) target.gain(card,'gain2'); else if(target.getDamagedHp()) target.draw(Math.min(5,target.getDamagedHp())); }, ai:{ maixie_defend:true, effect:{ target:function(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return; if(get.tag(card,'damage')&&target.countCards('he')>1) return 0.7; } }, } }, gzhongyan:{ mod:{ suit:function(card,suit){ if(suit=='spade') return 'heart'; }, maxHandcard:function(player,num){ if(player.hasCard(function(card){ return get.suit(card,player)=='heart'; },'e')) return num+1; }, } }, //黄忠 gzliegong:{ audio:'liegong', locked:false, mod:{ targetInRange:function(card,player,target){ if(card.name=='sha'&&target.countCards('h')0) return 2; return target.mayHaveShan(player,'use',target.getCards('h',i=>{ return i.hasGaintag('sha_notshan'); }))?1:0; }); 'step 1' if(result.control!='cancel2'){ var target=trigger.target; player.logSkill('gzliegong',target); if(result.index==1){ game.log(trigger.card,'不可被',target,'响应'); trigger.directHit.add(target); } else { game.log(trigger.card,'对',target,'的伤害+1'); var map=trigger.getParent().customArgs,id=target.playerid; if(!map[id]) map[id]={}; if(!map[id].extraDamage) map[id].extraDamage=0; map[id].extraDamage++; } } }, }, //潘凤 gzkuangfu:{ audio:'kuangfu', trigger:{player:'useCardToPlayered'}, shaRelated:true, preHidden:true, logTarget:'target', filter:function(event,player){ return event.card.name=='sha'&&player.isPhaseUsing()&&!player.hasSkill('gzkuangfu_extra')&&event.target.countGainableCards(player,'e')>0; }, check:function(event,player){ if(get.attitude(player,event.target)>0||!event.target.hasCard(function(card){ return lib.filter.canBeGained(card,player,event.target)&&get.value(card,event.target)>0; },'e')) return false; return true; }, content:function(){ trigger.getParent()._gzkuangfued=true; player.gainPlayerCard(trigger.target,'e',true); player.addTempSkill('gzkuangfu_extra','phaseUseAfter'); }, subSkill:{ extra:{ trigger:{player:'useCardAfter'}, charlotte:true, forced:true, filter:function(event,player){ return event._gzkuangfued&&!player.hasHistory('sourceDamage',function(evt){ return evt.card&&event.card; })&&player.countCards('h')>0; }, content:function(){ player.chooseToDiscard('h',2,true); }, }, }, }, //吕布 gzwushuang:{ shaRelated:true, audio:'wushuang', audioname:['re_lvbu','shen_lvbu','lvlingqi'], forced:true, locked:true, group:['wushuang1','wushuang2'], preHidden:['wushuang1','wushuang2','gzwushuang'], trigger:{player:'useCard1'}, direct:true, filter:function(event,player){ if(event.card.name!='juedou'||!event.card.isCard) return false; if(event.targets){ 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 num=game.countPlayer(function(current){ return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(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); }).set('ai',function(target){ var player=_status.event.player; var card=_status.event.getTrigger().card; return get.effect(target,card,player,player); }).setHiddenSkill('gzwushuang'); '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('gzwushuang',targets); trigger.targets.addArray(targets); }, }, //夏侯渊 gzshensu:{ audio:'shensu1', audioname:['xiahouba','re_xiahouyuan','ol_xiahouyuan'], group:['shensu1','shensu2'], preHidden:['shensu1','shensu2','gzshensu'], trigger:{player:'phaseDiscardBegin'}, direct:true, filter:function(event,player){ return player.hp>0; }, content:function(){ 'step 0' player.chooseTarget(get.prompt('gzshensu'),'失去1点体力并跳过弃牌阶段,视为对一名其他角色使用使用一张无距离限制的【杀】',function(card,player,target){ return player.canUse('sha',target,false); }).setHiddenSkill('gzshensu').set('goon',player.needsToDiscard()).set('ai',function(target){ var player=_status.event.player; if(!_status.event.goon||player.hp<=target.hp) return false; return get.effect(target,{name:'sha',isCard:true},player,player); }); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('gzshensu',target); player.loseHp(); trigger.cancel(); player.useCard({name:'sha',isCard:true},target,false); } }, }, //吕玲绮 gzshenwei:{ audio:'llqshenwei', mainSkill:true, init:function(player){ if(player.checkMainSkill('gzshenwei')){ player.removeMaxHp(); } }, trigger:{player:'phaseDrawBegin2'}, forced:true, filter:(event,player)=>!event.numFixed&&player.isMaxHandcard(), preHidden:true, content:function(){ trigger.num+=2; }, mod:{ maxHandcard:(player,num)=>num+2, }, }, gzzhuangrong:{ audio:'zhuangrong', enable:'phaseUse', usable:1, filter:function(event,player){ return !player.hasSkill('gzwushuang')&&player.hasCard(function(card){ return get.type2(card,player)=='trick'; },'h'); }, filterCard:function(card,player){ return get.type2(card,player)=='trick'; }, content:function(){ player.addTempSkill('gzwushuang','phaseUseEnd'); }, derivation:'gzwushuang', }, //荀谌 gzfenglve:{ audio:'refenglve', derivation:'gzfenglve_zongheng', 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'); }); }, filterTarget:function(card,player,target){ return target!=player&&target.countCards('h')>0&&!target.hasSkillTag('noCompareTarget'); }, content:function(){ 'step 0' player.chooseToCompare(target); 'step 1' if(result.bool){ if(!target.countCards('hej')) event.goto(3); else{ event.giver=target; event.gainner=player; target.choosePlayerCard(target,true,'hej',2,'交给'+get.translation(player)+'两张牌'); } } else if(result.tie){ event.goto(3); } else{ if(!player.countCards('he')) event.goto(3); else{ event.giver=player; event.gainner=target; player.chooseCard(true,'he','交给'+get.translation(target)+'一张牌'); } } 'step 2' if(result.bool) event.giver.give(result.cards,event.gainner,'giveAuto'); 'step 3' if(target.isIn()) player.chooseBool('纵横:是否令'+get.translation(target)+'获得【锋略】?').set('ai',function(){ var evt=_status.event.getParent(); return get.attitude(evt.player,evt.target)>0; }); else event.finish(); 'step 4' if(result.bool){ target.addTempSkill('gzfenglve_zongheng',{player:'phaseEnd'}); game.log(player,'发起了','#y纵横',',令',target,'获得了技能','#g【锋略】'); } }, 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>=10; } if(val<=6){ return card.number>=13; } return false; })) return 0; return -Math.sqrt(1+target.countCards('he'))/(1+target.countCards('j')); }, }, }, }, gzfenglve_zongheng:{ inherit:'gzfenglve', 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','交给'+get.translation(player)+'一张牌'); } } else if(result.tie){ event.finish(); } else{ if(!player.countCards('he')) event.finish(); else{ event.giver=player; event.gainner=target; player.chooseCard(true,'he',2,'交给'+get.translation(target)+'两张牌'); } } 'step 2' if(result.bool) event.giver.give(result.cards,event.gainner,'giveAuto'); }, 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>=12; } if(val<=6){ return card.number>=13; } return false; })) return 0; return -Math.sqrt(1+target.countCards('he'))/(1+target.countCards('j')); }, }, }, }, gzanyong:{ audio:'anyong', trigger:{global:'damageBegin1'}, usable:1, filter:function(event,player){ return event.source&&event.player!=event.source&& event.source.isFriendOf(player)&&event.player.isIn(); }, check:function(event,player){ if(get.attitude(player,event.player)>0) return false; if(event.player.hasSkillTag('filterDamage',null,{ player:event.source, card:event.card, })) return false; if(event.player.isUnseen()) return true; if(event.player.hp>event.num&&event.player.hp<=event.num*2) return player.hp>1||event.player.isUnseen(2); return false; }, logTarget:'player', preHidden:true, content:function(){ trigger.num*=2; if(!trigger.player.isUnseen(2)){ player.loseHp(); player.removeSkill('gzanyong'); } else if(!trigger.player.isUnseen()){ player.chooseToDiscard('h',2,true); } }, }, //周夷 gzzhukou:{ audio:'zhukou', trigger:{source:'damageSource'}, preHidden:true, 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(Math.min(player.getHistory('useCard').length,5)); }, }, gzduannian:{ audio:2, trigger:{player:'phaseUseEnd'}, preHidden:true, filter:function(event,player){ return player.countCards('h')>0&&!player.hasCard(function(card){ return !lib.filter.cardDiscardable(card,player,'gzduannian'); },'h'); }, check:function(event,player){ return player.countCards('h',function(card){ return get.value(card)>=6; })<=Math.max(1,player.countCards('h')/2); }, content:function(){ 'step 0' var cards=player.getCards('h',function(card){ return lib.filter.cardDiscardable(card,player,'gzduannian'); }); if(cards.length){ player.discard(cards); } else event.finish(); 'step 1' player.drawTo(Math.min(5,player.maxHp)); }, }, gzlianyou:{ trigger:{player:'die'}, direct:true, forceDie:true, skillAnimation:true, animationColor:'fire', content:function(){ 'step 0' player.chooseTarget(lib.filter.notMe,get.prompt('gzlianyou'),'令一名其他角色获得〖兴火〗').set('forceDie',true).set('ai',function(target){ return 10+(get.attitude(_status.event.player,target)*(target.hasSkillTag('fireAttack',null,null,true)?2:1)); }); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('gzlianyou',target); target.addSkills('gzxinghuo'); game.delayx(); } }, derivation:'gzxinghuo', }, gzxinghuo:{ trigger:{source:'damageBegin1'}, forced:true, filter:function(event){ return event.hasNature('fire'); }, content:function(){ trigger.num++; }, }, //南华老仙 gzgongxiu:{ audio:'gongxiu', trigger:{player:'phaseDrawBegin2'}, preHidden:true, filter:function(event,player){ return !event.numFixed&&event.num>0&&player.maxHp>0; }, content:function(){ trigger.num--; player.addTempSkill('gzgongxiu2','phaseDrawAfter'); }, }, gzgongxiu2:{ trigger:{player:'phaseDrawEnd'}, forced:true, charlotte:true, popup:false, content:function(){ 'step 0' var str='令至多'+get.cnNumber(player.maxHp)+'名角色'; if(typeof player.storage.gzgongxiu!='number'){ player.chooseControl().set('choiceList',[ str+'各摸一张牌', str+'各弃置一张牌', ]); } else event._result={index:1-player.storage.gzgongxiu}; 'step 1' var num=result.index; event.index=num; player.storage.gzgongxiu=num; player.chooseTarget(true,[1,player.maxHp],'选择至多'+get.cnNumber(player.maxHp)+'名角色各'+(num?'弃置':'摸')+'一张牌').set('goon',event.index?-1:1).set('ai',function(target){ var evt=_status.event; return evt.goon*get.attitude(evt.player,target); }); 'step 2' if(result.bool){ var targets=result.targets.sortBySeat(); player.line(targets,'green'); if(event.index==0) game.asyncDraw(targets); else{ for(var i of targets) i.chooseToDiscard('he',true); event.finish(); } } 'step 3' game.delayx(); }, }, gzjinghe:{ audio:'jinghe', enable:'phaseUse', filter:function(event,player){ return player.maxHp>0&&player.countCards('h')>0&&!player.hasSkill('gzjinghe_clear'); }, selectCard:function(){ var max=_status.event.player.maxHp; if(ui.selected.targets.length) return [ui.selected.targets.length,max]; return [1,max]; }, selectTarget:function(){ return ui.selected.cards.length; }, filterTarget:function(card,player,target){ return !target.isUnseen(); }, 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; }, position:'h', check:function(card){ var player=_status.event.player; if(game.countPlayer(function(current){ return get.attitude(player,current)>0&&!current.isUnseen(); })>ui.selected.cards.length) return get.position(card)=='e'?2:1; return 0; }, 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.gzjinghe.derivation.randomGets(targets.length); player.addTempSkill('gzjinghe_clear',{player:'phaseBegin'}); event.targets.sortBySeat(); event.num=0; 'step 1' event.target=targets[num]; event.num++; event.target.chooseControl(event.skills,'cancel2').set('choiceList',event.skills.map(function(i){ return '
    【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
    '+get.skillInfoTranslation(i,player)+'
    '; })).set('displayIndex',false).set('prompt','选择获得一个技能'); 'step 2' var skill=result.control; if(skill!='cancel2'){ event.skills.remove(skill); target.addAdditionalSkills('gzjinghe_'+player.playerid,skill); target.popup(skill); } if(event.num0&&player.countCards('he')>0; }, direct:true, content:function(){ 'step 0' var num=Math.min(player.getStorage('gzshilu').length,player.countCards('he')); player.chooseToDiscard('he',get.prompt('gzshilu'),'弃置至多'+get.cnNumber(num)+'张牌并摸等量的牌',[1,num]).logSkill='gzshilu'; 'step 1' if(result.bool&&result.cards&&result.cards.length) player.draw(result.cards.length); }, }, }, }, gzxiongnve:{ audio:2, trigger:{player:'phaseUseBegin'}, direct:true, filter:function(event,player){ return player.getStorage('gzshilu').length>0; }, content:function(){ 'step 0' player.chooseButton([get.prompt('gzxiongnve'),[player.storage.gzshilu,'character']]).set('ai',function(button){ if(!_status.event.goon) return 0; var name=button.link,group=get.is.double(name,true); if(!group) group=[lib.character[name][1]]; for(var i of group){ if(game.hasPlayer(function(current){ return player.inRange(current)&¤t.identity==i; })) return 1+Math.random(); } return 0; }).set('goon',player.countCards('hs',function(card){ return get.tag(card,'damage')&&player.hasValueTarget(card); })>1); 'step 1' if(result.bool){ player.logSkill('gzxiongnve'); lib.skill.gzxiongnve.throwCharacter(player,result.links); game.delayx(); var group=get.is.double(result.links[0],true); if(!group) group=[lib.character[result.links[0]][1]]; event.group=group; var str=get.translation(group); player.chooseControl().set('prompt','选择获得一项效果').set('choiceList',[ '本回合对'+str+'势力的角色造成的伤害+1', '本回合对'+str+'势力的角色造成伤害后,获得对方的一张牌', '本回合对'+str+'势力的角色使用牌没有次数限制', ]).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='gzxiongnve_effect'+result.index; player.markAuto(skill,event.group); player.addTempSkill(skill); game.log(player,'本回合对'+get.translation(event.group)+'势力的角色','#g'+lib.skill[skill].promptx) }, group:'gzxiongnve_end', throwCharacter:function(player,list){ player.unmarkAuto('gzshilu',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; }, logTarget:'player', content:function(){ player.gainPlayerCard(trigger.player,true,'he'); } }, effect2:{ promptx:'使用牌没有次数限制', charlotte:true, onremove:true, intro:{ content:'对$势力的角色使用牌没有次数限制', }, mod:{ cardUsableTarget:function(card,player,target){ if(player.getStorage('gzxiongnve_effect2').includes(target.identity)) return true; }, }, }, effect3:{ charlotte:true, audio:'gzxiongnve', mark:true, intro:{ content:'其他角色对你造成伤害时,此伤害-1', }, trigger:{player:'damageBegin3'}, filter:function(event,player){ return event.source&&event.source!=player; }, forced:true, logTarget:'source', content:function(){ trigger.num--; }, ai:{ effect:{ target:function(card,player,target){ if(target==player) return; 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('gzshilu').length>1; }, content:function(){ 'step 0' player.chooseButton(['是否移去两张“戮”获得减伤?',[player.storage.gzshilu,'character']],2).set('ai',function(button){ var name=button.link,group=get.is.double(name,true); if(!group) group=[lib.character[name][1]]; for(var i of group){ if(game.hasPlayer(function(current){ return current.identity==i; })) return 0; } return 1; }); 'step 1' if(result.bool){ player.logSkill('gzxiongnve'); lib.skill.gzxiongnve.throwCharacter(player,result.links); player.addTempSkill('gzxiongnve_effect3',{player:'phaseBegin'}); game.delayx(); } }, }, }, }, //邓芝 gzjianliang:{ audio:2, trigger:{player:'phaseDrawBegin2'}, frequent:true, preHidden:true, filter:function(event,player){ return player.isMinHandcard(); }, logTarget:function(event,player){ var isFriend; if(player.identity=='unknown'){ var group='shu'; if(!player.wontYe('shu')) group=null; isFriend=function(current){ return current==player||current.identity==group; } } else isFriend=function(target){ return target.isFriendOf(player); }; return game.filterPlayer(isFriend); }, content:function(){ 'step 0' var list=game.filterPlayer(function(current){ return current.isFriendOf(player); }); if(list.length==1){ list[0].draw(); event.finish(); } else game.asyncDraw(list); 'step 1' game.delayx(); }, }, gzweimeng:{ audio:2, enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ return target!=player&&target.countGainableCards(player,'h')>0; }, content:function(){ 'step 0' player.gainPlayerCard(target,'h',true,event.name=='gzweimeng'?[1,player.hp]:1); 'step 1' if(result.bool&&target.isIn()){ var num=result.cards.length,hs=player.getCards('he'); if(!hs.length) event.goto(3); else if(hs.length<=num) event._result={bool:true,cards:hs}; else player.chooseCard('he',true,'选择交给'+get.translation(target)+get.cnNumber(num)+'张牌',num); } else event.goto(3); 'step 2' player.give(result.cards,target); 'step 3' if(target.isIn()&&event.name=='gzweimeng') player.chooseBool('纵横:是否令'+get.translation(target)+'获得【危盟】?').set('ai',function(){ var evt=_status.event.getParent(); return get.attitude(evt.player,evt.target)>0; }); else event.finish(); 'step 4' if(result.bool){ target.addTempSkill('gzweimeng_zongheng',{player:'phaseEnd'}); game.log(player,'发起了','#y纵横',',令',target,'获得了技能','#g【危盟】'); } }, derivation:'gzweimeng_zongheng', subSkill:{ zongheng:{ inherit:'gzweimeng', ai:{ order:6, tag:{ lose:1, loseCard:1, gain:1, }, result:{ target:-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; }, }, }, }, //邹氏 huoshui:{ audio:2, forced:true, global:'huoshui_mingzhi', trigger:{player:'useCardToTargeted'}, preHidden:true, filter:function(event,player){ return (event.card.name=='sha'||event.card.name=='wanjian')&&event.target.isUnseen(2)&&event.target.isEnemyOf(player); }, logTarget:'target', content:function(){ var target=trigger.target; target.addTempSkill('huoshui_norespond'); target.markAuto('huoshui_norespond',[trigger.card]); }, }, huoshui_norespond:{ charlotte:true, trigger:{global:'useCardEnd'}, onremove:true, forced:true, popup:false, silent:true, firstDo:true, filter:function(event,player){ return player.getStorage('huoshui_norespond').includes(event.card); }, content:function(){ player.unmarkAuto('huoshui_norespond',[trigger.card]); if(!player.storage.huoshui_norespond.length) player.removeSkill('huoshui_norespond'); }, mod:{ cardEnabled:function(card){ if(card.name=='shan') return false; }, cardRespondable:function(card){ if(card.name=='shan') return false; }, }, }, huoshui_mingzhi:{ ai:{ nomingzhi:true, skillTagFilter:function(player){ if(_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('huoshui')){ return true; } return false; } } }, qingcheng:{ audio:2, }, qingcheng_ai:{ ai:{ effect:{ target:function(card){ if(get.tag(card,'damage')) return 2; } } } }, //朱灵 gzjuejue:{ audio:2, trigger:{player:'phaseDiscardBegin'}, check:function(event,player){ return player.hp>2&&player.needsToDiscard()>0&&game.countPlayer(function(current){ return get.attitude(current,player)<=0; })>game.countPlayer()/2; }, preHidden:true, content:function(){ player.addTempSkill('gzjuejue_effect'); player.loseHp(); }, subSkill:{ effect:{ trigger:{player:'phaseDiscardAfter'}, forced:true, charlotte:true, popup:false, filter:function(event,player){ return player.getHistory('lose',function(evt){ return evt.type=='discard'&&evt.cards2&&evt.cards2.length>0&&evt.getParent('phaseDiscard')==event; }).length>0; }, content:function(){ 'step 0' var num=0; player.getHistory('lose',function(evt){ if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) num+=evt.cards2.length; }); event.num=num; event.targets=game.filterPlayer(function(current){ return current!=player; }).sortBySeat(); player.line(event.targets,'green'); 'step 1' var target=targets.shift(); event.target=target; if(target.isIn()){ target.addTempClass('target'); target.chooseCard('h',num,'将'+get.cnNumber(num)+'张牌置入弃牌堆,或受到1点伤害').set('ai',function(card){ var evt=_status.event.getParent(); if(get.damageEffect(evt.target,evt.player,evt.target)>=0) return 0; return (8/Math.sqrt(evt.num)+evt.target.getDamagedHp())-get.value(card); }); } else if(targets.length) event.redo(); else event.finish(); 'step 2' if(result.bool){ target.lose(result.cards,ui.discardPile,'visible'); target.$throw(result.cards,1000); game.log(target,'将',result.cards,'置入了弃牌堆'); } else target.damage(); 'step 3' game.delayx(); if(targets.length) event.goto(1); }, }, }, ai:{ noDieAfter2:true, skillTagFilter:function(player,tag,target){ return target.isFriendOf(player); }, }, }, gzfangyuan:{ audio:2, trigger:{player:'phaseJieshuBegin'}, zhenfa:'siege', direct:true, locked:true, filter:function(event,player){ return game.countPlayer()>4&&game.hasPlayer(function(current){ return player.sieged(current)&&player.canUse('sha',current,false); }); }, preHidden:true, content:function(){ 'step 0' var list=game.filterPlayer(function(current){ return player.sieged(current)&&player.canUse('sha',current,false); }); if(player.hasSkill('gzfangyuan')){ if(list.length==1) event._result={bool:true,targets:list}; else player.chooseTarget('方圆:视为对一名围攻你的角色使用【杀】',function(card,player,target){ return _status.event.list.includes(target); },true).set('list',list).set('ai',function(target){ var player=_status.event.player; return get.effect(target,{name:'sha',isCard:true},player,player); }).setHiddenSkill('gzfangyuan'); } else{ player.chooseTarget(get.prompt('gzfangyuan'),'视为对一名围攻你的角色使用【杀】',function(card,player,target){ return _status.event.list.includes(target); }).set('list',list).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.useCard({name:'sha',isCard:true},result.targets[0],'gzfangyuan',false); } }, global:'gzfangyuan_siege', subSkill:{ siege:{ mod:{ maxHandcard:function(player,num){ if(game.countPlayer()<4) return; var next=player.getNext(),prev=player.getPrevious(),siege=[]; if(player.siege(next)) siege.push(next.getNext()); if(player.siege(prev)) siege.push(prev.getPrevious()); if(siege.length){ siege.push(player); num+=siege.filter(function(source){ return source.hasSkill('gzfangyuan'); }).length; } if(player.sieged()){ if(next.hasSkill('gzfangyuan')) num--; if(prev.hasSkill('gzfangyuan')) num--; } return num; }, }, }, }, }, //彭羕 daming:{ audio:2, trigger:{global:'phaseUseBegin'}, direct:true, preHidden:true, filter:function(event,player){ if(!player.isFriendOf(event.player)||!game.hasPlayer(function(current){ return !current.isLinked(); })) return false; if(_status.connectMode&&player.hasSkill('daming')) return player.countCards('h')>0; return player.countCards('h',function(card){ return get.type2(card,player)=='trick'; }); }, content:function(){ 'step 0' player.chooseCardTarget({ prompt:get.prompt('daming'), prompt2:'弃置一张锦囊牌并选择要横置的角色', filterCard:function(card,player){ return get.type2(card,player)=='trick'&&lib.filter.cardDiscardable(card,player,'daming'); }, filterTarget:function(card,player,target){ return !target.isLinked(); }, goon:function(){ var target=trigger.player; if(get.recoverEffect(target,player,player)>0) return true; var card={name:'sha',nature:'thunder',isCard:true}; if(game.hasPlayer(function(current){ return current!=player&¤t!=target&&target.canUse(card,current,false)&&get.effect(current,card,target,player)>0; })) return true; return false; }(), ai1:function(card){ if(_status.event.goon) return 7-get.value(card); return 0; }, ai2:function(target){ var player=_status.event.player; return ((target.identity!='unknown'&&!game.hasPlayer(function(current){ return current!=target&¤t.isFriendOf(target)&¤t.isLinked(); }))?3:1)*(-get.attitude(target,player,player)+1); }, }).setHiddenSkill('daming'); 'step 1' if(result.bool){ var target=result.targets[0]; event.target=target; player.logSkill('daming',target); player.discard(result.cards); } else event.finish(); 'step 2' if(!target.isLinked()) target.link(); 'step 3' var map={},sides=[],pmap=_status.connectMode?lib.playerOL:game.playerMap,player; for(var i of game.players){ if(i.identity=='unknown') continue; var added=false; for(var j of sides){ if(i.isFriendOf(pmap[j])){ added=true; map[j].push(i); if(i==this) player=j; break; } } if(!added){ map[i.playerid]=[i]; sides.push(i.playerid); if(i==this) player=i.playerid; } } var num=0; for(var i in map){ if(map[i].filter(function(i){ return i.isLinked(); }).length) num++; } if(num>0) player.draw(num); 'step 4' if(trigger.player.isIn()){ var target=trigger.player,sha=game.filterPlayer(function(current){ return current!=target&¤t!=player&&target.canUse({name:'sha',nature:'thunder',isCard:true},current,false); }); if(sha.length){ var next=player.chooseTarget('请选择'+get.translation(target)+'使用雷【杀】的目标',function(card,player,target){ return _status.event.list.includes(target); }); next.set('prompt2','或点「取消」令其回复1点体力'); next.set('goon',get.recoverEffect(target,player,player)); next.set('list',sha); next.set('ai',function(target){ var player=_status.event.player; return get.effect(target,{name:'sha',nature:'thunder',isCard:true},_status.event.getTrigger().player,player)-_status.event.goon; }); } else if(target.isDamaged()) event._result={bool:false}; else event.finish(); } else event.finish(); 'step 5' if(result.bool){ var target=result.targets[0]; if(player==trigger.player) player.line(target); else{ player.line2([trigger.player,target]); game.delay(0.5); } trigger.player.useCard({name:'sha',nature:'thunder',isCard:true},target,false).animate=false; } else{ player.line(trigger.player); trigger.player.recover(); } }, }, xiaoni:{ audio:2, trigger:{ player:'useCard', target:'useCardToTargeted', }, forced:true, filter:function(event,player){ var type=get.type2(event.card); if(type!='basic'&&type!='trick') return false; var list=game.filterPlayer(function(current){ return current!=player&¤t.isFriendOf(player); }); if(!list.length) return false; var hs=player.countCards('h'); for(var i of list){ if(i.countCards('h')>hs) return false; } return true; }, check:()=>false, preHidden:true, content:function(){ if(trigger.name=='useCard') trigger.directHit.addArray(game.players); else trigger.directHit.add(player); }, global:'xiaoni_ai', ai:{ halfneg:true, directHit_ai:true, skillTagFilter:function(player,tag,arg){ if(!arg.card) return false; var type=get.type2(arg.card); if(type!='basic'&&type!='trick') return false; var list=game.filterPlayer(function(current){ return current!=player&¤t.isFriendOf(player); }); if(!list.length) return false; var cards=[arg.card]; if(arg.card.cards) cards.addArray(arg.card.cards); cards.addArray(ui.selected.cards); var hhs=function(card){ return !cards.includes(card); }; var hs=player.countCards('h',hhs); for(var i of list){ if(i.countCards('h',hhs)>hs) return false; } return true; }, }, subSkill:{ ai:{ ai:{ directHit_ai:true, skillTagFilter:function(playerx,tag,arg){ if(!arg.card) return false; var type=get.type2(arg.card); if(type!='basic'&&type!='trick') return false; var player; if(arg.target&&arg.target.hasSkill('xiaoni')) player=arg.target; else return false; var list=game.filterPlayer(function(current){ return current!=player&¤t.isFriendOf(player); }); if(!list.length) return false; var cards=[arg.card]; if(arg.card.cards) cards.addArray(arg.card.cards); cards.addArray(ui.selected.cards); var hhs=function(card){ return !cards.includes(card); }; var hs=player.countCards('h',hhs); for(var i of list){ if(i.countCards('h',hhs)>hs) return false; } return true; }, }, }, }, }, //刘巴 gztongduo:{ audio:2, trigger:{global:'phaseJieshuBegin'}, direct:true, preHidden:true, filter:function(event,player){ if(player!=event.player&&!player.hasSkill('gztongduo')||!event.player.isFriendOf(player)) return false; return event.player.getHistory('lose',function(evt){ return evt.type=='discard'&&evt.cards2.length>0&&evt.getParent('phaseDiscard').player==event.player; }).length>0; }, content:function(){ 'step 0' var num=0; trigger.player.getHistory('lose',function(evt){ if(evt.type=='discard'&&evt.getParent('phaseDiscard').player==trigger.player) num+=evt.cards2.length; }); num=Math.min(3,num); event.num=num; var next=trigger.player.chooseBool('是否发动【统度】摸'+get.cnNumber(num)+'张牌?'); if(player==trigger.player) next.setHiddenSkill('gztongduo'); 'step 1' if(result.bool){ player.logSkill('gztongduo',trigger.player); trigger.player.draw(num); } }, }, qingyin:{ audio:2, enable:'phaseUse', limited:true, delay:false, filter:function(event,player){ var isFriend; if(player.identity=='unknown'){ var group='shu'; if(!player.wontYe('shu')) group=null; isFriend=function(current){ return current==player||current.identity==group; } } else isFriend=function(target){ return target.isFriendOf(player); }; return game.hasPlayer(function(current){ return isFriend(current)&¤t.isDamaged(); }); }, selectTarget:-1, filterTarget:function(card,player,target){ if(player==target) return true; if(player.identity=='unknown'){ var group='shu'; if(!player.wontYe('shu')) return false; return target.identity==group; } return target.isFriendOf(player); }, selectCard:[0,1], filterCard:()=>false, multitarget:true, multiline:true, skillAnimation:true, animationColor:'orange', content:function(){ 'step 0' player.awakenSkill('qingyin'); event.num=0; 'step 1' if(targets[num].isDamaged()){ targets[num].recover(targets[num].maxHp-targets[num].hp); } event.num++; if(event.num=(1/Math.max(1.6,game.roundNumber))?1:-1; }, result:{ player:1, }, }, }, //苏飞 gzlianpian:{ audio:2, trigger:{global:'phaseJieshuBegin'}, direct:true, preHidden:true, filter:function(event,player){ if(player!=event.player&&!player.hasSkill('gzlianpian')) return false; var num=0; game.getGlobalHistory('cardMove',function(evt){ if(evt.name=='lose'&&evt.type=='discard'&&evt.getParent(2).player==event.player) num+=evt.cards2.length; }); if(num<=player.hp) return false; if(player==event.player) return game.hasPlayer(function(current){ return current.isFriendOf(player)&¤t.countCards('h')0||player.isDamaged(); }, content:function(){ 'step 0' if(player==trigger.player){ player.chooseTarget(get.prompt('gzlianpian'),'令一名己方角色将手牌摸至手牌上限',function(card,player,target){ return target.isFriendOf(player)&&target.maxHp>target.countCards('h'); }).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; }).setHiddenSkill(event.name); } else{ event.goto(2); event.addIndex=0; var list=[],target=trigger.player,str=get.translation(player); event.target=target; if(player.countDiscardableCards(target,'he')>0) list.push('弃置'+str+'的一张牌'); else event.addIndex++; if(player.isDamaged()) list.push('令'+str+'回复1点体力'); target.chooseControl('cancel2').set('choiceList',list).set('ai',function(){ var evt=_status.event.getParent(); if(get.attitude(evt.target,evt.player)>0) return 1-evt.addIndex; return evt.addIndex; }).set('prompt','是否对'+str+'发动【连翩】?'); } 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('gzlianpian',target); target.draw(Math.min(5,target.maxHp-target.countCards('h'))); } event.finish(); 'step 2' if(result.control=='cancel2'){ event.finish(); return; } player.logSkill('gzlianpian',target,false); target.line(player,'green'); if(result.index+event.addIndex==0){ target.discardPlayerCard('he',player,true); event.finish(); } else player.recover(); 'step 3' game.delayx(); }, }, //冯熙 gzyusui:{ audio:'yusui', trigger:{target:'useCardToTargeted'}, filter:function(event,player){ return event.player!=player&&event.player.isIn()&&event.player.isEnemyOf(player)&&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; return false; }, preHidden:true, content:function(){ 'step 0' player.loseHp(); event.target=trigger.player; 'step 1' event.addIndex=0; var list=[]; if(target.maxHp>0&&target.countCards('h')>0) list.push('令其弃置'+get.cnNumber(target.maxHp)+'张手牌'); 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(target.maxHp,target.countCards('h'))/2)?1:0; }); 'step 2' if(result.index+event.addIndex==0) target.chooseToDiscard(target.maxHp,true,'h'); else target.loseHp(target.hp-player.hp); }, }, gzboyan:{ audio:'boyan', enable:'phaseUse', usable:1, filter:function(event,player){ return game.hasPlayer((target)=>lib.skill.gzboyan.filterTarget(null,player,target)); }, filterTarget:function(card,player,target){ return target!=player&&target.countCards('h')0; }); else event.finish(); 'step 3' if(result.bool){ target.addTempSkill('gzboyan_zongheng',{player:'phaseEnd'}); game.log(player,'发起了','#y纵横',',令',target,'获得了技能','#g【驳言】'); } }, derivation:'gzboyan_zongheng', subSkill:{ zongheng:{ enable:'phaseUse', usable:1, filterTarget:lib.filter.notMe, content:function(){ target.addTempSkill('gzboyan_block'); }, ai:{ order:4, result:{ target:function(player,target){ if(target.countCards('h','shan')&&!target.hasSkillTag('respondShan',true,null,true)&&player.countCards('h',function(card){ return get.tag(card,'respondShan')&&get.effect(target,card,player,player)>0&&player.getUseValue(card)>0; })) return -target.countCards('h'); return -0.5; }, }, }, }, 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.min(5,target.maxHp-target.countCards('h')); if(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')&&get.effect(target,card,player,player)>0&&player.getUseValue(card,null,true)>0; })) return -2; }, }, }, }, //文钦 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; }) }, filterCard:true, position:'he', filterTarget:function(card,player,target){ return target!=player&&target.countCards('he')>0; }, check:function(card){ return 6-get.value(card); }, content:function(){ 'step 0' target.chooseCard('he','交给'+get.translation(player)+'一张装备牌,或令其获得你的一张牌',{type:'equip'}).set('ai',function(card){ if(_status.event.goon&&get.suit(card)=='spade') return 8-get.value(card); return 5-get.value(card); }).set('goon',target.canUse('sha',player,false)&&get.effect(player,{name:'sha'},target,target)>0); 'step 1' if(!result.bool){ player.gainPlayerCard(target,'he',true); event.finish(); } else target.give(result.cards,player); 'step 2' if(result.bool&&result.cards&&result.cards.length&& target.isIn()&&player.isIn()&&get.suit(result.cards[0],target)=='spade'&&target.canUse('sha',player,false)) target.useCard({name:'sha',isCard:true},false,player); }, ai:{ order:6, result:{ player:function(player,target){ if(target.countCards('e',function(card){ return get.suit(card)=='spade'&&get.value(card)<8; })&&target.canUse('sha',player,false)) return get.effect(player,{name:'sha'},target,player); return 0; }, target:function(player,target){ var es=target.getCards('e').sort(function(a,b){ return get.value(b,target)-get.value(a,target); }); if(es.length) return -Math.min(2,get.value(es[0])) return -2; }, }, }, }, //诸葛恪 gzduwu:{ limited:true, audio:2, enable:'phaseUse', delay:false, filter:function(event,player){ var isEnemy; if(player.identity=='unknown'){ if(!player.wontYe('wu')) isEnemy=function(current){ return current!=player; }; else isEnemy=function(current){ return current!=player&¤t.identity!='wu'; } } else isEnemy=function(target){ return target.isEnemyOf(player); }; return game.hasPlayer(function(current){ return isEnemy(current)&&player.inRange(current); }); }, filterTarget:function(card,player,target){ if(player==target||!player.inRange(target)) return false; if(player.identity=='unknown'){ if(!player.wontYe('wu')) return true; return target.identity!='wu'; } return target.isEnemyOf(player); }, selectTarget:-1, filterCard:()=>false, selectCard:[0,1], multitarget:true, multiline:true, content:function(){ 'step 0' player.awakenSkill('gzduwu'); player.addSkill('gzduwu_count'); targets.sortBySeat(); event.players=targets.slice(0); game.delayx(); player.chooseJunlingFor(event.players[0]).set('prompt','为所有目标角色选择军令牌'); 'step 1' event.junling=result.junling; event.targets=result.targets; event.num=0; 'step 2' if(num(get.damageEffect(evt.current,evt.player,evt.current)/get.attitude(evt.current,evt.current))?0:1; }); } else event.goto(4); 'step 3' if(result.index==0){ event.current.carryOutJunling(player,event.junling,targets); } else{ player.draw(); event.current.damage(); } 'step 4' game.delayx(); event.num++; if(event.num0&&player.canUse('sha',event.player,false); }, content:function(){ 'step 0' player.chooseCard('e',get.prompt('gzxishe',trigger.player),'将装备区内的一张牌当做'+(player.hp>trigger.player.hp?'不可响应的':'')+'【杀】对其使用',function(card,player){ return player.canUse({ name:'sha', cards:[card], },_status.event.target,false); }).set('target',trigger.player).set('ai',function(card){ var evt=_status.event,eff=get.effect(evt.target,{ name:'sha', cards:[card], },evt.player,evt.player); if(eff<=0) return 0; var val=get.value(card); if(get.attitude(evt.player,evt.target)<-2&&evt.target.hp<=Math.min(2,evt.player.countCards('e'),evt.player.hp-1)) return 2/Math.max(1,val); return eff-val; }).setHiddenSkill(event.name); 'step 1' if(result.bool){ var next=player.useCard({name:'sha'},result.cards,'gzxishe',trigger.player,false); if(player.hp>trigger.player.hp) next.oncard=function(){ _status.event.directHit.add(trigger.player); } } else event.finish(); 'step 2' if(trigger.player.isDead()){ player.mayChangeVice(null,'hidden'); } else if(lib.skill.gzxishe.filter(trigger,player)) event.goto(0); }, ai:{ directHit_ai:true, skillTagFilter:function(player,tag,arg){ if(_status.event.getParent().name=='gzxishe'&&arg.card&&arg.card.name=='sha'&& arg.target&&arg.target==_status.event.target&&player.hp>arg.target.hp) return true; return false; }, }, }, //公孙渊 gzhuaiyi:{ audio:2, enable:'phaseUse', usable:1, delay:false, filter:function(event,player){ return player.countCards('h')>0; }, content:function(){ 'step 0' player.showHandcards(); 'step 1' if(!player.countCards('h',{color:'red'})) event._result={control:'黑色'}; else if(!player.countCards('h',{color:'black'})) event._result={control:'红色'}; else player.chooseControl('红色','黑色').set('ai',function(){ var player=_status.event.player,num=player.maxHp-player.getExpansions('gzhuaiyi').length; if(player.countCards('h',{color:'red'})<=num&& player.countCards('h',{color:'black'})>num) return '红色'; return '黑色'; }); 'step 2' event.control=result.control; var cards; if(event.control=='红色'){ cards=player.getCards('h',{color:'red'}); } else{ cards=player.getCards('h',{color:'black'}); } player.discard(cards); event.num=cards.length; 'step 3' player.chooseTarget('请选择至多'+get.cnNumber(event.num)+'名有牌的其他角色,获得这些角色的各一张牌。',[1,event.num],function(card,player,target){ return target!=player&&target.countCards('he')>0; }).set('ai',function(target){ return -get.attitude(_status.event.player,target)+0.5; }); 'step 4' if(result.bool&&result.targets){ player.line(result.targets,'green'); event.targets=result.targets; event.targets.sort(lib.sort.seat); event.cards=[]; } else{ event.finish(); } 'step 5' if(player.isAlive()&&event.targets.length){ player.gainPlayerCard(event.targets.shift(),'he',true); } else event.finish(); 'step 6' if(result.bool&&result.cards&&result.cards.length) event.cards.addArray(result.cards); if(event.targets.length) event.goto(5); 'step 7' var hs=player.getCards('h'); cards=cards.filter(function(card){ return get.type(card)=='equip'&&hs.includes(card); }); if(cards.length){ player.addToExpansion(cards,player,'give').gaintag.add('gzhuaiyi'); } }, ai:{ order:10, result:{ player:function(player,target){ var num=player.maxHp-player.getExpansions('gzhuaiyi').length; if(player.countCards('h',{color:'red'})<=num) return 1; if(player.countCards('h',{color:'black'})<=num) return 1; return 0; }, } }, marktext:'异', intro:{content:'expansion',markcount:'expansion'}, onremove:function(player,skill){ var cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); }, }, gzzisui:{ audio:2, trigger:{player:'phaseDrawBegin2'}, forced:true, filter:function(event,player){ return !event.numFixed&&player.getExpansions('gzhuaiyi').length>0; }, content:function(){ trigger.num+=player.getExpansions('gzhuaiyi').length; }, group:'gzzisui_die', subSkill:{ die:{ audio:'gzzisui', trigger:{player:'phaseJieshuBegin'}, forced:true, filter:function(event,player){ return player.getExpansions('gzhuaiyi').length>player.maxHp; }, content:function(){ player.die(); }, }, }, }, //潘濬 gzcongcha:{ audio:2, trigger:{player:'phaseZhunbeiBegin'}, direct:true, filter:function(event,player){ return game.hasPlayer(function(current){ return current!=player&¤t.isUnseen(); }) }, preHidden:'gzcongcha_draw', prompt2:'选择一名武将牌均暗置的其他角色', content:function(){ 'step 0' player.chooseTarget(get.prompt2('gzcongcha'),function(card,player,target){ return target!=player&&target.isUnseen(); }).set('ai',function(target){ if(get.attitude(_status.event.player,target)>0) return Math.random()+Math.sqrt(target.hp); return Math.random()+Math.sqrt(Math.max(1,4-target.hp)); }); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('gzcongcha',target); player.storage.gzcongcha2=target; player.addTempSkill('gzcongcha2',{player:'phaseBegin'}); target.addSkill('gzcongcha_ai'); game.delayx(); } }, subfrequent:['draw'], group:'gzcongcha_draw', subSkill:{ draw:{ audio:'gzcongcha', trigger:{player:'phaseDrawBegin2'}, frequent:true, filter:function(event,player){ return !event.numFixed&&!game.hasPlayer(function(current){ return current.isUnseen(); }); }, prompt:'是否发动【聪察】多摸两张牌?', content:function(){ trigger.num+=2; }, }, }, }, gzcongcha_ai:{ charlotte:true, ai:{ mingzhi_yes:true, mingzhi_no:true, skillTagFilter:function(player,tag){ if(_status.brawl) return false; var group=lib.character[player.name1][1]; if(tag=='mingzhi_yes'){ if(group!='ye'&&player.wontYe(group)&&game.hasPlayer(function(current){ return current.storage.gzcongcha2==player&¤t.identity==group; })) return true; return false; } if(group=='ye'&&!player.wontYe(group)) return true; return game.hasPlayer(function(current){ return current.storage.gzcongcha2==player&¤t.identity!=group; }) }, }, }, gzcongcha2:{ trigger:{global:'showCharacterAfter'}, forced:true, charlotte:true, onremove:true, filter:function(event,player){ return event.player==player.storage.gzcongcha2; }, logTarget:'player', content:function(){ 'step 0' player.removeSkill('gzcongcha2'); trigger.player.removeSkill('gzcongcha_ai'); if(player.isFriendOf(trigger.player)) game.asyncDraw([player,trigger.player].sortBySeat(_status.currentPhase),2); else trigger.player.loseHp(); 'step 1' game.delayx(); }, mark:'character', intro:{content:'已指定$为目标'}, }, //司马昭 gzzhaoxin:{ audio:2, trigger:{player:'damageEnd'}, filter:function(event,player){ return player.countCards('h')>0; }, check:()=>false, preHidden:true, content:function(){ 'step 0' player.showHandcards(); 'step 1' var hs=player.countCards('h'); if(game.hasPlayer(function(current){ return current!=player&¤t.countCards('h')<=hs; })){ player.chooseTarget(true,'请选择要交换手牌的目标角色',function(card,player,target){ return target!=player&&target.countCards('h')<=player.countCards('h'); }) } else event.finish(); 'step 2' if(result.bool){ var target=result.targets[0]; player.line(target,'green'); player.swapHandcards(target); } }, }, gzsuzhi:{ audio:2, derivation:'gzfankui', mod:{ targetInRange:function(card,player,target){ if(player==_status.currentPhase&&player.countMark('gzsuzhi_count')<3&&get.type2(card)=='trick') return true; }, }, trigger:{player:'phaseJieshuBegin'}, forced:true, filter:function(event,player){ return player.countMark('gzsuzhi_count')<3; }, content:function(){ player.addTempSkills('gzfankui',{player:'phaseBegin'}); }, group:['gzsuzhi_damage','gzsuzhi_draw','gzsuzhi_gain'], preHidden:['gzsuzhi_damage','gzsuzhi_draw','gzsuzhi_gain'], subSkill:{ damage:{ audio:'gzsuzhi', trigger:{source:'damageBegin1'}, forced:true, filter:function(event,player){ return player==_status.currentPhase&&player.countMark('gzsuzhi_count')<3&&event.card&& (event.card.name=='sha'||event.card.name=='juedou')&&event.getParent().type=='card'; }, content:function(){ trigger.num++; player.addTempSkill('gzsuzhi_count'); player.addMark('gzsuzhi_count',1,false); }, }, draw:{ audio:'gzsuzhi', trigger:{player:'useCard'}, forced:true, filter:function(event,player){ return player==_status.currentPhase&&player.countMark('gzsuzhi_count')<3&&event.card.isCard&&get.type2(event.card)=='trick'; }, content:function(){ player.draw(); player.addTempSkill('gzsuzhi_count'); player.addMark('gzsuzhi_count',1,false); }, }, gain:{ audio:'gzsuzhi', trigger:{global:'loseAfter'}, forced:true, filter:function(event,player){ if(player!=_status.currentPhase||event.type!='discard'||player==event.player||player.countMark('gzsuzhi_count')>=3) return false; return event.player.countGainableCards(player,'he')>0; }, logTarget:'player', content:function(){ 'step 0' player.addTempSkill('gzsuzhi_count'); player.addMark('gzsuzhi_count',1,false); if(trigger.delay==false) game.delay(); 'step 1' player.gainPlayerCard(trigger.player,'he',true); }, }, count:{ onremove:true, }, }, }, gzfankui:{ audio:2, inherit:'fankui', }, //夏侯霸 gzbaolie:{ audio:2, mod:{ targetInRange:function(card,player,target){ if(card.name=='sha'&&target.hp>=player.hp) return true; }, cardUsableTarget:function(card,player,target){ if(card.name=='sha'&&target.hp>=player.hp) return true; }, }, trigger:{player:'phaseUseBegin'}, forced:true, preHidden:true, filter:function(event,player){ return game.hasPlayer(function(current){ return current.isEnemyOf(player)&&player.inRangeOf(current); }); }, logTarget:function(event,player){ return game.filterPlayer(function(current){ return current.isEnemyOf(player)&&player.inRangeOf(current); }); }, check:()=>false, content:function(){ 'step 0' event.targets=game.filterPlayer(function(current){ return current.isEnemyOf(player)&&player.inRangeOf(current); }).sortBySeat(); 'step 1' var target=event.targets.shift(); if(target.isIn()){ event.target=target; target.chooseToUse(function(card,player,event){ if(get.name(card)!='sha') return false; return lib.filter.filterCard.apply(this,arguments); },'豹烈:对'+get.translation(player)+'使用一张杀,或令其弃置你的一张牌').set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ if(target!=_status.event.sourcex&&!ui.selected.targets.includes(_status.event.sourcex)) return false; return lib.filter.filterTarget.apply(this,arguments); }).set('sourcex',player); } else if(targets.length) event.redo(); else event.finish(); 'step 2' if(result.bool==false&&target.countCards('he')>0){ player.discardPlayerCard(target,'he',true); } if(targets.length) event.goto(1); }, }, //许攸 gzchenglve:{ audio:2, trigger:{global:'useCardAfter'}, filter:function(event,player){ return event.targets.length>1&&event.player.isIn()&&event.player.isFriendOf(player); }, logTarget:'player', check:function(event,player){ return get.attitude(player,event.player)>0; }, preHidden:true, content:function(){ 'step 0' trigger.player.draw(); if(player.hasHistory('damage',function(evt){ return evt.card==trigger.card; })&&game.hasPlayer(function(current){ return current.isFriendOf(player)&&(!current.hasMark('yexinjia_mark')&&!current.hasMark('xianqu_mark')&&!current.hasMark('yinyang_mark')&&!current.hasMark('zhulianbihe_mark')) })){ player.chooseTarget('是否令一名己方角色获得“阴阳鱼”标记?',function(card,player,current){ return current.isFriendOf(player)&&(!current.hasMark('yexinjia_mark')&&!current.hasMark('xianqu_mark')&&!current.hasMark('yinyang_mark')&&!current.hasMark('zhulianbihe_mark')); }).set('ai',function(target){ return get.attitude(_status.event.player,target)*Math.sqrt(1+target.needsToDiscard()); }); } else event.finish(); 'step 1' if(result.bool){ var target=result.targets[0]; player.line(target,'green'); target.addMark('yinyang_mark',1,false); game.delayx(); } }, }, gzshicai:{ audio:2, trigger:{player:'damageEnd'}, forced:true, preHidden:true, filter:function(event,player){ return event.num==1||player.countCards('he')>0; }, check:function(event,player){ return event.num==1; }, content:function(){ if(trigger.num==1) player.draw(); else player.chooseToDiscard(true,'he',2); }, }, gzzhuosheng:{ audio:'zhuosheng', trigger:{global:'damageEnd'}, logTarget:'player', filter:function(event,player){ return event.player.isFriendOf(player); }, preHidden:true, content:function(){ var target=trigger.player; target.addTempSkill('gzzhuosheng2',{player:'phaseJieshuBegin'}); target.draw().gaintag=['gzzhuosheng2']; }, }, gzzhuosheng2:{ onremove:function(player,skill){ player.removeGaintag(skill); }, mod:{ targetInRange:function(card,player,target){ if(!card.cards||get.type(card)!='basic') return; for(var i of card.cards){ if(i.hasGaintag('gzzhuosheng2')) return (game.online?player==_status.currentPhase:player.isPhaseUsing()); } }, cardUsable:function(card,player,target){ if(!card.cards||get.type(card)!='basic'||!(game.online?player==_status.currentPhase:player.isPhaseUsing())) return; for(var i of card.cards){ if(i.hasGaintag('gzzhuosheng2')) return Infinity; } }, aiOrder:function(player,card,num){ if(get.itemtype(card)=='card'&&card.hasGaintag('gzzhuosheng2')&&get.type(card)=='basic') return num-0.1; }, }, audio:'zhuosheng', 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('gzzhuosheng2')) return true; } return false; }).length>0; }, filter:function(event,player){ if(!lib.skill.gzzhuosheng2.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('gzzhuosheng2'),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('gzzhuosheng2',event.targets); if(trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); else trigger.targets.addArray(event.targets); } }, group:['gzzhuosheng2_equip','gzzhuosheng2_silent'], subSkill:{ equip:{ audio:'zhuosheng', trigger:{player:'useCard'}, filter:function(event,player){ return get.type(event.card)=='equip'&&lib.skill.gzzhuosheng2.filterx(event,player); }, prompt:'是否发动【擢升】摸一张牌?', content:function(){ player.draw(); }, }, silent:{ trigger:{ player:'useCard1', }, silent:true, firstDo:true, filter:function(event,player){ return get.type(event.card)=='basic'&&lib.skill.gzzhuosheng2.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]--; }, }, }, }, gzzhuhai:{ audio:'zhuhai', audioname:['gz_re_xushu'], trigger:{global:'phaseJieshuBegin'}, direct:true, preHidden:true, filter:function(event,player){ return event.player.isAlive()&&event.player.getStat('damage')&& lib.filter.targetEnabled({name:'sha'},player,event.player)&&(player.hasSha()||_status.connectMode&&player.countCards('h')>0); }, content:function(){ var next=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','gzzhuhai').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).setHiddenSkill(event.name); player.addTempSkill('gzzhuhai2'); next.oncard=function(card,player){ try{ if(trigger.player.getHistory('sourceDamage',function(evt){ return evt.player.isFriendOf(player); }).length){ player.addTempSkill('gzzhuhai2'); card.gzzhuhai_tag=true; } }catch(e){ alert('发生了一个导致【诛害】无法正常触发无视防具效果的错误。请关闭十周年UI/手杀UI等扩展以解决'); } } }, ai:{ unequip_ai:true, skillTagFilter:function(player,tag,arg){ var evt=_status.event.getParent(); if(evt.name!='gzzhuhai'||!arg||!arg.target) return false; if(!arg.target.getHistory('sourceDamage',function(evt){ return evt.player.isFriendOf(player); }).length) return false; return true; }, }, }, gzzhuhai2:{ trigger:{player:'shaMiss'}, forced:true, popup:false, filter:function(event,player){ return event.card.gzzhuhai_tag==true&&event.target.countCards('he')>0; }, content:function(){ player.line(trigger.target); trigger.target.chooseToDiscard('he',true); }, ai:{ unequip:true, skillTagFilter:function(player,tag,arg){ if(!arg||!arg.card||!arg.card.gzzhuhai_tag) return false; }, }, }, quanjin:{ audio:2, enable:'phaseUse', usable:1, onChooseToUse:function(event){ if(!game.online){ event.set('quanjin_list',game.filterPlayer((i)=>(i!=event.player&&i.getHistory('damage').length))); } }, filter:function(event,player){ return event.quanjin_list&&event.quanjin_list.length>0&&player.countCards('h')>0; }, filterCard:true, filterTarget:function(card,player,target){ return _status.event.quanjin_list.includes(target); }, discard:false, lose:false, delay:false, check:function(card){ var evt=_status.event; if(evt.quanjin_list.filter(function(target){ return get.attitude(evt.player,target)>0; }).length) return 8-get.value(card); return 6.5-get.value(card); }, content:function(){ 'step 0' player.give(cards,target); 'step 1' player.chooseJunlingFor(target); 'step 2' event.junling=result.junling; event.targets=result.targets; var str=get.translation(player); target.chooseJunlingControl(player,result.junling,result.targets).set('prompt','劝进').set('choiceList',[ '执行该军令,然后'+str+'摸一张牌', '不执行该军令,然后其将手牌摸至与全场最多相同', ]).set('ai',function(){ var evt=_status.event.getParent(2),player=evt.target,source=evt.player,junling=evt.junling,targets=evt.targets; var num=0; game.countPlayer(function(current){ var num2=current.countCards('h'); if(num2>num) num=num2; }); num=Math.max(0,num-source.countCards('h')); if(num>1){ if(get.attitude(player,target)>0) return get.junlingEffect(source,junling,player,targets,player)>num; return get.junlingEffect(source,junling,player,targets,player)>-num; } if(get.attitude(player,target)>0) return get.junlingEffect(source,junling,player,targets,player)>0; return get.junlingEffect(source,junling,player,targets,player)>1; }); 'step 3' if(result.index==0){ target.carryOutJunling(player,event.junling,targets); player.draw(); } else{ var num=0; game.countPlayer(function(current){ var num2=current.countCards('h'); if(num2>num) num=num2; }); num-=player.countCards('h'); if(num>0) player.draw(Math.min(num,5)); } }, ai:{ order:1, result:{ player:function(player,target){ if(get.attitude(player,target)>0) return 3.3; var num=0; game.countPlayer(function(current){ var num2=current.countCards('h'); if(player==current) num2--; if(target==current) num2++; if(num2>num) num=num2; }); num=Math.max(0,num-player.countCards('h')); if(!num) return 0; if(num>1) return 2; if(ui.selected.cards.length&&get.value(ui.selected.cards[0])>5) return 0; return 1; }, }, }, }, zaoyun:{ audio:2, enable:'phaseUse', usable:1, filter:function(event,player){ var num=player.countCards('h'); return game.hasPlayer(function(current){ if(current.isEnemyOf(player)){ var dist=get.distance(player,current); return dist>1&&dist<=num; } }); }, selectCard:function(){ var list=[],player=_status.event.player; if(ui.selected.targets.length) return get.distance(player,ui.selected.targets[0])-1; game.countPlayer(function(current){ if(current.isEnemyOf(player)){ var dist=get.distance(player,current); if(dist>1) list.push(dist-1); } }); list.sort(); return [list[0],list[list.length-1]]; }, filterCard:true, filterTarget:function(card,player,target){ return target.isEnemyOf(player)&&get.distance(player,target)==ui.selected.cards.length+1; }, check:function(card){ var player=_status.event.player; if(ui.selected.cards.length&&game.hasPlayer(function(current){ return current.isEnemyOf(player)&&get.distance(player,current)==(ui.selected.cards.length+1)&&get.damageEffect(current,player,player)>0; })) return 0; return (7-ui.selected.cards.length*2)-get.value(card); }, content:function(){ target.damage('nocard'); if(!player.storage.zaoyun2) player.storage.zaoyun2=[]; player.storage.zaoyun2.push(target); player.addTempSkill('zaoyun2'); }, ai:{ order:5, result:{ target:function(player,target){ return get.damageEffect(target,player,target); }, }, }, }, zaoyun2:{ onremove:true, charlotte:true, mod:{ globalFrom:function(player,target){ if(player.getStorage('zaoyun2').includes((target))) return -Infinity; }, }, }, gzzhidao:{ audio:2, trigger:{player:'phaseUseBegin'}, forced:true, preHidden:true, content:function(){ 'step 0' player.chooseTarget('请选择【雉盗】的目标','本回合内只能对自己和该角色使用牌,且第一次对其造成伤害时摸一张牌',lib.filter.notMe,true).set('ai',function(target){ var player=_status.event.player; return (1-get.sgn(get.attitude(player,target)))*Math.max(1,get.distance(player,target)); }); 'step 1' if(result.bool){ var target=result.targets[0]; player.line(target,'green'); game.log(player,'选择了',target); player.storage.gzzhidao2=target; player.addTempSkill('gzzhidao2'); } }, }, gzzhidao2:{ mod:{ playerEnabled:function(card,player,target){ if(target!=player&&target!=player.storage.gzzhidao2) return false; }, globalFrom:function(from,to){ if(to==from.storage.gzzhidao2) return -Infinity; }, }, audio:'gzzhidao', trigger:{source:'damageSource'}, forced:true, charlotte:true, filter:function(event,player){ return event.player==player.storage.gzzhidao2&&player.getHistory('sourceDamage',function(evt){ return evt.player==event.player; }).indexOf(event)==0&&event.player.countGainableCards(player,'hej')>0; }, logTarget:'player', content:function(){ player.gainPlayerCard(trigger.player,'hej',true); }, }, gzyjili:{ audio:2, forced:true, preHidden:['gzyjili_remove'], trigger:{target:'useCardToTargeted'}, filter:function(event,player){ if(get.color(event.card)!='red'||event.targets.length!=1) return false; var type=get.type(event.card); return type=='basic'||type=='trick'; }, check:function(){ return false; }, content:function(){ player.addTempSkill('gzyjili2'); var evt=trigger.getParent(); if(!evt.gzyjili) evt.gzyjili=[]; evt.gzyjili.add(player); }, group:'gzyjili_remove', subSkill:{ remove:{ audio:'gzyjili', trigger:{player:'damageBegin2'}, forced:true, filter:function(event,player){ var evt=false; for(var i of lib.phaseName){ evt=event.getParent(i); if(evt&&evt.player) break; } return evt&&evt.player&&player.getHistory('damage',function(evtx){ return evtx.getParent(evt.name)==evt; }).length==1; }, content:function(){ trigger.cancel(); player.removeCharacter(player.name1=='gz_yanbaihu'?0:1); }, }, }, }, gzyjili2:{ trigger:{global:'useCardAfter'}, charlotte:true, popup:false, forced:true, filter:function(event,player){ return event.gzyjili&&event.gzyjili.includes(player)&&!event.addedTarget&&event.player &&event.player.isAlive()&&event.player.canUse({ name:event.card.name, nature:event.card.nature, isCard:true, },player); }, content:function(){ trigger.player.useCard({ name:trigger.card.name, nature:trigger.card.nature, isCard:true, },player,false); }, }, donggui:{ audio:2, enable:'phaseUse', usable:1, filter:function(event,player){ return game.hasPlayer(function(current){ return lib.skill.donggui.filterTarget(null,player,current); }); }, filterTarget:function(card,player,target){ return target!=player&&!target.isUnseen(2)&&player.canUse('diaohulishan',target); }, content:function(){ 'step 0' player.chooseButton(['暗置'+get.translation(target)+'的一张武将牌',[[target.name1,target.name2],'character']],true).set('filterButton',function(button){ return !get.is.jun(button.link); }); 'step 1' var target1=target.getNext(); var target2=target.getPrevious(); if(target1==target2||target.inline(target1)||target.inline(target2)||target1.inline(target2)) event.finish(); else{ event.target1=target1; event.target2=target2; } target.hideCharacter(result.links[0]==target.name1?0:1); target.addTempSkill('donggui2'); player.useCard({name:'diaohulishan',isCard:true},target); 'step 2' if(event.target1.inline(event.target2)){ player.draw(game.countPlayer(function(current){ return current.inline(event.target1); })); } }, ai:{ order:2, result:{ player:function(player,target){ var target1=target.getNext(); var target2=target.getPrevious(); if(target1==target2||target.inline(target1)||target.inline(target2)||target1.inline(target2)||!target1.isFriendOf(target2)) return 0; var num=game.countPlayer(function(current){ return current!=target1&¤t!=target2&&(current.inline(target1)||current.inline(target2)); }); return 2+num; }, }, }, }, donggui2:{ai:{nomingzhi:true}}, fengyang:{ audio:2, zhenfa:'inline', trigger:{player:'phaseJieshuBegin'}, filter:function(event,player){ var bool=player.hasSkill('fengyang'); return game.hasPlayer(function(current){ return current!=player&¤t.inline(player); })&&game.hasPlayer(function(current){ return (current==player||bool)&¤t.inline(player)&¤t.countCards('e')>0; }); }, direct:true, preHidden:true, content:function(){ 'step 0' event.list=game.filterPlayer(function(current){ return current.inline(player); }).sortBySeat(); 'step 1' var target=event.list.shift(); if((target==player||player.hasSkill('fengyang'))&&target.countCards('e')){ event.target=target; var next=target.chooseToDiscard('e',get.prompt('fengyang'),'弃置装备区内的一张牌并摸两张牌').set('ai',function(card){ return 5.5-get.value(card); }); next.logSkill='fengyang'; if(player==target) next.setHiddenSkill('fengyang'); } else event.goto(3); 'step 2' if(result.bool){ target.draw(2); } 'step 3' if(event.list.length) event.goto(1); }, }, fengyang_old:{ audio:'fengyang', zhenfa:'inline', global:'fengyang_old_nogain', subSkill:{ nogain:{ mod:{ canBeDiscarded:function(card,player,target){ if(get.position(card)=='e'&&player.identity!=target.identity&&game.hasPlayer(function(current){ return current.hasSkill('fengyang_old')&&(current==target||target.inline(current)); })) return false; }, canBeGained:function(card,player,target){ if(get.position(card)=='e'&&player.identity!=target.identity&&game.hasPlayer(function(current){ return current.hasSkill('fengyang_old')&&(current==target||target.inline(current)); })) return false; }, }, }, }, }, gzrekuangcai:{ audio:'gzkuangcai', forced:true, preHidden:true, trigger:{player:'phaseDiscardBegin'}, filter:function(event,player){ return !player.getHistory('useCard').length||!player.getHistory('sourceDamage').length; }, check:function(event,player){ return !player.getHistory('useCard').length; }, content:function(){ lib.skill.rekuangcai.change(player,player.getHistory('useCard').length?-1:1); }, mod:{ targetInRange:function(card,player){ if(player==_status.currentPhase) return true; }, cardUsable:function(card,player){ if(player==_status.currentPhase) return Infinity; }, }, }, gzkuangcai:{ audio:2, trigger:{player:'useCard1'}, forced:true, firstDo:true, noHidden:true, preHidden:['gzkuangcai_discard'], filter:function(event,player){ return player==_status.currentPhase&&get.type(event.card)=='trick'; }, content:function(){ trigger.nowuxie=true; }, mod:{ targetInRange:function(card,player){ if(player==_status.currentPhase) return true; }, cardUsable:function(card,player){ if(player==_status.currentPhase) return Infinity; }, }, ai:{ unequip:true, skillTagFilter:function(player){ return player==_status.currentPhase; }, }, group:'gzkuangcai_discard', subSkill:{ discard:{ audio:'gzkuangcai', trigger:{player:'phaseDiscardBegin'}, forced:true, filter:function(event,player){ var use=player.getHistory('useCard').length; var damage=(player.getStat('damage')||0); if(use&&!damage) return true; if(damage>=use) return true; return false; }, check:function(event,player){ var use=player.getHistory('useCard').length; var damage=(player.getStat('damage')||0); if(use&&!damage) return false; return true; }, content:function(){ var use=player.getHistory('useCard').length; var damage=(player.getStat('damage')||0); if(use&&!damage) player.addTempSkill('gzkuangcai_less') else{ player.drawTo(player.maxHp); player.addTempSkill('gzkuangcai_more'); } }, }, more:{ mod:{ maxHandcard:function(player,num){ return num+2; }, }, charlotte:true, }, less:{ mod:{ maxHandcard:function(player,num){ return num-2; }, }, charlotte:true, }, }, }, gzshejian:{ audio:2, preHidden:true, trigger:{target:'useCardToTargeted'}, filter:function(event,player){ if(player==event.player||event.targets.length!=1) return false; var hs=player.getCards('h'); if(hs.length==0) return false; for(var i of hs){ if(!lib.filter.cardDiscardable(i,player,'gzshejian')) return false; } return true; }, check:function(event,player){ var target=event.player; if(get.damageEffect(target,player,player)<=0) return false; if(target.hp<=(player.hasSkill('gzcongjian')?2:1)&&!target.getEquip('huxinjing')&&!game.hasPlayer(function(current){ return current!=target&&!current.isFriendOf(player); })) return true; if(player.hasSkill('lirang')&&player.hasFriend()) return true; if((event.card.name=='guohe'||event.card.name=='shunshou'||event.card.name=='zhujinqiyuan')&&player.countCards('h')==1) return true; if(player.countCards('h')<3&&!player.countCards('h',function(card){ return get.value(card,player)>5; })) return true; if(player.hp<=event.getParent().baseDamage){ if(get.tag(event.card,'respondSha')){ if(player.countCards('h',{name:'sha'})==0){ return true; } } else if(get.tag(event.card,'respondShan')){ if(player.countCards('h',{name:'shan'})==0){ return true; } } else if(get.tag(event.card,'damage')){ if(event.card.name=='shuiyanqijunx') return player.countCards('e')==0; return true; } } return false; }, logTarget:'player', content:function(){ 'step 0' var cards=player.getCards('h'); event.num=cards.length; player.discard(cards); 'step 1' var target=trigger.player,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',()=>1); 'step 2' if(result.index==0) player.discardPlayerCard(target,num,true,'he'); else target.damage(); }, }, gzpozhen:{ audio:2, trigger:{global:'phaseBegin'}, limited:true, preHidden:true, filter:function(event,player){ return player!=event.player; }, logTarget:'player', skillAnimation:true, animationColor:'orange', check:function(event,player){ var target=event.player; if(get.attitude(player,target)>=-3) return false; if(event.player.hasJudge('lebu')&&!game.hasPlayer(function(current){ return get.attitude(current,target)>0&¤t.hasWuxie(); })) return false; var num=Math.min(target.getCardUsable('sha'),target.countCards('h',function(card){ return get.name(card,target)=='sha'&&target.hasValueTarget(card); }))+target.countCards('h',function(card){ return get.name(card,target)!='sha'&&target.hasValueTarget(card); }); return num>=Math.max(2,target.hp); }, content:function(){ 'step 0' player.awakenSkill('gzpozhen'); var target=trigger.player; target.addTempSkill('gzpozhen2'); var list=game.filterPlayer(function(current){ return current!=target&&(current.inline(target)|| (current==target.getNext().getNext()&¤t.siege(target.getNext())||current==target.getPrevious().getPrevious()&¤t.siege(target.getPrevious()))); }); if(list.length){ list.add(target); list.sortBySeat(target); event.targets=list; } else event.finish(); 'step 1' var target=targets.shift(); if(target.countDiscardableCards(player,'he')>0) player.discardPlayerCard(target,'he',true).boolline=true; if(targets.length) event.redo(); }, }, gzpozhen2:{ mod:{ cardEnabled2:function(card){ if(get.position(card)=='h') return false; }, cardRecastable:function(card){ if(get.position(card)=='h') return false; }, }, }, gzjiancai:{ audio:2, viceSkill:true, trigger:{global:'damageBegin4'}, preHidden:true, init:function(player,skill){ if(player.checkViceSkill(skill)&&!player.viceChanged) player.removeMaxHp(); }, filter:function(event,player){ return event.player.isFriendOf(player)&&event.num>=event.player.hp; }, check:function(event,player){ if(get.attitude(player,event.player)<3) return false; if(event.num>=1||player.storage.gzpozhen) return true; 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.num-event.player.hp) return false; return true; }, logTarget:'player', skillAnimation:true, animationColor:'orange', content:function(){ trigger.cancel(); player.changeVice(); }, group:'gzjiancai_add', subSkill:{ add:{ trigger:{global:'changeViceBegin'}, logTarget:'player', forced:true, locked:false, prompt:function(event,player){ return get.translation(event.player)+'即将变更副将,是否发动【荐才】,令其此次变更副将时增加两张可选武将牌?'; }, filter:function(event,player){ return event.player.isFriendOf(player); }, content:function(){ trigger.num+=2; }, }, }, }, gzxingzhao:{ audio:2, getNum:function(){ var list=[],players=game.filterPlayer(); for(var target of players){ if(target.isUnseen()||target.isHealthy()) continue; var add=true; for(var i of list){ if(i.isFriendOf(target)){ add=false; break; } } if(add) list.add(target); } return list.length; }, mod:{ maxHandcard:function(player,num){ return num+(lib.skill.gzxingzhao.getNum()>2?4:0); }, }, group:['gzxingzhao_xunxun','gzxingzhao_use','gzxingzhao_lose'], preHidden:['gzxingzhao_xunxun','gzxingzhao_use','gzxingzhao_lose'], subfrequent:['use'], subSkill:{ xunxun:{ audio:2, name:'恂恂', description:'摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。', trigger:{player:'phaseDrawBegin1'}, filter:function(event,player){ return lib.skill.gzxingzhao.getNum()>0; }, content:function(){ 'step 0' var cards=get.cards(4); game.cardsGotoOrdering(cards); var next=player.chooseToMove('恂恂:将两张牌置于牌堆顶',true); next.set('list',[ ['牌堆顶',cards], ['牌堆底'], ]); next.set('filterMove',function(from,to,moved){ if(to==1&&moved[1].length>=2) return false; return true; }); next.set('filterOk',function(moved){ return moved[1].length==2; }); next.set('processAI',function(list){ var cards=list[0][1].slice(0).sort(function(a,b){ return get.value(b)-get.value(a); }); return [cards,cards.splice(2)]; }) 'step 1' var top=result.moved[0]; var bottom=result.moved[1]; top.reverse(); for(var i=0;i1&&!player.isMaxHandcard(); }, frequent:true, content:function(){ player.draw(); }, }, draw:{ audio:'gzxingzhao', trigger:{player:'damageEnd'}, forced:true, filter:function(event,player){ return lib.skill.gzxingzhao.getNum()>1&&event.source &&event.source.isAlive()&&event.source.countCards('h')!=player.countCards('h'); }, logTarget:function(event,player){ var target=event.source; return target.countCards('h')>player.countCards('h')?player:target; }, check:function(event,player){ return get.attitude(player,lib.skill.gzxingzhao_draw.logTarget(event,player))>0; }, content:function(){ lib.skill.gzxingzhao_draw.logTarget(trigger,player).draw(); }, }, skip:{ audio:'gzxingzhao', trigger:{player:'phaseDiscardBefore'}, forced:true, filter:function(){ return lib.skill.gzxingzhao.getNum()>2; }, content:function(){ trigger.cancel(); game.log(player,'跳过了','#y弃牌阶段'); }, }, lose:{ audio:'gzxingzhao', trigger:{ player:'loseAfter', global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, filter:function(event,player){ var evt=event.getl(player); return evt&&evt.player==player&&evt.es&&evt.es.length>0&&lib.skill.gzxingzhao.getNum()>3; }, forced:true, content:function(){player.draw()}, }, }, ai:{ threaten:3, effect:{ target:function(card,player,target,current){ if(lib.skill.gzxingzhao.getNum()>3&&get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; } }, reverseEquip:true, skillTagFilter:function(){ return lib.skill.gzxingzhao.getNum()>3; }, }, }, qiuan:{ audio:2, trigger:{player:'damageBegin2'}, filter:function(event,player){ return event.cards&&event.cards.filterInD().length>0&&!player.getExpansions('qiuan').length; }, check:function(event,player){ if(get.damageEffect(player,event.source||player,player,event.nature)>=0) return false; return true; }, preHidden:true, content:function(){ var cards=trigger.cards.filterInD(); player.addToExpansion('gain2',cards).gaintag.add('qiuan'); trigger.cancel(); }, intro:{ content:'expansion', markcount:'expansion', }, marktext:'函', }, liangfan:{ audio:2, trigger:{player:'phaseZhunbeiBegin'}, forced:true, filter:function(event,player){ return player.getExpansions('qiuan').length>0; }, content:function(){ 'step 0' var cards=player.getExpansions('qiuan'); player.gain(cards,'gain2').gaintag.add('liangfan'); player.addTempSkill('liangfan2'); 'step 1' player.loseHp(); }, }, liangfan2:{ audio:'liangfan', mark:true, mod:{ aiOrder:function(player,card,num){ if(get.itemtype(card)=='card'&&card.hasGaintag('liangfan')) return num+0.1; }, }, intro:{content:'使用“量反”牌造成伤害后,可获得目标角色的一张牌'}, trigger:{source:'damageEnd'}, logTarget:'player', charlotte:true, onremove:function(player){ player.removeGaintag('liangfan'); }, prompt:(event)=>('量反:是否获得'+get.translation(event.player)+'的一张牌?'), filter:function(event,player){ var evt=event.getParent(2); if(evt.name!='useCard'||evt.card!=event.card) return false; if(!event.player.countGainableCards(player,'he')) return false; return player.getHistory('lose',function(evt2){ if(evt2.getParent()!=evt) return false; for(var i in evt2.gaintag_map){ if(evt2.gaintag_map[i].includes('liangfan')) return true; } return false; }).length>0; }, marktext:'反', content:function(){ player.gainPlayerCard(trigger.player,true,'he'); }, }, gzwenji:{ audio:2, trigger:{player:'phaseUseBegin'}, direct:true, filter:function(event,player){ return game.hasPlayer(function(current){ return current!=player&¤t.countCards('he'); }); }, preHidden:true, content:function(){ 'step 0' player.chooseTarget(get.prompt2('gzwenji'),function(card,player,target){ return target!=player&&target.countCards('he')>0; }).set('ai',function(target){ var att=get.attitude(_status.event.player,target); if(target.identity=='unknown'&&att<=0) return 20; 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('gzwenji',target); target.chooseCard('he',true,'问计:将一张牌交给'+get.translation(player)); } else{ event.finish(); } 'step 2' if(result.bool){ event.card=result.cards[0]; target.give(result.cards,player).gaintag.add('gzwenji'); } 'step 3' if(target.identity=='unknown'||target.isFriendOf(player)){ player.addTempSkill('gzwenji_respond'); event.finish(); } else if(target.isIn()&&player.countCards('he',function(card){ return !card.hasGaintag('gzwenji'); })){ player.chooseCard('he','交给'+get.translation(target)+'一张其他牌,或令其摸一张牌',function(card){ return !card.hasGaintag('gzwenji'); }).set('ai',function(card){ return 5-get.value(card); }); } else event.finish(); 'step 4' if(result.bool){ player.give(result.cards,target); player.removeGaintag('gzwenji'); } else{ target.draw(); } }, subSkill:{ respond:{ onremove:function(player){ player.removeGaintag('gzwenji'); }, mod:{ targetInRange:function(card,player,target){ if(!card.cards) return; for(var i of card.cards){ if(i.hasGaintag('gzwenji')) return true; } }, cardUsable:function(card,player,target){ if(!card.cards) return; for(var i of card.cards){ if(i.hasGaintag('gzwenji')) return Infinity; } }, }, trigger:{player:'useCard'}, forced:true, charlotte:true, audio:'gzwenji', filter:function(event,player){ 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('gzwenji')) return true; } return false; }).length>0; }, content:function(){ trigger.directHit.addArray(game.filterPlayer(function(current){ return current!=player; })); 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]--; } }, ai:{ directHit_ai:true, skillTagFilter:function(player,tag,arg){ return arg.card&&arg.card.cards&&arg.card.cards.filter((card)=>card.hasGaintag('gzwenji')).length>0; }, }, } } }, gztunjiang:{ audio:2, trigger:{player:'phaseJieshuBegin'}, frequent:true, preHidden:true, filter:function(event,player){ if(!player.getHistory('useCard',function(evt){ return evt.isPhaseUsing(); }).length) return false; return player.getHistory('useCard',function(evt){ if(evt.targets&&evt.targets.length&&evt.isPhaseUsing()){ var targets=evt.targets.slice(0); while(targets.includes(player)) targets.remove(player); return targets.length>0; } return false; }).length==0; }, content:function(){ player.draw(game.countGroup()); }, }, gzbushi:{ audio:2, trigger:{player:'damageEnd'}, frequent:true, preHidden:true, content:function(){ 'step 0' event.count=trigger.num; 'step 1' event.count--; player.draw(); 'step 2' if(event.count>0){ player.chooseBool(get.prompt2('gzbushi')).set('frequentSkill','gzbushi'); } else event.finish(); 'step 3' if(result.bool) event.goto(1); }, group:'gzbushi_draw', subSkill:{ draw:{ trigger:{source:'damageSource'}, direct:true, noHidden:true, filter:function(event,player){ return event.player.isEnemyOf(player)&&event.player.isIn(); }, content:function(){ 'step 0' trigger.player.chooseBool('是否对'+get.translation(player)+'发动【布施】?','你摸一张牌,然后其摸一张牌'); 'step 1' if(result.bool){ player.logSkill('gzbushi',trigger.player); game.asyncDraw([trigger.player,player]); } else event.finish(); 'step 2' game.delayx(); }, }, }, }, gzbushi_old:{ audio:2, trigger:{ player:'damageEnd', source:'damageSource', }, forced:true, filter:function(event,player,name){ if(name=='damageSource'&&player==event.player) return false; return game.hasPlayer(function(current){ return current.isFriendOf(event.player); }); }, check:function(event,player){ return player.isFriendOf(event.player); }, content:function(){ 'step 0' event.count=trigger.num; if(event.triggername=='damageSource') event.count=1; 'step 1' event.count--; var target=trigger.player; var list=game.filterPlayer(function(current){ return current.isFriendOf(target); }); if(list.length){ if(list.length==1) event._result={bool:true,targets:list}; else player.chooseTarget('布施:令一名与'+(player==target?'你':get.translation(target))+'势力相同的角色摸一张牌',true,function(card,player,target){ return target.isFriendOf(_status.event.target) }).set('target',target); } else event.finish(); 'step 2' if(result.bool){ var target=result.targets[0]; player.line(target,'green'); target.draw(); if(event.count) event.goto(1); } }, }, gzmidao:{ audio:2, trigger:{global:'useCardToPlayered'}, direct:true, //noHidden:true, filter:function(event,player){ var target=event.player; return event.isFirstTarget&&target.isFriendOf(player)&& target.isPhaseUsing()&&(target==player||player.hasSkill('gzmidao'))&& (['basic','trick'].includes(get.type(event.card))&&get.tag(event.card,'damage')>0)&& event.cards&&event.cards.length&&!target.hasSkill('gzmidao2'); }, preHidden:true, content:function(){ 'step 0' var next=trigger.player.chooseBool('是否对'+get.translation(player)+'发动【米道】?','令该角色修改'+get.translation(trigger.card)+'的花色和伤害属性'); next.set('ai',()=>false); if(player==next.player) next.setHiddenSkill(event.name); 'step 1' if(result.bool){ player.logSkill('gzmidao'); trigger.player.addTempSkill('gzmidao2'); if(player!=trigger.player){ trigger.player.line(player,'green'); //player.gain(result.cards,trigger.player,'giveAuto'); } } else event.finish(); 'step 2' if(player.isUnderControl()){ game.swapPlayerAuto(player); } var switchToAuto=function(){ _status.imchoosing=false; var listn=['普通'].concat(lib.inpile_nature); event._result={ bool:true, suit:lib.suit.randomGet(), nature:listn.randomGet(), }; if(event.dialog) event.dialog.close(); if(event.control) event.control.close(); }; var chooseButton=function(player,card){ var event=_status.event; player=player||event.player; if(!event._result) event._result={}; var dialog=ui.create.dialog('米道:请修改'+card+'的花色和属性','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'); } 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'; var listn=['普通'].concat(lib.inpile_nature); 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.nature=link; }); } dialog.content.appendChild(table2); dialog.add('  '); event.dialog.open(); event.switchToAuto=function(){ event._result={ bool:true, nature:listn.randomGet(), suit:listi.randomGet(), }; event.dialog.close(); event.control.close(); game.resume(); _status.imchoosing=false; }; event.control=ui.create.control('ok','cancel2',function(link){ var result=event._result; if(link=='cancel2') result.bool=false; else{ if(!result.nature||!result.suit) return; result.bool=true; } event.dialog.close(); event.control.close(); game.resume(); _status.imchoosing=false; }); for(var i=0;i=0) return 0; if(target.countCards('e',function(card){ return get.value(card,target)>=7-player.hp; })>0) return 1; var dist=get.distance(player,target,'attack'); if(dist>1&&dist-target.countCards('e')<=1) return true; return 0; }); 'step 1' if(result.index==0) player.draw(); else{ target.discardPlayerCard(player,'e',true); target.loseHp(); } }, }, gzlixia:{ audio:2, trigger:{global:'phaseZhunbeiBegin'}, noHidden:true, direct:true, filter:function(event,player){ return player!=event.player&&!event.player.isFriendOf(player)&&player.countDiscardableCards(event.player,'e')>0; }, content:function(){ 'step 0' trigger.player.chooseBool('是否对'+get.translation(player)+'发动【礼下】?','弃置其装备区内的一张牌,然后选择一项:①弃置两张牌。②失去1点体力。③令其摸两张牌。').set('ai',function(){ var player=_status.event.player; var target=_status.event.getParent().player; if(get.attitude(player,target)>0) return target.countCards('e',function(card){ return get.value(card,target)<3; })>0; if(target.countCards('e',function(card){ return get.value(card,target)>=7; })) return true; var dist=get.distance(player,target,'attack'); if(dist>1&&dist-target.countCards('e')<=1) return true; return false; }); 'step 1' if(result.bool){ var target=trigger.player; event.target=target; player.logSkill('gzlixia'); target.line(player,'green'); target.discardPlayerCard(player,'e',true); } else event.finish(); 'step 2' var list=['失去1点体力','令'+get.translation(player)+'摸两张牌']; event.addIndex=0; if(target.countCards('h',function(card){ return lib.filter.cardDiscardable(card,target,'gzlixia'); })>1) list.unshift('弃置两张牌'); else event.addIndex++; target.chooseControl().set('choiceList',list).set('ai',function(){ var num=2; var player=_status.event.player; var target=_status.event.getParent().player; if(get.attitude(player,target)>=0) num=2; else if(player.countCards('he',function(card){ return lib.filter.cardDiscardable(card,player,'gzlixia')&&get.value(card,player)<5; })>1) num=0; else if(player.hp+player.countCards('h','tao')>3&&!player.hasJudge('lebu')) num=1; return num-_status.event.getParent().addIndex; }); 'step 3' switch(result.index+event.addIndex){ case 0: target.chooseToDiscard(2,'h',true); break; case 1: target.loseHp(); break; case 2: player.draw(2); break; } }, }, yigui:{ audio:2, hiddenCard:function(player,name){ var storage=player.storage.yigui; if(name=='shan'||name=='wuxie'||!storage||!storage.character.length||storage.used.includes(name)||!lib.inpile.includes(name)) return false; return true; }, init:function(player,skill){ if(!player.storage.skill) player.storage[skill]={ character:[], used:[], } }, enable:"chooseToUse", filter:function(event,player){ if(event.type=='wuxie'||event.type=='respondShan') return false; var storage=player.storage.yigui; if(!storage||!storage.character.length) return false; if(event.type=='dying'){ if((!event.filterCard({name:'tao'},player,event)||storage.used.includes('tao'))&& (!event.filterCard({name:'jiu'},player,event)||storage.used.includes('jiu'))) return false; var target=event.dying; if(target.identity=='unknown'||target.identity=='ye') return true; for(var i=0;i1) return (1.7+Math.random())*Math.max(num,1); } } return 1+Math.random(); }, filter:function(button,player){ var evt=_status.event.getParent('chooseToUse'); if(!ui.selected.buttons.length){ if(typeof button.link!='string') return false; if(evt.type=='dying'){ if(evt.dying.identity=='unknown'||evt.dying.identity=='ye') return true; var double=get.is.double(button.link,true); return evt.dying.identity==lib.character[button.link][1]||lib.character[button.link][1]=='ye'||(double&&double.includes(evt.dying.identity)); } return true; } else{ if(typeof ui.selected.buttons[0].link!='string') return false; if(typeof button.link!='object') return false; var name=button.link[2]; if(player.storage.yigui.used.includes(name)) return false; var card={name:name}; if(button.link[3]) card.nature=button.link[3]; var info=get.info(card); var group=lib.character[ui.selected.buttons[0].link][1]; var double=get.is.double(ui.selected.buttons[0].link,true); if(evt.type=='dying'){ return evt.filterCard(card,player,evt); } if(!lib.filter.filterCard(card,player,evt)) return false; else if(evt.filterCard&&!evt.filterCard(card,player,evt)) return false; if(info.changeTarget){ var list=game.filterPlayer(function(current){ return player.canUse(card,current); }); for(var i=0;ifalse, selectCard:-1, complexCard:true, check:()=>1, popname:true, audio:'yigui', viewAs:{name:'shan',isCard:true}, onuse:function(result,player){ player.logSkill('yigui'); var character=lib.skill.yigui_gzshan_backup.character; player.flashAvatar('yigui',character); player.storage.yigui.character.remove(character); _status.characterlist.add(character); game.log(player,'从「魂」中移除了','#g'+get.translation(character)); player.syncStorage('yigui'); player.updateMarks('yigui'); player.storage.yigui.used.add(result.card.name); }, }; return next; }, }, ai:{ respondShan:true, skillTagFilter:function(player,tag,arg){ if(arg=='respond'||!lib.inpile.includes('shan')) return false; var storage=player.storage.yigui; if(!storage||!storage.character.length||storage.used.includes('shan')) return false; }, order:0.1, result:{player:1}, }, }, yigui_gzwuxie:{ hiddenWuxie(player,info){ if(!lib.inpile.includes('wuxie')) return false; const storage=player.storage.yigui; if(!storage||!storage.character||!storage.character.length||(storage.used&&storage.used.includes('wuxie'))) return false; if(_status.connectMode) return true; const target=info.target; if(!target) return false; const identity=target.identity; return ['unknown','ye'].includes(identity)||storage.character.some(function(i){ if(lib.character[i][1]=='ye') return true; const double=get.is.double(i,true); return (double?double:[lib.character[i][1]]).includes(identity); }); }, enable:'chooseToUse', filter(event,player){ if(event.type!='wuxie'||!lib.inpile.includes('wuxie')) return false; const storage=player.storage.yigui; if(!storage||!storage.character||!storage.character.length||(storage.used&&storage.used.includes('wuxie'))) return false; const info=event.info_map,target=info.target,identity=target.identity; return ['unknown','ye'].includes(identity)||storage.character.some(function(i){ if(lib.character[i][1]=='ye') return true; const double=get.is.double(i,true); return (double?double:[lib.character[i][1]]).includes(identity); }); }, chooseButton:{ dialog(event,player){ let dialog=ui.create.dialog('役鬼','hidden'); dialog.add([player.storage.yigui.character,'character']); return dialog; }, filter(button,player){ const evt=get.event().getParent('chooseToUse'); const info=evt.info_map,target=info.target,identity=target.identity; if(['unknown','ye'].includes(identity)) return true; if(lib.character[button.link][1]=='ye') return true; const double=get.is.double(button.link,true); return (double?double:[lib.character[button.link][1]]).includes(identity); }, check(button){ return 1+Math.random(); }, backup(links,player){ return { character:links[0], filterCard:()=>false, selectCard:-1, complexCard:true, check:()=>1, popname:true, audio:'yigui', viewAs:{name:'wuxie',isCard:true}, onuse(result,player){ player.logSkill('yigui'); const character=lib.skill.yigui_gzwuxie_backup.character; player.flashAvatar('yigui',character); player.storage.yigui.character.remove(character); _status.characterlist.add(character); game.log(player,'从「魂」中移除了','#g'+get.translation(character)); player.syncStorage('yigui'); player.updateMarks('yigui'); player.storage.yigui.used.add(result.card.name); }, }; }, }, ai:{ order:0.1, result:{player:1}, }, }, jihun:{ trigger:{ player:'damageEnd', global:'dyingAfter', }, audio:2, frequent:true, preHidden:true, filter:function(event,player){ return event.name=='damage'||(event.player.isAlive()&&!event.player.isFriendOf(player)) }, content:function(){ var list=_status.characterlist.randomGets(1); if(list.length){ _status.characterlist.removeArray(list); player.storage.yigui.character.addArray(list); lib.skill.gzhuashen.drawCharacter(player,list); player.syncStorage('yigui'); player.updateMarks('yigui'); game.log(player,'获得了'+get.cnNumber(list.length)+'张「魂」'); } }, }, gzbuyi:{ trigger:{global:'dyingAfter'}, usable:1, filter:function(event,player){ if(!(event.player&&event.player.isAlive()&&event.source&&event.source.isAlive())) return false; return event.player.isFriendOf(player)&&event.reason&&event.reason.name=='damage'; }, check:function(event,player){return get.attitude(player,event.player)>0}, logTarget:'source', preHidden:true, content:function(){ 'step 0' player.chooseJunlingFor(trigger.source); 'step 1' event.junling=result.junling; event.targets=result.targets; var choiceList=[]; choiceList.push('执行该军令'); choiceList.push('令'+get.translation(trigger.player)+(trigger.player==trigger.source?'(你)':'')+'回复1点体力'); trigger.source.chooseJunlingControl(player,result.junling,result.targets).set('prompt','补益').set('choiceList',choiceList).set('ai',function(){ if(get.recoverEffect(trigger.player,player,_status.event.player)>0) return 1; return (get.attitude(trigger.source,trigger.player)<0&&get.junlingEffect(player,result.junling,trigger.source,result.targets,trigger.source)>=-2)?1:0; }); 'step 2' if(result.index==0) trigger.source.carryOutJunling(player,event.junling,targets); else trigger.player.recover(player); }, audio:['buyi',2], }, keshou:{ audio:2, trigger:{player:'damageBegin3'}, filter:function(event,player){ return event.num>0; }, direct:true, preHidden:true, content:function(){ 'step 0' var check=(player.countCards('h',{color:'red'})>1||player.countCards('h',{color:'black'})>1); player.chooseCard(get.prompt('keshou'),'弃置两张颜色相同的牌,令即将受到的伤害-1','he',2,function(card){ if(ui.selected.cards.length) return get.color(card)==get.color(ui.selected.cards[0]); return true; }).set('complexCard',true).set('ai',function(card){ if(!_status.event.check) return 0; var player=_status.event.player; if(player.hp==1){ if(!player.countCards('h',function(card){return get.tag(card,'save')})&&!player.hasSkillTag('save',true)) return 10-get.value(card); return 7-get.value(card); } return 6-get.value(card); }).set('check',check).setHiddenSkill(event.name); 'step 1' var logged=false; if(result.cards){ logged=true; player.logSkill('keshou'); player.discard(result.cards); trigger.num--; } if(!player.isUnseen()&&!game.hasPlayer(function(current){ return current!=player&¤t.isFriendOf(player); })){ if(!logged) player.logSkill('keshou'); player.judge(function(card){ if(get.color(card)=='red') return 1; return 0; }); } else event.finish(); 'step 2' if(result.judge>0) player.draw(); } }, zhuwei:{ audio:2, trigger:{player:'judgeEnd'}, filter:function(event){ if(get.owner(event.result.card)) return false; if(event.nogain&&event.nogain(event.result.card)) return false; return true; //return event.result.card.name=='sha'||event.result.card.name=='juedou'; }, frequent:true, preHidden:true, content:function(){ 'step 0' player.gain(trigger.result.card,'gain2'); player.chooseBool('是否令'+get.translation(_status.currentPhase)+'本回合的手牌上限和使用【杀】的次数上限+1?').ai=function(){ return get.attitude(player,_status.currentPhase)>0; }; 'step 1' if(result.bool){ var target=_status.currentPhase; if(!target.hasSkill('zhuwei_eff')){ target.addTempSkill('zhuwei_eff'); target.storage.zhuwei_eff=1; } else target.storage.zhuwei_eff++; target.updateMarks(); } }, subSkill:{ eff:{ sub:true, mod:{ cardUsable:function(card,player,num){ if(card.name=='sha') return num+player.storage.zhuwei_eff; }, maxHandcard:function(player,num){return num+player.storage.zhuwei_eff} }, mark:true, charlotte:true, intro:{ content:function(storage){if(storage) return '使用【杀】的次数上限+'+storage+',手牌上限+'+storage} } } } }, gzweidi:{ init:function(player){player.storage.gzweidi=[]}, enable:'phaseUse', usable:1, filter:function(event,player){ return player.storage.gzweidi.length>0 }, filterTarget:function(card,player,target){return target!=player&&player.storage.gzweidi.includes(target)}, content:function(){ 'step 0' player.chooseJunlingFor(target); 'step 1' event.junling=result.junling; event.targets=result.targets; var choiceList=['执行该军令']; if(target!=player) choiceList.push('令'+get.translation(player)+'获得你所有手牌,然后交给你等量的牌'); else choiceList.push('不执行该军令'); target.chooseJunlingControl(player,result.junling,result.targets).set('prompt','伪帝').set('choiceList',choiceList).set('ai',function(){ if(get.attitude(target,player)>=0) return get.junlingEffect(player,result.junling,target,result.targets,target)>=0?0:1; return get.junlingEffect(player,result.junling,target,result.targets,target)>=-1?0:1; }); 'step 2' if(result.index==0) target.carryOutJunling(player,event.junling,targets); else if(target!=player&&target.countCards('h')) { event.num=target.countCards('h'); player.gain(target.getCards('h'),target,'giveAuto'); player.chooseCard('交给'+get.translation(target)+get.cnNumber(event.num)+'张牌','he',event.num,true).set('ai',function(card){ return -get.value(card); }); } else event.finish(); 'step 3' if(result.cards){ player.give(result.cards,target); } }, group:['gzweidi_ft','gzweidi_ftc'], ai:{ order:3, result:{ player:1, } }, subSkill:{ ft:{ sub:true, trigger:{global:'gainBefore'}, silent:true, filter:function(event,player){ if(player==event.player||player.storage.gzweidi.includes(event.player)||_status.currentPhase!=player) return false; if(event.cards.length){ if(event.getParent().name=='draw') return true; for(var i=0;i0; }) }, content:function(){trigger.num++}, audio:['yongsi1',2], }, eff2:{ sub:true, trigger:{player:'phaseUseBegin'}, //priority:8, forced:true, noHidden:true, equipSkill:true, filter:function(event,player){ if(player.isDisabled(5)) return false; return game.hasPlayer(function(current){ return player.canUse('zhibi',current); })&&!game.hasPlayer(function(current){ return current.getEquips('yuxi').length>0; }); }, content:function(){ player.chooseUseTarget('玉玺(庸肆):选择知己知彼的目标',{name:'zhibi'}); }, audio:['yongsi1',2], }, eff3:{ sub:true, trigger:{global:'useCardToTargeted'}, //priority:16, forced:true, filter:function(event,player){ return event.target&&event.target==player&&event.card&&event.card.name=='zhibi' }, check:function(){return false}, content:function(){ player.showHandcards(); } } } }, gzfudi:{ trigger:{global:'damageEnd'}, direct:true, preHidden:true, audio:2, filter:function(event,player){return event.source&&event.source.isAlive()&&event.source!=player&&event.player==player&&player.countCards('h')&&event.num>0}, content:function(){ 'step 0' var players=game.filterPlayer(function(current){ return current.isFriendOf(trigger.source)&¤t.hp>=player.hp&&!game.hasPlayer(function(current2){ return current2.hp>current.hp&¤t2.isFriendOf(trigger.source); }) }); var check=true; if(!players.length) check=false; else{ if(get.attitude(player,trigger.source)>=0) check=false; } player.chooseCard(get.prompt('gzfudi',trigger.source),'交给其一张手牌,然后对其势力中体力值最大且不小于你的一名角色造成1点伤害').set('aicheck',check).set('ai',function(card){ if(!_status.event.aicheck) return 0; return 9-get.value(card); }).setHiddenSkill(event.name); 'step 1' if(result.bool){ player.logSkill('gzfudi',trigger.source); player.give(result.cards,trigger.source); } else event.finish(); 'step 2' var list=game.filterPlayer(function(current){ return current.hp>=player.hp&¤t.isFriendOf(trigger.source)&&!game.hasPlayer(function(current2){ return current2.hp>current.hp&¤t2.isFriendOf(trigger.source); }); }); if(list.length){ if(list.length==1) event._result={bool:true,targets:list}; else player.chooseTarget(true,'对'+get.translation(trigger.source)+'势力中体力值最大的一名角色造成1点伤害',function(card,player,target){ return _status.event.list.includes(target); }).set('list',list).set('ai',function(target){return get.damageEffect(target,player,player)}); } else event.finish(); 'step 3' if(result.bool&&result.targets.length){ player.line(result.targets[0]); result.targets[0].damage(); } }, ai:{ maixie:true, maixie_defend:true, effect:{ target:function(card,player,target){ if(get.tag(card,'damage')&&target.hp>1){ if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; if(!target.countCards('h')) return [1,-1]; if(game.countPlayer(function(current){return current.isFriendOf(player)&¤t.hp>=target.hp-1})) return [1,0,0,-2]; } } } } }, gzcongjian:{ trigger:{ player:'damageBegin3', source:'damageBegin1', }, forced:true, preHidden:true, audio:'drlt_congjian', filter:function(event,player,name){ if(event.num<=0) return false; if(name=='damageBegin1'&&_status.currentPhase!=player) return true; if(name=='damageBegin3'&&_status.currentPhase==player) return true; return false; }, check:function(event,player){ return _status.currentPhase!=player; }, content:function(){trigger.num++}, }, jianan:{ audio:2, unique:true, forceunique:true, group:'wuziliangjiangdao', derivation:'wuziliangjiangdao', lordSkill:true, global:'g_jianan', }, g_jianan:{ trigger:{ player:['phaseZhunbeiBegin','phaseBefore','dieBegin'], }, audio:'jianan', forceaudio:true, filter:function(event,player,name){ if(name!='phaseZhunbeiBegin') return get.is.jun(player)&&player.identity=='wei'; return this.filter2.apply(this,arguments); }, filter2:function(event,player){ if(!get.zhu(player,'jianan')) return false; if(!player.countCards('he')) return false; return !player.isUnseen(); }, direct:true, content:function(){ 'step 0' if(event.triggername!='phaseZhunbeiBegin'){ event.trigger('jiananUpdate'); event.finish(); return; } var skills=['new_retuxi','qiaobian','fakexiaoguo','gzjieyue','new_duanliang']; game.countPlayer(function(current){ if(current==player) return; if(current.hasSkill('new_retuxi')) skills.remove('new_retuxi'); if(current.hasSkill('qiaobian')) skills.remove('qiaobian'); if(current.hasSkill('fakexiaoguo')) skills.remove('fakexiaoguo'); if(current.hasSkill('gzjieyue')) skills.remove('gzjieyue'); if(current.hasSkill('new_duanliang')) skills.remove('new_duanliang'); }); if(!skills.length) event.finish(); else{ event.skills=skills; var next=player.chooseToDiscard('he'); var str=''; for(var i=0;i1) rank=4; if(skills.includes('gzjieyue')&&player.countCards('h',function(card){ return get.value(card)<7; })>1) rank=5; if(skills.includes('qiaobian')&&player.countCards('h')>4) rank=6; if((get.guozhanRank(player.name1,player)3) return 'qiaobian'; if(skills.includes('gzjieyue')&&player.countCards('h',function(card){ return get.value(card)<7; })) return 'gzjieyue'; if(skills.includes('new_retuxi')) return 'new_retuxi'; return skills.randomGet(); }).set("prompt","选择获得其中的一个技能直到君主的回合开始"); 'step 4' var link=result.control; player.addTempSkill(link,"jiananUpdate"); player.addTempSkill("jianan_eff","jiananUpdate"); game.log(player,"获得了技能","#g【"+get.translation(result.control)+"】"); }, }, jianan_eff:{ ai:{nomingzhi:true} }, huibian:{ enable:'phaseUse', audio:2, usable:1, filter:function(event,player){ return game.countPlayer(function(current){ return current.identity=='wei'; })>1&&game.hasPlayer(function(current){ return current.isDamaged()&¤t.identity=='wei'; }); }, filterTarget:function(card,player,target){ if(ui.selected.targets.length) return target.isDamaged()&&target.identity=='wei'; return target.identity=='wei'; }, selectTarget:2, multitarget:true, targetprompt:['受到伤害
    然后摸牌','回复体力'], content:function(){ 'step 0' targets[0].damage(player); 'step 1' if(targets[0].isAlive()) targets[0].draw(2); targets[1].recover(); }, ai:{ threaten:1.2, order:9, result:{ target:function(player,target){ if(ui.selected.targets.length) return 1; if(get.damageEffect(target,player,player)>0) return 2; if(target.hp>2) return 1; if(target.hp==1) return -1; return 0.1; } }, } }, gzzongyu:{ audio:2, unique:true, forceunique:true, group:['gzzongyu_others','gzzongyu_player'], ai:{ threaten:1.2, }, subSkill:{ others:{ trigger:{global:'equipAfter'}, direct:true, filter:function(event,player){ if(event.player==player||!player.countCards('e',{subtype:['equip3','equip4']})) return false; return event.card.name=='liulongcanjia'; }, check:function(event,player){ if(get.attitude(player,target)<=0) return player.countCards('e',{subtype:['equip4','equip4']})<2; return true; }, content:function(){ 'step 0' player.chooseBool('是否发动【总御】,与'+get.translation(trigger.player)+'交换装备区内坐骑牌?'); 'step 1' if(result.bool){ player.logSkill('gzzongyu',trigger.player); event.cards=[player.getCards('e',{subtype:['equip3','equip4']}),trigger.player.getCards('e',{name:'liulongcanjia'})]; player.lose(event.cards[0],ui.special); trigger.player.lose(event.cards[1],ui.special); if(event.cards[0].length) player.$give(event.cards[0],trigger.player); if(event.cards[1].length) trigger.player.$give(event.cards[1],player); } else event.finish(); 'step 2' for(var i=0;i0.7; return true; } }, preHidden:true, content:function(){ 'step 0' var choices=[]; if(game.hasPlayer(function(current){return current.isUnseen()})) choices.push('选择一名未确定势力的角色'); if(game.hasPlayer(function(current){return current!=player&&!current.isUnseen()})&&player.countCards('h',{type:'basic'})) choices.push('将一张基本牌交给一名已确定势力的角色'); if(choices.length==1){ event._result={index:choices[0]=='选择一名未确定势力的角色'?0:1}; } else player.chooseControl().set('ai',function(){ if(choices.length>1){ var player=_status.event.player; if(!game.hasPlayer(function(current){ return !current.isUnseen()&¤t.getEquip('yuxi')||current.hasSkill('gzyongsi')&&!game.hasPlayer(function(current){ return current.getEquips('yuxi').length>0; }); })&&game.hasPlayer(function(current){return current!=player&¤t.isUnseen()})){ var identity; for(var i=0;i=get.population(identity)) return 0; return 1; } return 0; }).set('prompt','征辟:请选择一项').set('choiceList',choices); 'step 1' if(result.index==0) player.chooseTarget('请选择一名未确定势力的角色',function(card,player,target){ return target!=player&&target.identity=='unknown' },true); else player.chooseCardTarget({ prompt:'请将一张基本牌交给一名已确定势力的其他角色', position:'h', filterCard:function(card){return get.type(card)=='basic'}, filterTarget:function(card,player,target){ return target!=player&&target.identity!='unknown'; }, ai1:function(card){return 5-get.value(card)}, ai2:function(target){ var player=_status.event.player; var att=get.attitude(player,target); if(att>0) return 0; return -(att-1)/target.countCards('h'); } }).set('forced',true); 'step 2' event.target=result.targets[0]; player.line(result.targets,'green'); if(result.cards.length){ event.cards=result.cards; player.give(result.cards,result.targets[0]); } else{ player.storage.gzzhengbi_eff1=result.targets[0]; player.addTempSkill('gzzhengbi_eff1','phaseUseAfter'); event.finish(); } 'step 3' var choices=[]; if(target.countCards('he',{type:['trick','delay','equip']})) choices.push('一张非基本牌'); if(target.countCards('h',{type:'basic'})>1) choices.push('两张基本牌'); if(choices.length) 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)+'…'); else{ if(target.countCards('h')){ var cards=target.getCards('h'); target.give(cards,player); event.finish(); } else event.finish(); } 'step 4' var check=(result.control=='一张非基本牌'); target.chooseCard('he',(check?1:2),{type:(check?['trick','delay','equip']:'basic')},true); 'step 5' if(result.cards){ target.give(result.cards,player); } }, subSkill:{ eff1:{ audio:'zhengbi', sub:true, onremove:true, trigger:{player:'phaseUseEnd'}, forced:true, charlotte:true, filter:function(event,player){ var target=player.storage.gzzhengbi_eff1; return target&&!target.isUnseen()&&target.countGainableCards(player,'he')>0; }, logTarget:function(event,player){ return player.storage.gzzhengbi_eff1; }, content:function(){ var num=0; var target=player.storage.gzzhengbi_eff1; if(target.countGainableCards(player,'h')) num++; if(target.countGainableCards(player,'e')) num++; if(num){ player.gainPlayerCard(target,num,'he',true).set('filterButton',function(button){ for(var i=0;i0; }, filterTarget:function(card,player,target){ return target==player; }, selectTarget:-1, discard:false, lose:false, content:function(){ 'step 0' player.awakenSkill('gzfengying'); player.storage.gzfengying=true; player.useCard({name:'xietianzi'},cards,target); 'step 1' var list=game.filterPlayer(function(current){ return current.isFriendOf(player)&¤t.countCards('h')=4) return 0; for(var i=0;i0) return 11-get.value(card); return 7-get.value(card); }, ai2:function(card,player,target){ var att=get.attitude(player,target); if(att<0) return -att; return 1; } }).setHiddenSkill('gzjieyue'); 'step 1' if(result.bool){ event.target=result.targets[0]; player.logSkill('gzjieyue',result.targets); player.give(result.cards[0],result.targets[0]); player.chooseJunlingFor(result.targets[0]); } else event.finish(); 'step 2' event.junling=result.junling; event.targets=result.targets; var choiceList=[]; choiceList.push('执行该军令,然后'+get.translation(player)+'摸一张牌'); choiceList.push('令'+get.translation(player)+'摸牌阶段额外摸三张牌'); target.chooseJunlingControl(player,result.junling,result.targets).set('prompt','节钺').set('choiceList',choiceList).set('ai',function(){ if(get.attitude(target,player)>0) return get.junlingEffect(player,result.junling,target,result.targets,target)>1?0:1; return get.junlingEffect(player,result.junling,target,result.targets,target)>=-1?0:1; }); 'step 3' if(result.index==0){ target.carryOutJunling(player,event.junling,targets); player.draw(); } else player.addTempSkill('gzjieyue_eff'); }, ai:{threaten:2}, subSkill:{ eff:{ sub:true, trigger:{player:'phaseDrawBegin2'}, filter:function(event,player){ return !event.numFixed; }, forced:true, popup:false, content:function(){ trigger.num+=3; } } }, audio:['jieyue',2], }, jianglue:{ limited:true, audio:2, enable:'phaseUse', prepare:function(cards,player){ var targets=game.filterPlayer(function(current){ return current.isFriendOf(player)||current.isUnseen(); }); player.line(targets,'fire'); }, content:function(){ 'step 0' player.awakenSkill('jianglue'); player.addTempSkill('jianglue_count'); player.chooseJunlingFor(player).set('prompt','选择一张军令牌,令与你势力相同的其他角色选择是否执行'); 'step 1' event.junling=result.junling; event.targets=result.targets; event.players=game.filterPlayer(function(current){ if(current==player) return false; return current.isFriendOf(player)||(player.identity!='ye'&¤t.isUnseen()); }).sort(lib.sort.seat); event.num=0; event.filterName=function(name){ return lib.character[name][1]==player.identity&&!get.is.double(name); } 'step 2' if(num3||event.current.countCards('e')>2)) return 1; return event.junling=='junling5'?1:0;}); else if((event.filterName(event.current.name1)||event.filterName(event.current.name2))&&event.current.wontYe(player.identity)){ event.showCharacter=true; choiceList[0]='明置一张武将牌以'+choiceList[0]; choiceList[1]='不明置武将牌且'+choiceList[1]; event.current.chooseJunlingControl(player,event.junling,targets).set('prompt','将略').set('choiceList',choiceList).set('ai',function(){if(event.junling=='junling6'&&(event.current.countCards('h')>3||event.current.countCards('e')>2)) return 1; return event.junling=='junling5'?1:0;}); } else event.current.chooseJunlingControl(player,event.junling,targets).set('prompt','将略').set('controls',['ok']); } else event.goto(4); 'step 3' event.carry=false; if(result.index==0&&result.control!='ok'){ event.carry=true; if(event.showCharacter){ var list=[]; if(event.filterName(event.current.name1)) list.push('主将'); if(event.filterName(event.current.name2)) list.push('副将'); if(list.length>1) event.current.chooseControl(['主将','副将']).set('ai',function(){ if(player.name1=='gz_fazheng') return 0; if(player.name2=='gz_fazheng') return 1; return Math.random()>0.5?0:1; }).prompt='选择并展示一张武将牌,然后执行军令'; else event._result={index:list[0]=='主将'?0:1}; } } 'step 4' if(!event.list) event.list=[player]; if(event.carry){ if(event.showCharacter) event.current.showCharacter(result.index); event.current.carryOutJunling(player,event.junling,targets); event.list.push(event.current); } event.num++; if(event.num0) player.draw(player.storage.jianglue_count); }, marktext:'略', skillAnimation:'epic', animationColor:'soil', ai:{ order:10, result:{ player:function(player){ if(player.isUnseen()&&player.wontYe()){ if(get.population(player.group)>=game.players.length/4) return 1; return Math.random()>0.7?1:0; } else return 1; } } }, subSkill:{ count:{ sub:true, trigger:{global:'recoverAfter'}, silent:true, filter:function(event){return event.getParent('jianglue')}, content:function(){player.storage.jianglue_count++} } } }, gzxuanhuo:{ audio:'rexuanhuo', global:'gzxuanhuo_others', derivation:['fz_new_rewusheng','fz_gzpaoxiao','fz_new_longdan','fz_new_tieji','fz_liegong','fz_xinkuanggu'], ai:{ threaten:function(player,target){ if(game.hasPlayer(function(current){ return current!=target&¤t.isFriendOf(target); })) return 1.5; return 0.5; }, }, subSkill:{ others:{ audio:'rexuanhuo', forceaudio:true, enable:'phaseUse', usable:1, filter:function(event,player){ return (!player.isUnseen())&&player.countCards('h')>0&&game.hasPlayer(function(current){ return current!=player&¤t.hasSkill('gzxuanhuo')&&player.isFriendOf(current); }); }, prompt:'弃置一张手牌,然后获得以下技能中的一个:〖武圣〗〖咆哮〗〖龙胆〗〖铁骑〗〖烈弓〗〖狂骨〗', position:'h', filterCard:true, check:function(card){ var player=_status.event.player; if(player.hasSkill('gzpaoxiao',true)||player.getEquip('zhuge')) return 0; if(player.countCards('h',function(cardx){ return cardx!=card&&cardx.name=='sha'&&player.hasUseTarget(cardx); })<(player.getCardUsable('sha')+1)) return 0; return 7-get.value(card); }, content:function(){ 'step 0' var list=['new_rewusheng','gzpaoxiao','new_longdan','new_tieji','liegong','xinkuanggu']; player.chooseControl(list).set('ai',function(){ if(list.includes('gzpaoxiao')) return 'gzpaoxiao'; return list.randomGet(); }).set('prompt','选择并获得一项技能直到回合结束'); 'step 1' player.popup(result.control); player.addTempSkill('fz_'+result.control); game.log(player,'获得了技能','#g【'+get.translation(result.control)+'】'); game.delay(); }, // forceaudio:true, // audio:['xuanhuo',2], ai:{ order:8, result:{player:1}, }, }, //used:{}, }, // audio:['xuanhuo',2], }, fz_gzpaoxiao:{ audio:true, inherit:'gzpaoxiao', }, fz_new_tieji:{ audio:true, inherit:'new_tieji', }, fz_new_rewusheng:{ audio:true, inherit:'new_rewusheng', }, fz_liegong:{ audio:true, inherit:'liegong', }, fz_xinkuanggu:{ audio:true, inherit:'xinkuanggu', }, fz_new_longdan:{ audio:true, group:["fz_new_longdan_sha","fz_new_longdan_shan","fz_new_longdan_draw","fz_new_longdan_shamiss","fz_new_longdan_shanafter"], subSkill:{ shanafter:{ sub:true, audio:"fz_new_longdan", trigger:{ player:"useCard", }, //priority:1, filter:function(event,player){ return event.skill=='fz_new_longdan_shan'&&event.getParent(2).name=='sha'; }, direct:true, content:function(){ "step 0" player.chooseTarget("是否发动【龙胆】令一名其他角色回复1点体力?",function(card,player,target){ return target!=_status.event.source&&target!=player&&target.isDamaged(); }).set('ai',function(target){ return get.attitude(_status.event.player,target); }).set('source',trigger.getParent(2).player); "step 1" if(result.bool&&result.targets&&result.targets.length){ player.logSkill('fz_new_longdan',result.targets[0]); result.targets[0].recover(); } }, }, shamiss:{ sub:true, audio:"fz_new_longdan", trigger:{ player:"shaMiss", }, direct:true, filter:function(event,player){ return event.skill=='fz_new_longdan_sha'; }, content:function(){ "step 0" player.chooseTarget("是否发动【龙胆】对一名其他角色造成1点伤害?",function(card,player,target){ return target!=_status.event.target&&target!=player; }).set('ai',function(target){ return -get.attitude(_status.event.player,target); }).set('target',trigger.target); "step 1" if(result.bool&&result.targets&&result.targets.length){ player.logSkill('fz_new_longdan',result.targets[0]); result.targets[0].damage(); } }, }, draw:{ trigger:{ player:["useCard","respond"], }, audio:"fz_new_longdan", forced:true, locked:false, filter:function(event,player){ if(!get.zhu(player,'shouyue')) return false; return event.skill=='fz_new_longdan_sha'||event.skill=='fz_new_longdan_shan'; }, content:function(){ player.draw(); //player.storage.fanghun2++; }, sub:true, }, sha:{ audio:"fz_new_longdan", enable:["chooseToUse","chooseToRespond"], filterCard:{ name:"shan", }, viewAs:{ name:"sha", }, viewAsFilter:function(player){ if(!player.countCards('hs','shan')) return false; }, prompt:"将一张闪当杀使用或打出", position:'hs', check:function(){return 1}, ai:{ effect:{ target:function(card,player,target,current){ if(get.tag(card,'respondSha')&¤t<0) return 0.6 }, }, respondSha:true, skillTagFilter:function(player){ if(!player.countCards('hs','shan')) return false; }, order:function(){ return get.order({name:'sha'})+0.1; }, }, sub:true, }, shan:{ audio:"fz_new_longdan", enable:['chooseToRespond','chooseToUse'], filterCard:{ name:"sha", }, viewAs:{ name:"shan", }, position:'hs', prompt:"将一张杀当闪使用或打出", check:function(){return 1}, viewAsFilter:function(player){ if(!player.countCards('hs','sha')) return false; }, ai:{ respondShan:true, skillTagFilter:function(player){ if(!player.countCards('hs','sha')) return false; }, effect:{ target:function(card,player,target,current){ if(get.tag(card,'respondShan')&¤t<0) return 0.6 }, }, }, sub:true, }, }, }, gzenyuan:{ locked:true, audio:'reenyuan', group:['gzenyuan_gain','gzenyuan_damage'], preHidden:true, 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]; } } }, subSkill:{ gain:{ audio:'reenyuan', trigger:{target:'useCardToTargeted'}, forced:true, filter:function(event,player){ return event.card.name=='tao'&&event.player!=player; }, logTarget:'player', content:function(){trigger.player.draw()}, }, damage:{ audio:'reenyuan', trigger:{player:'damageEnd'}, forced:true, filter:function(event,player){ return event.source&&event.source!=player&&event.num>0; }, content:function(){ 'step 0' player.logSkill('enyuan_damage',trigger.source); trigger.source.chooseCard('交给'+get.translation(player)+'一张手牌,或失去1点体力','h').set('ai',function(card){ if(get.attitude(_status.event.player,_status.event.getParent().player)>0) return 11-get.value(card); return 7-get.value(card); }); 'step 1' if(result.bool){ trigger.source.give(result.cards[0],player,'giveAuto'); } else trigger.source.loseHp(); }, }, } }, gzjushou:{ audio:"xinjushou", trigger:{ player:"phaseJieshuBegin", }, preHidden:true, content:function(){ 'step 0' var list=[],players=game.filterPlayer(); for(var target of players){ if(target.isUnseen()) continue; var add=true; for(var i of list){ if(i.isFriendOf(target)){ add=false; break; } } if(add) list.add(target); } event.num=list.length; player.draw(event.num); if(event.num>2) 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){ if(get.type(result.cards[0])=='equip'&&player.hasUseTarget(result.cards[0])){ player.chooseUseTarget(result.cards[0],true,'nopopup'); } else{ player.discard(result.cards[0]); } } }, ai:{ effect:{ target:function(card,player,target){ if(card.name=='guiyoujie') return [0,1]; }, }, }, }, "new_duanliang":{ subSkill:{ off:{ sub:true, }, }, mod:{ targetInRange:function(card,player,target){ if(card.name=='bingliang'){ return true; } }, }, locked:false, audio:"duanliang1", 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){ if(player.hasSkill('new_duanliang_off')) return false; return player.countCards('hes',{type:['basic','equip'],color:'black'}) }, position:"hes", viewAs:{ name:"bingliang", }, onuse:function(result,player){ if(get.distance(player,result.targets[0])>2) player.addTempSkill('new_duanliang_off'); }, prompt:"将一黑色的基本牌或装备牌当兵粮寸断使用", check:function(card){return 6-get.value(card)}, ai:{ order:9, basic:{ order:1, useful:1, value:4, }, result:{ target:function(player,target){ if(target.hasJudge('caomu')) return 0; return -1.5/Math.sqrt(target.countCards('h')+1); }, }, tag:{ skip:"phaseDraw", }, }, }, new_shushen:{ audio:"shushen", trigger:{ player:"recoverAfter", }, direct:true, preHidden:true, content:function(){ 'step 0' event.num=trigger.num||1; "step 1" player.chooseTarget(get.prompt2('new_shushen'),function(card,player,target){ return target!=player; }).set('ai',function(target){ return get.attitude(_status.event.player,target); }).setHiddenSkill('new_shushen'); "step 2" if(result.bool){ player.logSkill('new_shushen',result.targets); result.targets[0].draw(); if(event.num>1){ event.num--; event.goto(1); } } }, ai:{ threaten:0.8, expose:0.1, }, }, "new_luanji":{ audio:"luanji", enable:"phaseUse", viewAs:{ name:"wanjian", }, filterCard:function(card,player){ if(!player.storage.new_luanji) return true; return !player.storage.new_luanji.includes(get.suit(card)); }, selectCard:2, position:'hs', filter:function(event,player){ return player.countCards('hs',function(card){ return !player.storage.new_luanji||!player.storage.new_luanji.includes(get.suit(card)); })>1; }, 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<2) return 0; } else if(targets.length>=5){ if(num<1.5) return 0; } } return 6-get.value(card); }, group:["new_luanji_count","new_luanji_reset","new_luanji_respond"], subSkill:{ reset:{ trigger:{ player:"phaseAfter", }, silent:true, filter:function(event,player){ return player.storage.new_luanji?true:false; }, content:function(){ delete player.storage.new_luanji; }, sub:true, forced:true, popup:false, }, count:{ trigger:{ player:"useCard", }, silent:true, filter:function(event){ return event.skill=='new_luanji'; }, content:function(){ if(!player.storage.new_luanji){ player.storage.new_luanji=[]; } for(var i=0;i=0) return 0; if(player.hasCard(function(card){ return get.tag(card,'damage')&&player.canUse(card,target,true,true); })){ if(target.maxHp>3) return -0.5; return -1; } return 0; }, }, }, }, new_kongcheng:{ group:["new_kongcheng_gain","new_kongcheng_got"], subSkill:{ gain:{ audio:"kongcheng", trigger:{ player:"gainBefore", }, filter:function(event,player){ return event.source&&event.source!=player&&player!=_status.currentPhase&&!event.bySelf&&player.countCards('h')==0; }, content:function(){ trigger.name='addToExpansion'; trigger.setContent('addToExpansion'); trigger.gaintag=['new_kongcheng']; trigger.untrigger(); trigger.trigger('addToExpansionBefore'); }, sub:true, forced:true, }, got:{ trigger:{ player:"phaseDrawBegin1", }, filter:function(event,player){ return player.getExpansions('new_kongcheng').length>0; }, content:function(){ player.gain(player.getExpansions('new_kongcheng'),'draw'); }, sub:true, forced:true, }, }, audio:"kongcheng", trigger:{ target:"useCardToTarget", }, forced:true, check:function(event,player){ return get.effect(event.target,event.card,event.player,player)<0; }, filter:function(event,player){ return player.countCards('h')==0&&(event.card.name=='sha'||event.card.name=='juedou'); }, content:function(){ trigger.getParent().targets.remove(player); }, ai:{ effect:{ target:function(card,player,target,current){ if(target.countCards('h')==0&&(card.name=='sha'||card.name=='juedou')) return 'zeroplayertarget'; }, }, }, intro:{ markcount:'expansion', mark:function(dialog,content,player){ var content=player.getExpansions('new_kongcheng'); if(content&&content.length){ if(player==game.me||player.isUnderControl()){ dialog.addAuto(content); } else{ return '共有'+get.cnNumber(content.length)+'张牌'; } } }, content:function(content,player){ var content=player.getExpansions('new_kongcheng'); if(content&&content.length){ if(player==game.me||player.isUnderControl()){ return get.translation(content); } return '共有'+get.cnNumber(content.length)+'张牌'; } }, }, onremove:function(player,skill){ var cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); }, }, "new_keji":{ audio:"keji", forced:true, trigger:{ player:"phaseDiscardBegin", }, filter:function(event,player){ var list=[]; player.getHistory('useCard',function(evt){ if(evt.isPhaseUsing(player)){ var color=get.color(evt.card); if(color!='nocolor') list.add(color); } }); return list.length<=1; }, check:function(event,player){ return player.needsToDiscard(); }, content:function(){ player.addTempSkill('keji_add','phaseAfter'); }, }, "keji_add":{ charlotte:true, mod:{ maxHandcard:function(player,num){ return num+4; }, }, }, "new_mouduan":{ trigger:{ player:"phaseJieshuBegin", }, //priority:2, audio:"botu", filter:function(event,player){ var history=player.getHistory('useCard'); var suits=[]; var types=[]; for(var i=0;i=4||types.length>=3; }, check:function(event,player){ return player.canMoveCard(true); }, content:function(){ player.moveCard(); }, }, "new_longdan":{ group:["new_longdan_sha","new_longdan_shan","new_longdan_draw","new_longdan_shamiss","new_longdan_shanafter"], subSkill:{ shanafter:{ sub:true, audio:"longdan_sha", trigger:{ player:"useCard", }, //priority:1, filter:function(event,player){ return event.skill=='new_longdan_shan'&&event.getParent(2).name=='sha'; }, direct:true, content:function(){ "step 0" player.chooseTarget("是否发动【龙胆】令一名其他角色回复1点体力?",function(card,player,target){ return target!=_status.event.source&&target!=player&&target.isDamaged(); }).set('ai',function(target){ return get.attitude(_status.event.player,target); }).set('source',trigger.getParent(2).player); "step 1" if(result.bool&&result.targets&&result.targets.length){ player.logSkill('new_longdan',result.targets[0]); result.targets[0].recover(); } }, }, shamiss:{ sub:true, audio:"longdan_sha", trigger:{ player:"shaMiss", }, direct:true, filter:function(event,player){ return event.skill=='new_longdan_sha'; }, content:function(){ "step 0" player.chooseTarget("是否发动【龙胆】对一名其他角色造成1点伤害?",function(card,player,target){ return target!=_status.event.target&&target!=player; }).set('ai',function(target){ return -get.attitude(_status.event.player,target); }).set('target',trigger.target); "step 1" if(result.bool&&result.targets&&result.targets.length){ player.logSkill('new_longdan',result.targets[0]); result.targets[0].damage(); } }, }, draw:{ trigger:{ player:["useCard","respond"], }, audio:"longdan_sha", forced:true, locked:false, filter:function(event,player){ if(!get.zhu(player,'shouyue')) return false; return event.skill=='new_longdan_sha'||event.skill=='new_longdan_shan'; }, content:function(){ player.draw(); //player.storage.fanghun2++; }, sub:true, }, sha:{ audio:"longdan_sha", enable:["chooseToUse","chooseToRespond"], filterCard:{ name:"shan", }, viewAs:{ name:"sha", }, position:'hs', viewAsFilter:function(player){ if(!player.countCards('hs','shan')) return false; }, prompt:"将一张闪当杀使用或打出", check:function(){return 1}, ai:{ effect:{ target:function(card,player,target,current){ if(get.tag(card,'respondSha')&¤t<0) return 0.6 }, }, respondSha:true, skillTagFilter:function(player){ if(!player.countCards('hs','shan')) return false; }, order:function(){ return get.order({name:'sha'})+0.1; }, }, sub:true, }, shan:{ audio:"longdan_sha", enable:['chooseToRespond','chooseToUse'], filterCard:{ name:"sha", }, viewAs:{ name:"shan", }, position:'hs', prompt:"将一张杀当闪使用或打出", check:function(){return 1}, viewAsFilter:function(player){ if(!player.countCards('hs','sha')) return false; }, ai:{ respondShan:true, skillTagFilter:function(player){ if(!player.countCards('hs','sha')) return false; }, effect:{ target:function(card,player,target,current){ if(get.tag(card,'respondShan')&¤t<0) return 0.6 }, }, }, sub:true, }, }, }, gzpaoxiao:{ audio:"paoxiao", trigger:{ player:"useCard", }, filter:function(event,player){ if(_status.currentPhase!=player) return false; if(event.card.name!='sha') return false; var history=player.getHistory('useCard',function(evt){ return evt.card.name=='sha'; }); return history&&history.indexOf(event)==1; }, forced:true, preHidden:true, content:function(){ player.draw(); }, mod:{ cardUsable:function(card,player,num){ if(card.name=='sha') return Infinity; }, }, ai:{ unequip:true, skillTagFilter:function(player,tag,arg){ if(!get.zhu(player,'shouyue')) return false; if(arg&&arg.name=='sha') return true; return false; }, }, }, "new_kurou":{ audio:"rekurou", enable:"phaseUse", usable:1, filterCard:true, check:function(card){ return 8-get.value(card); }, position:"he", content:function(){ player.loseHp(); player.draw(3); player.addTempSkill('kurou_effect','phaseAfter'); }, ai:{ order:8, result:{ player:function(player){ if(player.hp<=2) return player.countCards('h')==0?1:0; if(player.countCards('h',{name:'sha',color:'red'})) return 1; return player.countCards('h')<=player.hp?1:0; }, }, }, }, "kurou_effect":{ mod:{ cardUsable:function(card,player,num){ if(card.name=='sha') return num+1; }, }, }, "new_chuli":{ audio:"chulao", enable:"phaseUse", usable:1, filterTarget:function(card,player,target){ if(player==target) return false; for(var i=0;i0; }, filter:function(event,player){ return player.countCards('he')>0; }, filterCard:true, position:"he", selectTarget:[1,3], check:function(card){ if(get.suit(card)=='spade') return 8-get.value(card); return 5-get.value(card); }, contentBefore:function(){ var evt=event.getParent(); evt.draw=[]; if(get.suit(cards[0])=='spade') evt.draw.push(player); }, content:function(){ "step 0" player.discardPlayerCard(target,'he',true); "step 1" if(result.bool){ if(get.suit(result.cards[0])=='spade') event.getParent().draw.push(target); } }, contentAfter:function(){ 'step 0' var list=event.getParent().draw; if(!list.length) event.finish(); else game.asyncDraw(list); 'step 1' game.delay(); }, ai:{ result:{ target:-1, }, tag:{ discard:1, lose:1, loseCard:1, }, threaten:1.2, order:3, }, }, "baka_hunshang":{ skillAnimation:true, animationColor:'wood', audio:"hunzi", preHidden:true, derivation:["baka_yingzi","baka_yinghun"], viceSkill:true, init:function(player){ if(player.checkViceSkill('baka_hunshang')&&!player.viceChanged){ player.removeMaxHp(); } }, trigger:{ player:"phaseZhunbeiBegin", }, filter:function(event,player){ return player.hp<=1; }, forced:true, locked:false, //priority:3, content:function(){ player.addTempSkills(['baka_yingzi','baka_yinghun']); }, 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(get.tag(card,'damage')==1&&target.hp==2&&!target.isTurnedOver()&& _status.currentPhase!=target&&get.distance(_status.currentPhase,target,'absolute')<=3) return [0.5,1]; }, }, }, }, baka_yinghun:{ inherit:"yinghun", audio:'yinghun_sunce', }, baka_yingzi:{ mod:{ maxHandcardBase:function(player,num){ return player.maxHp; }, }, audio:'reyingzi_sunce', trigger:{ player:"phaseDrawBegin2", }, frequent:true, filter:function(event){return !event.numFixed}, content:function(){ trigger.num++; }, ai:{ threaten:1.3, }, }, gzyiji:{ audio:"yiji", trigger:{ player:"damageEnd", }, frequent:true, preHidden:true, content:function(){ 'step 0' event.cards=game.cardsGotoOrdering(get.cards(2)).cards; 'step 1' if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); event.given_map={}; 'step 2' 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 3' if(result.bool){ event.cards.removeArray(result.links); event.togive=result.links.slice(0); player.chooseTarget('选择一名角色获得'+get.translation(result.links),true).set('ai',function(target){ var att=get.attitude(_status.event.player,target); if(_status.event.enemy){ return -att; } else if(att>0){ return att/(1+target.countCards('h')); } else{ return att/100; } }).set('enemy',get.value(event.togive[0],player,'raw')<0); } 'step 4' 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(2); 'step 5' if(_status.connectMode){ game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()}); } var list=[]; for(var i in event.given_map){ var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; player.line(source,'green'); list.push([source,event.given_map[i]]); } game.loseAsync({ gain_list:list, giver:player, animate:'draw', }).setContent('gaincardMultiple'); }, 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]; } }, }, }, }, gzjieming:{ audio:"jieming", trigger:{ player:"damageEnd", }, direct:true, preHidden:true, content:function(){ "step 0" player.chooseTarget(get.prompt('gzjieming'),'令一名角色将手牌补至X张(X为其体力上限且至多为5)',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; }).setHiddenSkill('gzjieming'); "step 1" if(result.bool){ player.logSkill('gzjieming',result.targets); for(var i=0;i0) result.targets[i].draw(num); } } }, 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); } } 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]; }, }, }, }, gzfangzhu:{ audio:"fangzhu", trigger:{ player:"damageEnd", }, direct:true, preHidden:true, content:function(){ "step 0" player.chooseTarget(get.prompt2('gzfangzhu'),function(card,player,target){ return player!=target; }).setHiddenSkill('gzfangzhu').ai=function(target){ if(target.hasSkillTag('noturn')) return 0; var player=_status.event.player,att=get.attitude(player,target); if(att==0) return 0; if(att>0){ if(target.isTurnedOver()) return 1000-target.countCards('h'); return -1; } else{ if(target.isTurnedOver()) return -1; if(player.getDamagedHp()>=3) return -1; return target.countCards('h')+1; } } "step 1" if(result.bool){ var target=result.targets[0]; event.target=target; player.logSkill('gzfangzhu',target); var num=player.getDamagedHp(); if(num>0) target.chooseToDiscard('he',num,'放逐:弃置'+get.cnNumber(num)+'张牌并失去1点体力','或者点击“取消”不弃牌,改为摸'+get.cnNumber(num)+'张牌并叠置').set('ai',function(card){ var player=_status.event.player; if(player.isTurnedOver()) return -1; return (player.hp*player.hp)-Math.max(1,get.value(card)); }); else{ target.turnOver(); event.finish(); } } else event.finish(); "step 2" if(result.bool){ target.loseHp(); } else{ target.draw(player.getDamagedHp()); 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,-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(player,target)>0&&!hastarget) return; if(turnfriend||target.hp==target.maxHp) return [0.5,1]; if(target.hp>1) return [1,0.5]; } }, }, }, }, fengyin_main:{ init:function(player,skill){ player.addSkillBlocker(skill); }, onremove:function(player,skill){ player.removeSkillBlocker(skill); }, charlotte:true, skillBlocker:function(skill,player){ return lib.character[player.name1][3].includes(skill)&&!lib.skill[skill].charlotte&&!get.is.locked(skill,player); }, mark:true, marktext:'主', intro:{ content:function(storage,player,skill){ var list=player.getSkills(null,null,false).filter(function(i){ return lib.skill.fengyin_main.skillBlocker(i,player); }); if(list.length) return '失效技能:'+get.translation(list); return '无失效技能'; } } }, fengyin_vice:{ init:function(player,skill){ player.addSkillBlocker(skill); }, onremove:function(player,skill){ player.removeSkillBlocker(skill); }, charlotte:true, skillBlocker:function(skill,player){ return lib.character[player.name2][3].includes(skill)&&!lib.skill[skill].charlotte&&!get.is.locked(skill,player); }, mark:true, marktext:'副', intro:{ content:function(storage,player,skill){ var list=player.getSkills(null,null,false).filter(function(i){ return lib.skill.fengyin_vice.skillBlocker(i,player); }); if(list.length) return '失效技能:'+get.translation(list); return '无失效技能'; } } }, "new_tieji":{ audio:"retieji", trigger:{ player:"useCardToPlayered", }, check:function(event,player){ return get.attitude(player,event.target)<0; }, filter:function(event){ return event.card.name=='sha'; }, logTarget:"target", content:function(){ "step 0" var target=trigger.target; var controls=[]; if(get.zhu(player,'shouyue')){ if(!target.isUnseen(0)) target.addTempSkill('fengyin_main'); if(!target.isUnseen(1)) target.addTempSkill('fengyin_vice'); event.goto(2); } if(!target.isUnseen(0)&&!target.hasSkill('fengyin_main')) controls.push("主将"); if(!target.isUnseen(1)&&!target.hasSkill('fengyin_vice')) controls.push("副将"); if(controls.length>0){ if(controls.length==1) event._result={control:controls[0]}; else{ player.chooseControl(controls).set('ai',function(){ var choice='主将'; var skills=lib.character[target.name2][3]; for(var i=0;i1?2:0; return 8-get.value(card); }).set('num',num).set('suit',suit); "step 4" if(!result.bool){ trigger.getParent().directHit.add(trigger.target); } }, }, hmkyuanyu:{ audio:'zongkui', trigger:{ player:"damageBegin4", }, forced:true, preHidden:true, filter:function(event,player){ if(event.num<=0||!event.source) return false; var n1=player.getNext(); var p1=player.getPrevious(); if(event.source!=n1&&event.source!=p1) return true; }, content:function(){ trigger.cancel(); }, ai:{ effect:{ target:function(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return; if(player==target.getNext()||player==target.getPrevious()) return; if(get.tag(card,'damage')) return 'zeroplayertarget'; }, }, }, }, hmkguishu:{ audio:'bmcanshi', enable:"phaseUse", filter:function(event,player){ return player.countCards('hs',{suit:'spade'})>0; }, init:function(player){ if(!player.storage.hmkguishu) player.storage.hmkguishu=0; }, chooseButton:{ dialog:function(event,player){ var list=['yuanjiao','zhibi']; for(var i=0;i2) return 1; return 0; } }, backup:function(links,player){ return { audio:'bmcanshi', filterCard:function(card,player){ return get.suit(card)=='spade'; }, position:"hs", selectCard:1, popname:true, ai:function(card){ return 6-ai.get.value(card); }, viewAs:{name:links[0][2]}, onuse:function(result,player){ player.logSkill('hmkguishu'); if(result.card.name=='yuanjiao') player.storage.hmkguishu=1; else player.storage.hmkguishu=2; }, } }, prompt:function(links,player){ return '将一张手牌当作'+get.translation(links[0][2])+'使用'; }, }, ai:{ order:4, result:{ player:function(player){ return 2; }, }, threaten:1.6, }, }, "_mingzhisuodingji":{ mode:["guozhan"], enable:"phaseUse", filter:function(event,player){ if(player.hasSkillTag('nomingzhi',false,null,true)) return false; var bool=false; var skillm=lib.character[player.name1][3]; var skillv=lib.character[player.name2][3]; if(player.isUnseen(0)){ for(var i=0;i1; }, content:function(){ var target=player.getNext(); player.viewCharacter(target,1); }, }, _aozhan_judge:{ trigger:{ player:"phaseBefore", }, forced:true, priority:22, filter:function(event,player){ if(get.mode()!='guozhan') return false; if(_status.connectMode&&!lib.configOL.aozhan) return false; else if(!_status.connectMode&&!get.config('aozhan')) return false; if(_status._aozhan) return false; if(game.players.length>4) return false; if(game.players.length>3&&game.players.length+game.dead.length<=7) return false; for(var i=0;i'+intro+''); var ul=uiintro.querySelector('ul'); if(ul){ ul.style.width='180px'; } uiintro.add(ui.create.div('.placeholder')); return uiintro; },250); game.playBackgroundMusic(); }); game.countPlayer(function(current){current.addSkill('aozhan')}); }, }, _guozhan_marks:{ ruleSkill:true, enable:'phaseUse', filter:function(event,player){ return player.hasMark('yexinjia_mark')||player.hasMark('xianqu_mark')||player.hasMark('yinyang_mark')||player.hasMark('zhulianbihe_mark'); }, chooseButton:{ dialog:function(event,player){ return ui.create.dialog('###国战标记###弃置一枚对应的标记,发动其对应的效果'); }, chooseControl:function(event,player){ var list=[],bool=player.hasMark('yexinjia_mark'); if(bool||player.hasMark('xianqu_mark')) list.push('先驱'); if(bool||player.hasMark('zhulianbihe_mark')){ list.push('珠联(摸牌)'); if(event.filterCard({name:'tao',isCard:true},player,event)) list.push('珠联(桃)'); } if(bool||player.hasMark('yinyang_mark')) list.push('阴阳鱼'); list.push('cancel2'); return list; }, check:function(){ var player=_status.event.player,bool=player.hasMark('yexinjia_mark'); if((bool||player.hasMark('xianqu_mark'))&&(4-player.countCards('h'))>1) return '先驱'; if(bool||player.hasMark('zhulianbihe_mark')){ if(_status.event.getParent().filterCard({name:'tao',isCard:true},player,event)&&get.effect_use(player,{name:'tao'},player)>0) return '珠联(桃)'; if(player.getHandcardLimit()-player.countCards('h')>1&&!game.hasPlayer(function(current){ return current!=player&¤t.isFriendOf(player)&¤t.hp+current.countCards('h','shan')<=2; })) return '珠联(摸牌)'; } if(player.hasMark('yinyang_mark')&&player.getHandcardLimit()-player.countCards('h')>0) return '阴阳鱼'; return 'cancel2'; }, backup:function(result,player){ switch(result.control){ case '珠联(桃)': return get.copy(lib.skill._zhulianbihe_mark_tao); case '珠联(摸牌)': return { content:function(){ player.draw(2); player.removeMark(player.hasMark('zhulianbihe_mark')?'zhulianbihe_mark':'yexinjia_mark',1); }, }; case '阴阳鱼': return { content:function(){ player.draw(); player.removeMark(player.hasMark('yinyang_mark')?'yinyang_mark':'yexinjia_mark',1); } }; case '先驱': return {content:lib.skill.xianqu_mark.content}; } }, }, ai:{ order:1, result:{ player:1, }, }, }, xianqu_mark:{ intro:{ content:"◇出牌阶段,你可以弃置此标记,然后将手牌摸至四张并观看一名其他角色的一张武将牌。", }, content:function(){ "step 0" player.removeMark(player.hasMark('xianqu_mark')?'xianqu_mark':'yexinjia_mark',1); var num=4-player.countCards('h'); if(num) player.draw(num); "step 1" if(game.hasPlayer(function(current){ return current!=player&¤t.isUnseen(2); })) player.chooseTarget('是否观看一名其他角色的一张暗置武将牌?',function(card,player,target){ return target!=player&&target.isUnseen(2); }).set('ai',function(target){ if(target.isUnseen()){ var next=_status.event.player.getNext(); if (target!=next) return 10; return 9; } return -get.attitude(_status.event.player,target); }); else event.finish(); "step 2" if(result.bool){ event.target=result.targets[0]; player.line(event.target,'green'); var controls=[]; if(event.target.isUnseen(0)) controls.push('主将'); if(event.target.isUnseen(1)) controls.push('副将'); if(controls.length>1){ player.chooseControl(controls); } if(controls.length==0) event.finish(); } else{ player.removeSkill('xianqu_mark'); event.finish(); } "step 3" if(result.control){ if(result.control=='主将'){ player.viewCharacter(event.target,0); } else{ player.viewCharacter(event.target,1); } } else if(target.isUnseen(0)){ player.viewCharacter(event.target,0); } else{ player.viewCharacter(event.target,1); } }, }, zhulianbihe_mark:{ intro:{ content:"◇出牌阶段,你可以弃置此标记 然后摸两张牌。
    ◇你可以将此标记当做【桃】使用。", }, }, yinyang_mark:{ intro:{ content:"◇出牌阶段,你可以弃置此标记,然后摸一张牌。
    ◇弃牌阶段,你可以弃置此标记,然后本回合手牌上限+2。", }, }, _zhulianbihe_mark_tao:{ ruleSkill:true, enable:"chooseToUse", filter:function(event,player){ return event.type!='phase'&&(player.hasMark('zhulianbihe_mark')||player.hasMark('yexinjia_mark')); }, viewAsFilter:function(player){ return player.hasMark('zhulianbihe_mark')||player.hasMark('yexinjia_mark'); }, viewAs:{ name:"tao", isCard:true, }, filterCard:function(){return false}, selectCard:-1, precontent:function(){ player.removeMark(player.hasMark('zhulianbihe_mark')?'zhulianbihe_mark':'yexinjia_mark',1); }, }, _yinyang_mark_add:{ ruleSkill:true, trigger:{ player:"phaseDiscardBegin", }, filter:function(event,player){ return (player.hasMark('yinyang_mark')||player.hasMark('yexinjia_mark'))&&player.needsToDiscard(); }, prompt:function(event,player){ return '是否弃置一枚【'+(player.hasMark('yinyang_mark')?'阴阳鱼':'野心家')+'】标记,使本回合的手牌上限+2?'; }, content:function(){ player.addTempSkill('yinyang_add','phaseAfter'); player.removeMark(player.hasMark('yinyang_mark')?'yinyang_mark':'yexinjia_mark',1); }, }, yinyang_add:{ mod:{ maxHandcard:function(player,num){ return num+2; }, }, }, yexinjia_mark:{ intro:{ content:'◇你可以弃置此标记,并发动【先驱】标记或【珠联璧合】标记或【阴阳鱼】标记的效果。', }, }, yexinjia_friend:{ marktext:'盟', intro:{ name:'结盟', content:'已经与$结成联盟', }, }, /*----分界线----*/ _lianheng:{ mode:['guozhan'], enable:'phaseUse', usable:1, prompt:'将至多三张可合纵的牌交给一名与你势力不同的角色,或未确定势力的角色,若你交给与你势力不同的角色,则你摸等量的牌', filter:function(event,player){ return player.hasCard(function(card){ return card.hasTag('lianheng')||card.hasGaintag('_lianheng'); },'h'); }, filterCard:function(card){ return card.hasTag('lianheng')||card.hasGaintag('_lianheng'); }, filterTarget:function(card,player,target){ if(target==player) return false; if(player.isUnseen()) return target.isUnseen(); return !target.isFriendOf(player); }, check:function(card){ if(card.name=='tao') return 0; return 7-get.value(card); }, selectCard:[1,3], discard:false, lose:false, delay:false, content:function(){ "step 0" player.give(cards,target); "step 1" if(!target.isUnseen()){ player.draw(cards.length); } }, ai:{ basic:{ order:8 }, result:{ player:function(player,target){ var huoshao=false; for(var i=0;i=lib.suit.length) return false; return player.isFriendOf(event.player)&&player.hasCard(function(card){ if(_status.connectMode&&get.position(card)=='h') return true; return !suits.includes(get.suit(card)); },'he'); }, direct:true, content:function(){ 'step 0' var suits=[],cards=player.getExpansions('qianhuan'); for(var i=0;i{ return i.hasGaintag('sha_notshan'); }))||trigger.target.hp>=3){ goon=false; } } else if(trigger.card.name=='guohe'){ if(trigger.target.countCards('he')>=3||!trigger.target.countCards('h')){ goon=false; } } else if(trigger.card.name=='shuiyanqijunx'){ if(trigger.target.countCards('e')<=1||trigger.target.hp>=3){ goon=false; } } else if(get.tag(trigger.card,'damage')&&trigger.target.hp>=3){ goon=false; } } player.chooseButton().set('goon',goon).set('ai',function(button){ if(_status.event.goon) return 1; return 0; }).set('createDialog',[get.prompt('qianhuan'),'
    移去一张“千幻”牌令'+ get.translation(trigger.player)+'对'+get.translation(trigger.target)+'的'+get.translation(trigger.card)+'失效
    ',player.getExpansions('qianhuan')]); 'step 1' if(result.bool){ player.logSkill('qianhuan',trigger.player); trigger.getParent().targets.remove(trigger.target); var card=result.links[0]; player.loseToDiscardpile(card); } } } } }, gzsanyao:{ audio:'sanyao', inherit:'sanyao', filterTarget:function(card,player,target){ return target.hp>player.hp||target.countCards('h')>player.countCards('h'); }, }, gzzhiman:{ audio:'zhiman', inherit:'zhiman', preHidden:true, content:function(){ 'step 0' if(trigger.player.countGainableCards(player,'ej')){ player.gainPlayerCard(trigger.player,'ej',true); } trigger.cancel(); 'step 1' if(player.isFriendOf(trigger.player)){ trigger.player.mayChangeVice(); } } }, gzdiancai:{ audio:'diancai', trigger:{global:'phaseUseEnd'}, filter:function(event,player){ if(_status.currentPhase==player) return false; var num=0; player.getHistory('lose',function(evt){ if(evt.cards2&&evt.getParent('phaseUse')==event) num+=evt.cards2.length; }); return num>=player.hp; }, preHidden:true, content:function(){ 'step 0' var num=player.maxHp-player.countCards('h'); if(num>0){ player.draw(num); } 'step 1' player.mayChangeVice(); }, }, xuanlve:{ trigger:{ player:'loseAfter', global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, direct:true, preHidden: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('xuanlve'),'弃置一名其他角色的一张牌',function(card,player,target){ return target!=player&&target.countDiscardableCards(player,'he'); }).set('ai',function(target){ var player=_status.event.player; return get.effect(target,{name:'guohe_copy2'},player,player); }).setHiddenSkill(event.name); 'step 1' if(result.bool){ player.logSkill('xuanlve',result.targets); player.discardPlayerCard(result.targets[0],'he',true); } }, ai:{ noe:true, reverseEquip:true, effect:{ target:function(card,player,target,current){ if(get.type(card)=='equip') return [1,1]; } } } }, lianzi:{ enable:'phaseUse', usable:1, audio:2, filterCard:true, check:function(card){ if(get.type(card)=='equip') return 0; var player=_status.event.player; var num=game.countPlayer(function(current){ if(current.identity=='wu'){ return current.countCards('e'); } })+player.getExpansions('yuanjiangfenghuotu').length; if(num>=5){ return 8-get.value(card); } if(num>=3){ return 7-get.value(card); } if(num>=2){ return 3-get.value(card); } return 0; }, content:function(){ 'step 0' var num=game.countPlayer(function(current){ if(current.identity=='wu'){ return current.countCards('e'); } })+player.getExpansions('yuanjiangfenghuotu').length; if(num){ event.shown=get.cards(num); player.showCards(event.shown,get.translation('lianzi')); } else{ event.finish(); return; } 'step 1' var list=[]; var discards=[]; var type=get.type(cards[0],'trick'); for(var i=0;i=3&&player.hasStockSkill('lianzi')){ player.changeSkills(['gzzhiheng'],['lianzi']); } } }, ai:{ order:7, result:{ player:1 } } }, jubao:{ mod:{ canBeGained:function(card,source,player){ if(source!=player&&get.position(card)=='e'&&get.subtype(card)=='equip5') return false; } }, trigger:{player:'phaseJieshuBegin'}, audio:2, forced:true, unique:true, filter:function(event,player){ if(game.hasPlayer(function(current){ return current.countCards('ej',function(card){ return card.name=='dinglanyemingzhu'; }); })){ return true; } for(var i=0;i0; }, content:function(){ 'step 0' player.chooseCardButton('将一张“烽火”置入弃牌堆',player.getExpansions('yuanjiangfenghuotu'),true); 'step 1' if(result.bool){ var card=result.links[0]; player.loseToDiscardpile(card); } } }, jiahe_put:{ enable:'phaseUse', audio:2, forceaudio:true, filter:function(event,player){ var zhu=get.zhu(player,'jiahe'); if(zhu){ return player.countCards('he',{type:'equip'})>0; } return false; }, filterCard:{type:'equip'}, position:'he', usable:1, check:function(card){ var zhu=get.zhu(_status.event.player,'jiahe'); if(!zhu) return 0; var num=7-get.value(card); if(get.position(card)=='h'){ if(zhu.getExpansions('huangjintianbingfu').length>=5){ return num-3; } return num+3; } else{ var player=_status.event.player; var zhu=get.zhu(player,'jiahe'); var sub=get.subtype(card) if(player.countCards('h',function(card){ return get.type(card)=='equip'&&get.subtype(card)=='sub'&&player.hasValueTarget(card); })) return num+4; if(zhu.getExpansions('yuanjiangfenghuotu').length>=5&&!player.hasSkillTag('noe')){ return num-5; } } return num; }, discard:false, lose:false, delay:false, prepare:function(cards,player){ var zhu=get.zhu(player,'jiahe'); player.line(zhu); }, content:function(){ var zhu=get.zhu(player,'jiahe'); zhu.addToExpansion(cards,player,'give').gaintag.add('yuanjiangfenghuotu'); }, ai:{ order:function(item,player){ if(player.hasSkillTag('noe')||!player.countCards('h',function(card){ return get.type(card)=='equip'&&!player.canEquip(card)&&player.hasValueTarget(card); })) return 1; return 10; }, result:{ player:1 } } }, jiahe_skill:{ trigger:{player:'phaseZhunbeiBegin'}, direct:true, audio:"jiahe_put", forceaudio:true, filter:function(event,player){ var zhu=get.zhu(player,'jiahe'); if(zhu&&zhu.getExpansions('yuanjiangfenghuotu').length){ return true; } return false; }, content:function(){ 'step 0' var zhu=get.zhu(player,'jiahe'); event.num=zhu.getExpansions('yuanjiangfenghuotu').length; 'step 1' var list=[]; if(event.num>=1&&!player.hasSkill('jiahe_reyingzi')) list.push('reyingzi'); if(event.num>=2&&!player.hasSkill('jiahe_haoshi')) list.push('haoshi'); if(event.num>=3&&!player.hasSkill('jiahe_shelie')) list.push('shelie'); if(event.num>=4&&!player.hasSkill('jiahe_duoshi')) list.push('fakeduoshi'); if(!list.length){ event.finish(); return; } var prompt2='你可以获得下列一项技能直到回合结束'; if(list.length>=5){ if(event.done){ prompt2+=' (2/2)'; } else{ prompt2+=' (1/2)'; } } list.push('cancel2'); player.chooseControl(list).set('prompt',get.translation('yuanjiangfenghuotu')). set('prompt2',prompt2).set('centerprompt2',true).set('ai',function(evt,player){ var controls=_status.event.controls; if(controls.includes('haoshi')){ var nh=player.countCards('h'); if(player.hasSkill('reyingzi')){ if(nh==0) return 'haoshi'; } else{ if(nh<=1) return 'haoshi'; } } if(controls.includes('shelie')){ return 'shelie'; } if(controls.includes('reyingzi')){ return 'reyingzi'; } if(controls.includes('fakeduoshi')){ return 'fakeduoshi'; } return controls.randomGet(); }); 'step 2' if(result.control!='cancel2'){ var skill=(result.control!='fakeduoshi'?'jiahe_':'')+result.control; player.addTempSkills(skill); if(!event.done) player.logSkill('jiahe_put'); // game.log(player,'获得了技能','【'+get.translation(skill)+'】'); if(event.num>=5&&!event.done){ event.done=true; event.goto(1); } } } }, jiahe_reyingzi:{ inherit:'reyingzi', }, jiahe_haoshi:{ inherit:'haoshi', }, jiahe_shelie:{ inherit:'shelie', }, jiahe_duoshi:{ inherit:'duoshi', }, yuanjiangfenghuotu:{ unique:true, forceunique:true, nopop:true, mark:true, 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('yuanjiangfenghuotu'); if(content&&content.length){ dialog.addSmall(content); } dialog.addText('
    • 每名吴势力角色的出牌阶段限一次,该角色可以将一张装备牌置于“缘江烽火图”上,称之为“烽火”。
    • 根据“烽火”的数量,所有吴势力角色可于其准备阶段开始时选择并获得其中一个技能直到回合结束:一张以上~英姿;两张以上~好施;三张以上~涉猎;四张以上~度势;五张以上~可额外选择一项。
    • 锁定技,当你受到【杀】或锦囊牌造成的伤害后,你将一张“烽火”置入弃牌堆。',false) } } }, gzqice:{ enable:'phaseUse', usable:1, audio:"qice_backup", filter:function(event,player){ var hs=player.getCards('h'); if(!hs.length) return false; for(var i=0;inum){ return false; } } else if(info.changeTarget){ var giveup=true; var list=game.filterPlayer(function(current){ return player.canUse(card,current); }); for(var i=0;inh){ select[1]=nh; } return select; }, filterTarget:function(card,player,target){ var info=get.info(card); if(info.changeTarget){ var targets=[target]; info.changeTarget(player,targets); if(targets.length>player.countCards('h')){ return false; } } return lib.filter.filterTarget(card,player,target); }, popname:true, viewAs:{name:links[0][2]}, ai1:function(){ return 1; } } }, 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=2; }, content:function(){ 'step 0' var list=player.storage.gzhuashen.slice(0); if(!list.length){ event.finish(); return; } player.chooseButton().set('ai',function(){ return Math.random()-0.3; }).set('createDialog',['是否替换一张“化身”?',[list,'character']]); 'step 1' if(result.bool){ player.logSkill('gzhuashen'); game.log(player,'替换了一张','#g化身'); lib.skill.gzhuashen.addCharacter(player,_status.characterlist.randomGet(),true); lib.skill.gzhuashen.removeCharacter(player,result.links[0]); game.delayx(); } } }, triggered:{}, flash:{ hookTrigger:{ log:function(player,skill){ var sources=lib.skill.gzhuashen.getSkillSources(player,skill); if(sources.length){ player.flashAvatar('gzhuashen',sources.randomGet()); player.storage.gzhuashen_removing.add(skill); } } }, trigger:{player:['useSkillBegin','useCard','respond']}, silent:true, filter:function(event,player){ return event.skill&&lib.skill.gzhuashen.getSkillSources(player,event.skill).length>0; }, content:function(){ lib.skill.gzhuashen_flash.hookTrigger.log(player,trigger.skill); } }, clear:{ trigger:{player:'phaseAfter'}, silent:true, content:function(){ player.storage.gzhuashen_trigger.length=0; } }, disallow:{ hookTrigger:{ block:function(event,player,name,skill){ for(var i=0;i0){ return true; } } return false; } } }, remove:{ trigger:{player:['useSkillAfter','useCardAfter','respondAfter','triggerAfter','skillAfter']}, hookTrigger:{ after:function(event,player){ if(event._direct&&!player.storage.gzhuashen_removing.includes(event.skill)) return false; if(lib.skill[event.skill].silent) return false; return lib.skill.gzhuashen.getSkillSources(player,event.skill).length>0; } }, silent:true, filter:function(event,player){ return event.skill&&lib.skill.gzhuashen.getSkillSources(player,event.skill).length>0; }, content:function(){ 'step 0' if(trigger.name=='trigger'){ player.storage.gzhuashen_trigger.push([trigger._trigger,trigger.triggername]); } var sources=lib.skill.gzhuashen.getSkillSources(player,trigger.skill); if(sources.length==1){ event.directresult=sources[0]; } else{ player.chooseButton(true).set('createDialog',['移除一张“化身”牌',[sources,'character']]); } 'step 1' if(!event.directresult&&result&&result.links[0]){ event.directresult=result.links[0]; } var name=event.directresult; lib.skill.gzhuashen.removeCharacter(player,name); game.log(player,'移除了化身牌','#g'+get.translation(name)); } } }, ai:{ nofrequent:true, skillTagFilter:function(player,tag,arg){ if(arg&&player.storage.gzhuashen){ if(lib.skill.gzhuashen.getSkillSources(player,arg).length>0){ return true; } } return false; } } }, gzxiongsuan:{ limited:true, audio:'xiongsuan', enable:'phaseUse', filterCard:true, filter:function(event,player){ return player.countCards('h'); }, filterTarget:function(card,player,target){ return target.isFriendOf(player); }, check:function(card){ return 7-get.value(card); }, content:function(){ 'step 0' player.awakenSkill('gzxiongsuan'); target.damage('nocard'); 'step 1' player.draw(3); var list=[]; var skills=target.getOriginalSkills(); for(var i=0;i1){ player.chooseControl(list).set('prompt','选择一个限定技在回合结束后重置之'); } else{ event.finish(); } 'step 2' target.storage.gzxiongsuan_restore=result.control; target.addTempSkill('gzxiongsuan_restore'); }, subSkill:{ restore:{ trigger:{global:'phaseEnd'}, forced:true, popup:false, charlotte:true, onremove:true, content:function(){ player.restoreSkill(player.storage.gzxiongsuan_restore); } } }, ai:{ order:4, damage:true, result:{ target:function(player,target){ if(target.hp>1){ var skills=target.getOriginalSkills(); for(var i=0;i=0) return 10; if(target.hp>=4) return 5; if(target.hp==3){ if(player.countCards('h')<=2&&game.hasPlayer(function(current){ return current.hp<=1&&get.attitude(player,current)<0; })){ return 3; } } return 0; } } } }, gzsuishi:{ audio:'suishi', preHidden:['gzsuishi2'], trigger:{global:'dying'}, forced:true, //priority:6.5, check:function(){ return false; }, filter:function(event,player){ return event.player!=player&&event.parent.name=='damage'&&event.parent.source&&event.parent.source.isFriendOf(player); }, content:function(){ player.draw(); }, group:'gzsuishi2' }, gzsuishi2:{ audio:'suishi', trigger:{global:'dieAfter'}, forced:true, check:function(){return false}, filter:function(event,player){ return event.player.isFriendOf(player); }, content:function(){ player.loseHp(); } }, hongfa_respond:{ audio:'huangjintianbingfu', forceaudio:true, trigger:{player:'chooseToRespondBegin'}, direct:true, filter:function(event,player){ if(event.responded) return false; if(!event.filterCard({name:'sha'})) return false; var zhu=get.zhu(player,'hongfa'); if(zhu&&zhu.getExpansions('huangjintianbingfu').length>0){ return true; } return false; }, content:function(){ "step 0" var zhu=get.zhu(player,'hongfa'); player.chooseCardButton(get.prompt('huangjintianbingfu'),zhu.getExpansions('huangjintianbingfu')).set('ai',function(){ if(_status.event.goon) return 1; return 0; }).set('goon',player.countCards('h','sha')==0); "step 1" if(result.bool){ var card=result.links[0]; trigger.untrigger(); trigger.responded=true; trigger.result={bool:true,card:{name:'sha'},cards:[card]}; var zhu=get.zhu(player,'hongfa'); player.logSkill('hongfa_respond',zhu); } } }, hongfa_use:{ audio:'huangjintianbingfu', forceaudio:true, enable:'chooseToUse', filter:function(event,player){ if(!event.filterCard({name:'sha'},player)) return false; var zhu=get.zhu(player,'hongfa'); if(zhu&&zhu.getExpansions('huangjintianbingfu').length>0){ return true; } return false; }, chooseButton:{ dialog:function(event,player){ var zhu=get.zhu(player,'hongfa'); return ui.create.dialog('黄巾天兵符',zhu.getExpansions('huangjintianbingfu'),'hidden'); }, backup:function(links,player){ return { filterCard:function(){return false}, selectCard:-1, viewAs:{name:'sha',cards:links}, cards:links, precontent:function(){ var cards=lib.skill.hongfa_use_backup.cards; event.result.cards=cards; player.logSkill('hongfa_use',result.targets); } } }, prompt:function(links,player){ return '选择杀的目标'; } }, ai:{ respondSha:true, skillTagFilter:function(player){ var zhu=get.zhu(player,'hongfa'); if(zhu&&zhu.getExpansions('huangjintianbingfu').length>0){ return true; } return false; }, order:function(){ return get.order({name:'sha'})-0.1; }, result:{ player:function(player){ if(player.countCards('h','sha')) return 0; return 1; } } } }, hongfa:{ audio:2, derivation:'huangjintianbingfu', unique:true, forceunique:true, lordSkill:true, trigger:{player:'phaseZhunbeiBegin'}, forced:true, filter:function(event,player){ return player.getExpansions('huangjintianbingfu').length==0&&get.population('qun')>0; }, content:function(){ var cards=get.cards(get.population('qun')); player.addToExpansion(cards,'gain2').gaintag.add('huangjintianbingfu'); }, ai:{ threaten:2, }, group:'hongfa_hp', global:['hongfa_use','hongfa_respond'], subSkill:{ hp:{ audio:true, trigger:{player:'loseHpBefore'}, filter:function(event,player){ return player.getExpansions('huangjintianbingfu').length>0; }, direct:true, content:function(){ 'step 0' player.chooseCardButton(get.prompt('hongfa'),player.getExpansions('huangjintianbingfu')).set('ai',function(){ return 1; }); 'step 1' if(result.bool){ player.logSkill('huangjintianbingfu'); player.loseToDiscardpile(result.links); trigger.cancel(); } } } } }, wendao:{ audio:2, unique:true, forceunique:true, enable:'phaseUse', usable:1, filterCard:function(card){ return get.name(card)!='taipingyaoshu'&&get.color(card)=='red'; }, position:'he', check:function(card){ return 6-get.value(card); }, onChooseToUse:function(event){ if(game.online) return; event.set('wendao',function(){ for(var i=0;i
    • 当你计算群势力角色数时,每一张“天兵”均可视为一名群势力角色。
    • 每当你失去体力时,你可改为将一张“天兵”置入弃牌堆。
    • 与你势力相同的角色可将一张“天兵”当【杀】使用或打出。',false) } } }, wuxin:{ trigger:{player:'phaseDrawBegin1'}, audio:2, filter:function(event,player){ return get.population('qun')>0; }, content:function(){ 'step 0' var num=get.population('qun'); if(player.hasSkill('huangjintianbingfu')){ num+=player.getExpansions('huangjintianbingfu').length; } var cards=get.cards(num); game.cardsGotoOrdering(cards); var next=player.chooseToMove('悟心:将卡牌以任意顺序置于牌堆顶'); next.set('list',[['牌堆顶',cards]]); next.set('processAI',function(list){ var cards=list[0][1].slice(0); cards.sort(function(a,b){ return get.value(b)-get.value(a); }); return [cards]; }) 'step 1' if(result.bool){ var list=result.moved[0].slice(0); while(list.length){ ui.cardPile.insertBefore(list.pop(),ui.cardPile.firstChild); } game.updateRoundNumber(); } } }, zhangwu:{ audio:2, unique:true, forceunique:true, ai:{ threaten:2, }, trigger:{ global:['loseAfter','cardsDiscardAfter','equipAfter'], }, forced:true, filter:function(event,player){ if(event.name=='equip'){ if(player==event.player) return false; if(event.card.name=='feilongduofeng'&&event.player.getCards('e').includes(event.card)) return true; return event.player.hasHistory('lose',function(evt){ if(evt.position!=ui.discardPile||evt.getParent().name!='equip') return false; for(var i of evt.cards){ if(i.name=='feilongduofeng'&&get.position(i,true)=='d') return true; } return false; }) } if(event.name=='lose'&&(event.position!=ui.discardPile||event.getParent().name=='equip')) return false; for(var i of event.cards){ if(i.name=='feilongduofeng'&&get.position(i,true)=='d') return true; } return false; }, logTarget:function(event,player){ if(event.name=='equip'&&event.card.name=='feilongduofeng'&&event.player.getCards('e').includes(event.card)) return event.player; return []; }, content:function(){ game.delayx(); var cards=[]; if(trigger.name=='equip'){ if(trigger.card.name=='feilongduofeng'&&trigger.player.getCards('e').includes(trigger.card)) cards.push(trigger.card); trigger.player.getHistory('lose',function(evt){ if(evt.position!=ui.discardPile||evt.getParent()!=trigger) return false; for(var i of evt.cards){ if(i.name=='feilongduofeng'&&get.position(i,true)=='d') cards.push(i); } return false; }) } if(trigger.name=='lose'){ for(var i of trigger.cards){ if(i.name=='feilongduofeng'&&get.position(i,true)=='d') cards.push(i); } } var owner=get.owner(cards[0]); if(owner) player.gain(cards,'give',owner,'bySelf'); else player.gain(cards,'gain2'); }, group:'zhangwu_draw', subSkill:{ draw:{ audio:'zhangwu', trigger:{ player:'loseEnd', global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], }, filter:function(event,player){ if(event.name=='lose'&&event.getParent().name=='useCard') return false; var evt=event.getl(player); return evt&&evt.player==player&&evt.cards2.filter(function(i){ return i.name=='feilongduofeng'&&get.owner(i)!=player; }).length>0; }, forced:true, content:function(){ 'step 0' var cards=[],evt=trigger.getl(player); cards.addArray(evt.cards2.filter(function(i){ return i.name=='feilongduofeng'&&get.owner(i)!=player; })); player.showCards(cards,get.translation(player)+'发动了【章武】'); for(var i of cards){ var owner=get.owner(i); if(owner) owner.lose(i,ui.cardPile)._triggered=null; else{ i.fix(); ui.cardPile.appendChild(i); } } 'step 1' player.draw(2); }, }, }, }, shouyue:{ unique:true, forceunique:true, group:'wuhujiangdaqi', derivation:'wuhujiangdaqi', mark:true, lordSkill:true, }, wuhujiangdaqi:{ unique:true, forceunique:true, nopop:true, mark:true, intro:{ content:"@
      【武圣】
      将“红色牌”改为“任意牌”
      【咆哮】
      增加描述“你使用的【杀】无视其他角色的防具”
      【龙胆】
      增加描述“你每发动一次‘龙胆’便摸一张牌”
      【烈弓】
      增加描述“你的攻击范围+1”
      【铁骑】
      将“一张明置的武将牌”改为“所有明置的武将牌”
      ", } }, jizhao:{ derivation:'rerende', unique:true, audio:2, enable:'chooseToUse', mark:true, skillAnimation:true, animationColor:'fire', init:function(player){ player.storage.jizhao=false; }, filter:function(event,player){ if(player.storage.jizhao) return false; if(event.type=='dying'){ if(player!=event.dying) return false; return true; } return false; }, content:function(){ 'step 0' player.awakenSkill('jizhao'); player.storage.jizhao=true; var num=player.maxHp-player.countCards('h'); if(num>0){ player.draw(num); } 'step 1' if(player.hp<2){ player.recover(2-player.hp); } 'step 2' player.removeSkill('wuhujiangdaqi'); player.changeSkills(['rerende'],['shouyue']); }, ai:{ order:1, skillTagFilter:function(player,arg,target){ if(player!=target||player.storage.jizhao) return false; }, save:true, result:{ player:10 }, }, intro:{ content:'limited' } }, gzshoucheng:{ inherit:'shoucheng', audio:'shoucheng', preHidden:true, filter:function(event,player){ return game.hasPlayer(function(current){ if(current==_status.currentPhase||!current.isFriendOf(player)) return false; var evt=event.getl(current); return evt&&evt.hs&&evt.hs.length&¤t.countCards('h')==0; }); }, content:function(){ "step 0" event.list=game.filterPlayer(function(current){ if(current==_status.currentPhase||!current.isFriendOf(player)) 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.isAlive()&&target.countCards('h')==0){ player.chooseBool(get.prompt2('gzshoucheng',target)).set('ai',function(){ return get.attitude(_status.event.player,_status.event.getParent().target)>0; }).setHiddenSkill(event.name); } else event.goto(3); "step 2" if(result.bool){ player.logSkill(event.name,target); target.draw(); } "step 3" if(event.list.length) event.goto(1); }, }, gzyicheng:{ audio:'yicheng', trigger:{ global:['useCardToPlayered','useCardToTargeted'], }, preHidden:true, //frequent:true, direct:true, filter:function(event,player){ if(event.card.name!='sha') return false; if(event.name=='useCardToPlayered'&&!event.isFirstTarget) return false; var target=lib.skill.gzyicheng.logTarget(event,player); if(target==player) return true; return target.inline(player)&&target.isAlive()&&player.hasSkill('gzyicheng'); }, logTarget:function(event,player){ return event.name=='useCardToPlayered'?event.player:event.target; }, content:function(){ 'step 0' var target=lib.skill.gzyicheng.logTarget(trigger,player); event.target=target; target.chooseBool(get.prompt('gzyicheng'),'摸一张牌,然后弃置一张牌').set('frequentSkill','gzyicheng'); 'step 1' if(result.bool){ player.logSkill('gzyicheng',target); target.draw(); target.chooseToDiscard('he',true); } }, }, yicheng:{ audio:2, trigger:{global:'useCardToTargeted'}, filter:function(event,player){ return event.card.name=='sha'&&event.target.isFriendOf(player); }, preHidden:true, logTarget:'target', content:function(){ 'step 0' trigger.target.draw(); 'step 1' trigger.target.chooseToDiscard('he',true); } }, gzjixi:{ inherit:'jixi', audio:'jixi', mainSkill:true, init:function(player){ if(player.checkMainSkill('gzjixi')){ player.removeMaxHp(); } } }, ziliang:{ audio:2, trigger:{global:'damageEnd'}, filter:function(event,player){ return event.player.isIn()&&event.player.isFriendOf(player)&&player.getExpansions('tuntian').length; }, init:function(player){ player.checkViceSkill('ziliang'); }, viceSkill:true, direct:true, content:function(){ 'step 0' player.chooseCardButton(get.prompt('ziliang',trigger.player),player.getExpansions('tuntian')).set('ai',function(button){ return get.value(button.link); }); 'step 1' if(result.bool){ var card=result.links[0]; player.logSkill('ziliang',trigger.player); player.give(card,trigger.player); } } }, gzhuyuan:{ audio:'huyuan', trigger:{player:'phaseJieshuBegin'}, direct:true, preHidden:true, filter:function(event,player){ return player.countCards('he')>0; }, content:function(){ 'step 0' player.chooseCardTarget({ filterCard:true, position:'he', filterTarget:function(card,player,target){ if(player==target) return false; var card=ui.selected.cards[0]; if(get.type(card)!='equip') return true; return target.canEquip(card); }, prompt:get.prompt2('gzhuyuan'), complexSelect:true, ai1:function(card){ if(!_status.event.goon) return false; var player=_status.event.player; if(get.type(card)!='equip') return 0; return 7.5-get.value(card); }, ai2:function(target){ if(!_status.event.goon) return false; var player=_status.event.player,card=ui.selected.cards[0]; return get.effect(target,card,player,player); }, goon:game.hasPlayer(function(current){ return get.effect(current,{name:'guohe_copy',position:'ej'},player,player)>0; }) }).setHiddenSkill('gzhuyuan'); 'step 1' if(result.bool){ var target=result.targets[0],card=result.cards[0]; player.logSkill('gzhuyuan',target); if(get.type(card)=='equip'){ player.$give(card,target,false); game.delayx(); target.equip(card); } else{ player.give(card,target); event.finish(); } } else event.finish(); 'step 2' if(game.hasPlayer(function(current){ return current.hasCard(function(card){ return lib.filter.canBeDiscarded(card,player,current); },'ej'); })){ player.chooseTarget('是否弃置场上的一张牌?',function(card,player,target){ return target.hasCard(function(card){ return lib.filter.canBeDiscarded(card,player,target); },'ej'); }).set('ai',function(target){ const player=_status.event.player; return get.effect(target,{name:'guohe_copy',position:'ej'},player,player); }) } else event.finish(); 'step 3' if(result.bool){ var target=result.targets[0]; player.line(target,'thunder'); player.discardPlayerCard(target,true,'ej'); } }, }, huyuan:{ audio:2, trigger:{player:'phaseJieshuBegin'}, direct:true, preHidden:true, filter:function(event,player){ return player.countCards('he',{type:'equip'})>0; }, content:function(){ "step 0" player.chooseCardTarget({ filterCard:function(card){ return get.type(card)=='equip'; }, position:'he', filterTarget:function(card,player,target){ return target.canEquip(card); }, ai1:function(card){ return 6-get.value(card); }, ai2:function(target){ return get.attitude(_status.event.player,target)-3; }, prompt:get.prompt2('huyuan') }).setHiddenSkill('huyuan'); "step 1" if(result.bool){ var target=result.targets[0]; player.logSkill('huyuan',target); event.current=target; target.equip(result.cards[0]); if(target!=player){ player.$give(result.cards,target,false); game.delay(2); } player.chooseTarget('弃置一名角色的一张牌',function(card,player,target){ var source=_status.event.source; return get.distance(source,target)<=1&&source!=target&&target.countCards('he'); }).set('ai',function(target){ var player=_status.event.player; return get.effect(target,{name:'guohe_copy2'},player,player); }).set('source',target); } else{ event.finish(); } "step 2" if(result.bool&&result.targets.length){ event.current.line(result.targets,'green'); player.discardPlayerCard(true,result.targets[0],'he'); } }, }, heyi:{ zhenfa:'inline', global:'heyi_distance' }, heyi_distance:{ mod:{ globalTo:function(from,to,distance){ if(game.hasPlayer(function(current){ return current.hasSkill('heyi')&¤t.inline(to); })){ return distance+1; } } } }, tianfu:{ init:function(player){ player.checkMainSkill('tianfu'); }, mainSkill:true, inherit:'kanpo', zhenfa:'inline', viewAsFilter:function(player){ return _status.currentPhase&&_status.currentPhase.inline(player)&&!player.hasSkill('kanpo')&&player.countCards('h',{color:'black'})>0; }, }, yizhi:{ init:function(player){ if(player.checkViceSkill('yizhi')&&!player.viceChanged){ player.removeMaxHp(); } }, viceSkill:true, inherit:'guanxing', filter:function(event,player){ return !player.hasSkill('guanxing'); } }, gzshangyi:{ audio:'shangyi', enable:'phaseUse', usable:1, filter:function(event,player){ return player.countCards('h')>0; }, filterTarget:function(card,player,target){ return player!=target&&(target.countCards('h')||target.isUnseen(2)); }, content:function(){ "step 0" target.viewHandcards(player); "step 1" if(!target.countCards('h')){ event._result={index:1}; } else if(!target.isUnseen(2)){ event._result={index:0}; } else{ player.chooseControl().set('choiceList',[ '观看'+get.translation(target)+'的手牌并可以弃置其中的一张黑色牌', '观看'+get.translation(target)+'的所有暗置的武将牌', ]); } "step 2" if(result.index==0){ player.discardPlayerCard(target,'h').set('filterButton',function(button){ return get.color(button.link)=='black'; }).set('visible',true); } else{ player.viewCharacter(target,2); } }, ai:{ order:11, result:{ target:function(player,target){ return -target.countCards('h'); } }, threaten:1.1 }, }, niaoxiang:{ zhenfa:'siege', audio:'zniaoxiang', global:'niaoxiang_sha', preHidden:true, trigger:{global:'useCardToPlayered'}, filter:function(event,player){ if(event.card.name!='sha') return false; if(game.countPlayer()<4) return false; return player.siege(event.target)&&event.player.siege(event.target); }, forced:true, forceaudio:true, 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; } } }, fengshi:{ audio:'zfengshi', zhenfa:'siege', trigger:{global:'useCardToPlayered'}, filter:function(event,player){ if(event.card.name!='sha'||game.countPlayer()<4) return false; return player.siege(event.target)&&event.player.siege(event.target)&&event.target.countCards('e'); }, logTarget:'target', content:function(){ trigger.target.chooseToDiscard('e',true); } }, gzguixiu:{ audio:'guixiu', trigger:{player:['showCharacterAfter','removeCharacterBefore']}, filter:function(event,player){ if(event.name=='removeCharacter'||event.name=='changeVice') return event.toRemove=='gz_mifuren'&&player.isDamaged(); return event.toShow.includes('gz_mifuren'); }, content:function(){ if(trigger.name=='showCharacter'){ player.draw(2); } else{ player.recover(); } }, }, gzcunsi:{ derivation:'gzyongjue', enable:'phaseUse', audio:'cunsi', filter:function(event,player){ return player.checkMainSkill('gzcunsi',false)||player.checkViceSkill('gzcunsi',false); }, unique:true, forceunique:true, filterTarget:true, skillAnimation:true, animationColor:'orange', content:function(){ 'step 0' if(player.checkMainSkill('gzcunsi',false)){ player.removeCharacter(0); } else{ player.removeCharacter(1); } 'step 1' target.addSkills('gzyongjue'); if(target!=player){ target.draw(2); } }, ai:{ order:9, result:{ player:function(player,target){ var num=0; if(player.isDamaged()&&target.isFriendOf(player)){ num++; if(target.hasSkill('kanpo')) num+=0.5; if(target.hasSkill('liegong')) num+=0.5; if(target.hasSkill('tieji')) num+=0.5; if(target.hasSkill('gzrende')) num+=1.2; if(target.hasSkill('longdan')) num+=1.2; if(target.hasSkill('paoxiao')) num+=1.2; if(target.hasSkill('zhangwu')) num+=1.5; if(target!=player) num+=0.5; } return num; } } } }, gzyongjue:{ audio:'yongjue', trigger:{global:'useCardAfter'}, filter:function(event,player){ if(event==event.player.getHistory('useCard')[0]&&event.card.name=='sha'&&_status.currentPhase==event.player&&event.player.isFriendOf(player)){ for(var i=0;i0&&event.source&&event.source.isUnseen(2); }, content:function(){ trigger.num--; }, ai:{ effect:{ target:function(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return; if(!player.isUnseen(2)) return; var num=get.tag(card,'damage'); if(num){ if(num>1) return 0.5; return 0; } } } }, }, hunshang:{ init:function(player){ if(player.checkViceSkill('hunshang')&&!player.viceChanged){ player.removeMaxHp(); } }, group:['hunshang_yingzi','hunshang_yinghun'], }, reyingzi_sunce:{audio:2}, yinghun_sunce:{audio:2}, hunshang_yingzi:{ inherit:'yingzi', audio:'reyingzi_sunce', filter:function(event,player){ return player.hp<=1&&!player.hasSkill('yingzi'); } }, hunshang_yinghun:{ inherit:'yinghun', audio:'yinghun_sunce', filter:function(event,player){ return player.hp<=1&&player.isDamaged()&&!player.hasSkill('yinghun'); } }, yingyang:{ audio:2, trigger:{player:'compare',target:'compare'}, filter:function(event){ return !event.iwhile; }, direct:true, preHidden:true, content:function(){ 'step 0' player.chooseControl('点数+3','点数-3','cancel2').set('prompt',get.prompt2('yingyang')).set('ai',function(){ if(_status.event.small) return 1; else return 0; }).set('small',trigger.small); 'step 1' if(result.index!=2){ player.logSkill('yingyang'); if(result.index==0){ game.log(player,'拼点牌点数+3'); if(player==trigger.player){ trigger.num1+=3; if(trigger.num1>13) trigger.num1=13; } else{ trigger.num2+=3; if(trigger.num2>13) trigger.num2=13; } } else{ game.log(player,'拼点牌点数-3'); if(player==trigger.player){ trigger.num1-=3; if(trigger.num1<1) trigger.num1=1; } else{ trigger.num2-=3; if(trigger.num2<1) trigger.num2=1; } } } } }, gzqianxi:{ audio:'qianxi', trigger:{player:'phaseZhunbeiBegin'}, content:function(){ "step 0" player.judge(); "step 1" event.color=result.color; player.chooseTarget(function(card,player,target){ return player!=target&&get.distance(player,target)<=1; },true).set('ai',function(target){ return -get.attitude(_status.event.player,target); }); "step 2" if(result.bool&&result.targets.length){ result.targets[0].storage.qianxi2=event.color; result.targets[0].addSkill('qianxi2'); player.line(result.targets,'green'); game.addVideo('storage',result.targets[0],['qianxi2',event.color]); } }, }, gzduanchang:{ audio:'duanchang', trigger:{player:'die'}, forced:true, forceDie:true, filter:function(event,player){ return event.source&&event.source.isIn()&&event.source!=player&& (event.source.hasMainCharacter()||event.source.hasViceCharacter()); }, content:function(){ 'step 0' if(!trigger.source.hasViceCharacter()){ event._result={control:'主将'} } else if(!trigger.source.hasMainCharacter()){ event._result={control:'副将'} } else{ player.chooseControl('主将','副将',function(){ return _status.event.choice; }).set('prompt','令'+get.translation(trigger.source)+'失去一张武将牌的所有技能').set('forceDie',true).set('choice',function(){ var rank=get.guozhanRank(trigger.source.name1,trigger.source)-get.guozhanRank(trigger.source.name2,trigger.source); if(rank==0) rank=Math.random()>0.5?1:-1; return (rank*get.attitude(player,trigger.source))>0?'副将':'主将'; }()); } 'step 1' var skills; if(result.control=='主将'){ trigger.source.showCharacter(0); game.broadcastAll(function(player){ player.node.avatar.classList.add('disabled'); },trigger.source); skills=lib.character[trigger.source.name][3]; game.log(trigger.source,'失去了主将技能'); } else{ trigger.source.showCharacter(1); game.broadcastAll(function(player){ player.node.avatar2.classList.add('disabled'); },trigger.source); skills=lib.character[trigger.source.name2][3]; game.log(trigger.source,'失去了副将技能'); } var list=[]; for(var i=0;i2) 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; var player=get.owner(card); if(player.hp==player.maxHp||player.storage.gzrende<0||player.countCards('h')+player.storage.gzrende<=2){ if(ui.selected.cards.length){ return -1; } var players=game.filterPlayer(); for(var 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); }, content:function(){ target.gain(cards,player); if(typeof player.storage.gzrende!='number'){ player.storage.gzrende=0; } if(player.storage.gzrende>=0){ player.storage.gzrende+=cards.length; if(player.storage.gzrende>=3){ player.recover(); player.storage.gzrende=-1; } } }, ai:{ order:function(skill,player){ if(player.hp==player.maxHp||player.storage.gzrende<0||player.countCards('h')+player.storage.gzrende<=2){ return 1; } return 10; }, result:{ target:function(player,target){ if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ 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.gzrende<0||player.countCards('h')+player.storage.gzrende<=2){ if(nh>=np-1&&np<=player.hp&&!target.hasSkill('haoshi')) return 0; } return Math.max(1,5-nh); } }, effect:{ target:function(card,player,target){ if(player==target&&get.type(card)=='equip'){ if(player.countCards('e',{subtype:get.subtype(card)})){ var players=game.filterPlayer(); for(var i=0;i0){ return 0; } } } } } }, threaten:0.8 } }, gzrende1:{ trigger:{player:'phaseUseBegin'}, silent:true, content:function(){ player.storage.gzrende=0; } }, gzzhiheng:{ inherit:'zhiheng', audio:'zhiheng', selectCard:function(){ var player=_status.event.player; var range1=[1,player.maxHp]; if(player.hasSkill('dinglanyemingzhu_skill')){ for(var i=0;i0; }, check:function(card){ return 5-get.value(card); } }, gzxiaoguo:{ inherit:'xiaoguo', audio:'xiaoguo', preHidden:true, content:function(){ "step 0" var nono=(Math.abs(get.attitude(player,trigger.player))<3); if(get.damageEffect(trigger.player,player,player)<=0){ nono=true; } var next=player.chooseToDiscard(get.prompt2('gzxiaoguo',trigger.player),{type:'basic'}); next.set('ai',function(card){ if(_status.event.nono) return 0; return 8-get.useful(card); }); next.set('logSkill',['gzxiaoguo',trigger.player]); next.set('nono',nono); next.setHiddenSkill('gzxiaoguo'); "step 1" if(result.bool){ var nono=(get.damageEffect(trigger.player,player,trigger.player)>=0); trigger.player.chooseToDiscard('弃置一张装备牌,或受到1点伤害','he',{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){ trigger.player.damage(); } }, }, _mingzhi1:{ trigger:{player:'phaseBeginStart'}, //priority:19, ruleSkill:true, forced:true, popup:false, filter:function(event,player){ return player.isUnseen(2)&&!player.hasSkillTag('nomingzhi',false,null,true); }, content:function(){ 'step 0' if(player.phaseNumber==1&&player.isUnseen(0)&&(_status.connectMode?lib.configOL.junzhu:get.config('junzhu'))){ var name=player.name1; if(name.indexOf('gz_')!=0||!lib.junList.includes(name.slice(3))){ event.goto(3); } else{ event.junzhu_name='gz_jun_'+name.slice(3); player.chooseBool('是否将主武将牌替换为“'+get.translation(event.junzhu_name)+'”?'); } } else event.goto(3); 'step 1' if(result.bool){ var to=event.junzhu_name; event.maxHp=player.maxHp; player.reinit(player.name1,to,4); if(lib.skill[to]) game.trySkillAudio(to,player); player.showCharacter(0); var group=lib.character[to][1]; var yelist=game.filterPlayer(function(current){ if(current.identity!='ye') return false; if(current==player) return true; return current.group==group; }); if(yelist.length>0){ player.line(yelist,'green'); game.log(yelist,'失去了野心家身份'); game.broadcastAll(function(list,group){ for(var i=0;ievent.maxHp) player.recover(player.maxHp-event.maxHp); 'step 3' var choice=1; for(var i=0;i=2||(popu==1&&game.players.length<=4)){ return Math.random()<0.5?3:(Math.random()<0.5?2:1); } if(choice==0) return 0; if(get.population(group)>0&&player.wontYe()){ return Math.random()<0.2?(Math.random()<0.5?3:(Math.random()<0.5?2:1)):0; } var nming=0; for(var i=0;i=2||(popu==1&&game.players.length<=4)){ return true; } if(get.population(group)>0&&player.wontYe()){ return Math.random()<0.2?true:false; } var nming=0; for(var i=0;i0){ target.chooseControl(list,'cancel2').set('prompt','是否响应'+get.translation(player)+'发起的阵法召唤?').set('ai',function(){ return Math.random()<0.5?0:1; }); } else event.goto(3); } else event.goto(3); 'step 2' if(result.control!='cancel2'){ if(result.control=='明置'+get.translation(target.name1)){ target.showCharacter(0); } else{ target.showCharacter(1); } } 'step 3' if(event.list.length) event.goto(1); 'step 4' game.delay(); }, ai:{ order:5, result:{ player:1 } } }, ushio_huanxin:{ trigger:{ player:['damageEnd','useCardAfter'], source:'damageSource', }, frequent:true, preHidden:true, filter:function(event,player,name){ if(name=='useCardAfter') return get.type(event.card)=='equip'; if(name=='damageEnd') return true; return event.getParent().name=='sha'; }, content:function(){ player.judge().set('callback',function(){ var card=event.judgeResult.card; if(card&&get.position(card,true)=='o'){ player.gain(card,'gain2'); player.chooseToDiscard(true,'he'); } }); }, }, ushio_xilv:{ trigger:{player:'judgeEnd'}, forced:true, preHidden:true, content:function(){ player.addTempSkill('ushio_xilv2',{player:'phaseJieshu'}); player.addMark('ushio_xilv2',1,false); }, }, ushio_xilv2:{ onremove:true, charlotte:true, mod:{ maxHandcard:function(player,num){ return num+player.countMark('ushio_xilv2'); } }, intro:{ content:'手牌上限+#', }, }, }, game:{ canReplaceViewpoint:()=>true, showYexings:function(){ if(_status.showYexings) return; _status.showYexings=true; var next=game.createEvent('showYexings',false); next.setContent(function(){ 'step 0' event.targets=game.filterPlayer(function(current){ return lib.character[current.name1][1]=='ye'; }).sortBySeat(_status.currentPhase); event.targets2=[]; 'step 1' var target=targets.shift(); event.target=target; target.chooseBool('是否【暴露野心】,展示主将并继续战斗?','若选择“否”,则视为本局游戏失败'); 'step 2' if(result.bool){ event.targets2.push(target); target.$fullscreenpop('暴露野心','thunder'); game.log(target,'暴露了野心'); target.showCharacter(0); game.delay(2); if(targets.length) event.goto(1); } else{ if(targets.length) event.goto(1); else{ var winner=game.findPlayer(function(current){ return lib.character[current.name1][1]!='ye'; }); if(winner){ game.broadcastAll(function(id){ game.winner_id=id; },winner.playerid); game.checkResult(); } delete _status.showYexings; event.finish(); } } 'step 3' var source=event.targets2.shift(); event.source=source; event.targets3=[]; //event.targets4=[source]; if(!_status.yexinjia_list) _status.yexinjia_list=['夏','商','周','秦','汉','隋','唐','宋','辽','金','元','明']; source.chooseControl(_status.yexinjia_list).set('prompt','请选择自己所属的野心家势力的标识').set('ai',()=>(_status.yexinjia_list?_status.yexinjia_list.randomGet():0)); 'step 4' var text,source=event.source; if(result.control){ text=result.control; _status.yexinjia_list.remove(result.control); } else text=_status.yexinjia_list.randomRemove(); lib.group.push(text); lib.translate[text+'2']=text; lib.groupnature[text]='kami'; event.text=text; game.broadcastAll(function(player,text){ player.identity=text; player.setIdentity(text,'kami'); },source,text); source.changeGroup(text); source.removeMark('yexinjia_mark',1); var targets=game.filterPlayer(function(current){ return current.identity!='ye'&¤t!=source&&!get.is.jun(current)&&!event.targets2.includes(current)&&!current.getStorage('yexinjia_friend').length; }); if(!targets.length) event.goto(8); else event.targets=targets; 'step 5' var source=event.source; var target=targets.shift(); event.target=target; source.line(target,'green'); target.chooseBool('是否响应'+get.translation(source)+'发起的【拉拢人心】?','将势力改为'+event.text).set('ai',_status.event.choice).set('choice',function(){ let fs=target.getFriends(true).length; if(game.players.length<=2*fs) return false; if(source.getFriends(true).length+fs>game.players.length/2) return true; if(target.isDamaged()||target.countCards('h')<4) return false; return true; }()); 'step 6' if(result.bool){ target.chat('加入'); //event.targets4.push(target); game.broadcastAll(function(player,text){ player.identity=text; player.setIdentity(text,'kami'); },target,event.text); target.changeGroup(event.text); } else{ target.chat('拒绝'); event.targets3.push(target); } game.delay(1.5); if(targets.length) event.goto(5); /* else if(event.targets4.length){ for(var i of event.targets4){ i.markAuto('yexinjia_friend',event.targets4.filter(j=>j!=i)); } } */ 'step 7' if(event.targets3.length){ for(var i of event.targets3){ i.drawTo(4); i.recover(); } } 'step 8' if(event.targets2.length) event.goto(3); else{ delete _status.showYexings; if(!game.hasPlayer(current=>{ return game.hasPlayer(target=>{ return !target.isFriendOf(current); }); })){ game.broadcastAll(function(id){ game.winner_id=id; },event.source.playerid); game.checkResult(); } } }); }, getCharacterChoice:function(list,num){ var choice=list.splice(0,num).sort(function(a,b){ return (get.is.double(a)?1:-1)-(get.is.double(b)?1:-1); }); var map={wei:[],shu:[],wu:[],qun:[],key:[],jin:[],ye:[]}; for(var i=0;i=num){ break; } } } else{ if(!map[lib.character[list[i]][1]]&&!get.is.double(list[i])){ group=lib.character[list[i]][1]; if(group=='ye') group=null; choice.push(list[i]); list.splice(i--,1); if(choice.length>=num){ break; } } } } } return choice.randomSort(); }, getState:function(){ var state={}; for(var i in lib.playerOL){ var player=lib.playerOL[i]; state[i]={ identity:player.identity, //group:player.group, shown:player.ai.shown, }; } return state; }, updateState:function(state){ for(var i in state){ var player=lib.playerOL[i]; if(player){ player.identity=state[i].identity; //player.group=state[i].group; player.ai.shown=state[i].shown; } } }, getRoomInfo:function(uiintro){ var num,last; if(lib.configOL.initshow_draw=='off'){ num='关闭' } else{ num={mark:'标记',draw:'摸牌'}[lib.configOL.initshow_draw]; } uiintro.add('
      群雄割据:'+(lib.configOL.separatism?'开启':'关闭')); uiintro.add('
      首亮奖励:'+num); uiintro.add('
      珠联璧合:'+(lib.configOL.zhulian?'开启':'关闭')); uiintro.add('
      出牌时限:'+lib.configOL.choose_timeout+'秒'); uiintro.add('
      国战牌堆:'+(lib.configOL.guozhanpile?'开启':'关闭')); uiintro.add('
      鏖战模式:'+(lib.configOL.aozhan?'开启':'关闭')); last=uiintro.add('
      观看下家副将:'+(lib.configOL.viewnext?'开启':'关闭')); last.style.paddingBottom='8px'; }, addRecord:function(bool){ if(typeof bool=='boolean'){ var data=lib.config.gameRecord.guozhan.data; var identity=game.me.identity; if(!data[identity]){ data[identity]=[0,0]; } if(bool){ data[identity][0]++; } else{ data[identity][1]++; } var list=lib.group.slice(0); list.add('ye'); var str=''; for(var i=0;i'; } } lib.config.gameRecord.guozhan.str=str; game.saveConfig('gameRecord',lib.config.gameRecord); } }, getIdentityList:function(player){ if(!player.isUnseen()) return; if(player==game.me) return; var list={ wei:'魏', shu:'蜀', wu:'吴', qun:'群', ye:'野', unknown:'猜' } var num=Math.floor((game.players.length+game.dead.length)/2); var noye=true; if(get.population('wei')>=num){ delete list.wei; noye=false; } if(get.population('shu')>=num){ delete list.shu; noye=false; } if(get.population('wu')>=num){ delete list.wu; noye=false; } if(get.population('qun')>=num){ delete list.qun; noye=false; } if(noye){ delete list.ye; } return list; }, getIdentityList2:function(list){ for(var i in list){ switch(i){ case 'unknown':list[i]='未知';break; case 'ye':list[i]='野心家';break; case 'qun':list[i]+='雄';break; case 'key':list[i]='Key';break; case 'jin':list[i]+='朝';break; default:list[i]+='国'; } } }, getVideoName:function(){ var str=get.translation(game.me.name1)+'/'+get.translation(game.me.name2); var str2=_status.separatism?get.modetrans({ mode:lib.config.mode, separatism:true }):get.cnNumber(parseInt(get.config('player_number')))+'人'+ get.translation(lib.config.mode); if(game.me.identity=='ye'){ str2+=' - 野心家'; } var name=[str,str2]; return name; }, showIdentity:function(started){ if(game.phaseNumber==0&&!started) return; for(var i=0;i1){ if(!hiddens.length&&sides.length==2){ if(map[sides[0]].length==1&&!map[sides[1]].filter(function(i){ return i.identity!='ye'&&i.isUnseen(0); }).length) map[sides[0]][0].showGiveup(); if(map[sides[1]].length==1&&!map[sides[0]].filter(function(i){ return i.identity!='ye'&&i.isUnseen(0); }).length) map[sides[1]][0].showGiveup(); } } else{ var isYe=function(player){ return player.identity!='ye'&&lib.character[player.name1][1]=='ye'; } if(!hiddens.length){ if(map[sides[0]].length>1){ for(var i of map[sides[0]]){ if(isYe(i)){ game.showYexings(); return; } } } game.broadcastAll(function(id){ game.winner_id=id; },sides[0]); game.checkResult(); } else{ var identity=map[sides[0]][0].identity; if(identity=='ye') return; for(var i of map[sides[0]]){ if(isYe(i)) return; } for(var ind=0;inddouble.includes(group)); return doublex.includes(group2); } else{ if(group1=='ye') return group2!='ye'; var double=get.is.double(name2,true); if(double) return double.includes(group1); return group1==group2; } }; for(var i=0;iget.is.double(mainx,true).includes(group)).randomGet(); else player.trueIdentity=get.is.double(mainx,true).find(group=>get.is.double(vicex,true).includes(group)); } else if(lib.character[mainx][1]=='ye'&&get.is.double(vicex,true)) player.trueIdentity=get.is.double(vicex,true).randomGet(); if(back){ list.remove(player.name1); list.remove(player.name2); for(var i=0;i'; td.link=i-1; seats.appendChild(td); td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ if(_status.dragged) return; if(_status.justdragged) return; if(_status.cheat_seat){ _status.cheat_seat.classList.remove('bluebg'); if(_status.cheat_seat==this){ delete _status.cheat_seat; return; } } this.classList.add('bluebg'); _status.cheat_seat=this; }); } dialog.content.appendChild(seats); if(game.me==game.zhu){ seats.previousSibling.style.display='none'; seats.style.display='none'; } dialog.add(ui.create.div('.placeholder.add-setting')); dialog.add(ui.create.div('.placeholder.add-setting')); if(get.is.phoneLayout()) dialog.add(ui.create.div('.placeholder.add-setting')); }; var removeSetting=function(){ var dialog=_status.event.dialog; if(dialog){ dialog.style.height=''; delete dialog._scrollset; var list=Array.from(dialog.querySelectorAll('.add-setting')); while(list.length){ list.shift().remove(); } ui.update(); } }; event.addSetting=addSetting; event.removeSetting=removeSetting; var chosen=lib.config.continue_name||[]; game.saveConfig('continue_name'); event.chosen=chosen; var i; event.list=[]; for(i in lib.character){ if(i.indexOf('gz_shibing')==0) continue; if(chosen.includes(i)) continue; if(lib.filter.characterDisabled(i)) continue; if(get.config('onlyguozhan')){ if(!lib.characterGuozhanFilter.some(pack=>lib.characterPack[pack][i])) continue; if(get.is.jun(i)) continue; } if(lib.character[i][4].includes('hiddenSkill')) continue; if(lib.character[i][2]==3||lib.character[i][2]==4||lib.character[i][2]==5) event.list.push(i); } _status.characterlist=event.list.slice(0); _status.yeidentity=[]; if(_status.brawl&&_status.brawl.chooseCharacterFilter){ event.list=_status.brawl.chooseCharacterFilter(event.list); } event.list.randomSort(); // var list=event.list.splice(0,parseInt(get.config('choice_num'))); var list; if(_status.brawl&&_status.brawl.chooseCharacter){ list=_status.brawl.chooseCharacter(event.list,game.me); } else{ list=game.getCharacterChoice(event.list,parseInt(get.config('choice_num'))); } if(_status.auto){ event.ai(game.me,list); lib.init.onfree(); } else if(chosen.length){ game.me.init(chosen[0],chosen[1],false); lib.init.onfree(); } else{ var dialog=ui.create.dialog('选择角色','hidden',[list,'character']); if(!_status.brawl||!_status.brawl.noAddSetting){ if(get.config('change_identity')){ addSetting(dialog); } } var next=game.me.chooseButton(dialog,true,2).set('onfree',true); next.filterButton=function(button){ if(ui.dialog.buttons.length<=10){ for(var i=0;idouble.includes(group)); return doublex.includes(group2); } else{ if(group1=='ye') return group2!='ye'; var double=get.is.double(name2,true); if(double) return double.includes(group1); return group1==group2; } }; if(!ui.selected.buttons.length){ return ui.dialog.buttons.some(but=>{ if(but==button) return false; return filterChoice(button.link,but.link); }); } return filterChoice(ui.selected.buttons[0].link,button.link); }; next.switchToAuto=function(){ event.ai(game.me,list); ui.arena.classList.remove('selecting'); }; var createCharacterDialog=function(){ event.dialogxx=ui.create.characterDialog('heightset',function(i){ if(i.indexOf('gz_shibing')==0) return true; if(get.config('onlyguozhan')){ if(!lib.characterGuozhanFilter.some(pack=>lib.characterPack[pack][i])) return true; if(get.is.jun(i)) return true; } },get.config('onlyguozhanexpand')?'expandall':undefined,get.config('onlyguozhan')?'onlypack:mode_guozhan':undefined); if(ui.cheat2){ ui.cheat2.addTempClass('controlpressdownx',500); ui.cheat2.classList.remove('disabled'); } }; if(lib.onfree){ lib.onfree.push(createCharacterDialog); } else{ createCharacterDialog(); } ui.create.cheat2=function(){ ui.cheat2=ui.create.control('自由选将',function(){ if(this.dialog==_status.event.dialog){ if(game.changeCoin){ game.changeCoin(50); } this.dialog.close(); _status.event.dialog=this.backup; this.backup.open(); delete this.backup; game.uncheck(); game.check(); if(ui.cheat){ ui.cheat.addTempClass('controlpressdownx',500); ui.cheat.classList.remove('disabled'); } } else{ if(game.changeCoin){ game.changeCoin(-10); } this.backup=_status.event.dialog; _status.event.dialog.close(); _status.event.dialog=_status.event.parent.dialogxx; this.dialog=_status.event.dialog; this.dialog.open(); game.uncheck(); game.check(); if(ui.cheat){ ui.cheat.classList.add('disabled'); } } }); if(lib.onfree){ ui.cheat2.classList.add('disabled'); } } ui.create.cheat=function(){ _status.createControl=ui.cheat2; ui.cheat=ui.create.control('更换',function(){ if(ui.cheat2&&ui.cheat2.dialog==_status.event.dialog){ return; } if(game.changeCoin){ game.changeCoin(-3); } event.list=event.list.concat(list); event.list.randomSort(); // list=event.list.splice(0,parseInt(get.config('choice_num'))); list=game.getCharacterChoice(event.list,parseInt(get.config('choice_num'))); var buttons=ui.create.div('.buttons'); var node=_status.event.dialog.buttons[0].parentNode; _status.event.dialog.buttons=ui.create.buttons(list,'character',buttons); _status.event.dialog.content.insertBefore(buttons,node); buttons.addTempClass('start'); node.remove(); game.uncheck(); game.check(); }); delete _status.createControl; } if(!_status.brawl||!_status.brawl.chooseCharacterFixed){ if(!ui.cheat&&get.config('change_choice')) ui.create.cheat(); if(!ui.cheat2&&get.config('free_choose')) ui.create.cheat2(); } } "step 1" if(ui.cheat){ ui.cheat.close(); delete ui.cheat; } if(ui.cheat2){ ui.cheat2.close(); delete ui.cheat2; } if(result.buttons){ var name1=result.buttons[0].link,name2=result.buttons[1].link; event.choosen=[name1,name2]; if(get.is.double(name1,true)){ if(!get.is.double(name2,true)) event._result={control:lib.character[name2][1]}; else if(get.is.double(name1,true).removeArray(get.is.double(name2,true)).length==0||get.is.double(name2,true).removeArray(get.is.double(name1,true)).length==0) game.me.chooseControl(get.is.double(name2,true).filter(group=>get.is.double(name1,true).includes(group))).set('prompt','请选择你代表的势力').set('ai',()=>_status.event.controls.randomGet()); else event._result={control:get.is.double(name1,true).find(group=>get.is.double(name2,true).includes(group))}; } else if(lib.character[name1][1]=='ye'&&get.is.double(name2,true)) game.me.chooseControl(get.is.double(name2,true)).set('prompt','请选择副将代表的势力').set('ai',()=>_status.event.controls.randomGet()); } 'step 2' if(result&&result.control) game.me.trueIdentity=result.control; if(event.choosen){ game.me.init(event.choosen[0],event.choosen[1],false); game.addRecentCharacter(event.choosen[0],event.choosen[1]); } event.list.remove(game.me.name1); event.list.remove(game.me.name2); for(var i=0;ilist.length){ num=5; } else if(lib.configOL.number*7>list.length){ num=6; } else{ num=7; } var filterButton=function(button){ if(ui.dialog){ if(ui.dialog.buttons.length<=10){ for(var i=0;idouble.includes(group)); return doublex.includes(group2); } else{ if(group1=='ye') return group2!='ye'; var double=get.is.double(name2,true); if(double) return double.includes(group1); return group1==group2; } }; if(!ui.selected.buttons.length){ return ui.dialog.buttons.some(but=>{ if(but==button) return false; return filterChoice(button.link,but.link); }); } return filterChoice(ui.selected.buttons[0].link,button.link); }; list.randomSort(); for(var i=0;idouble.includes(group)); return doublex.includes(group2); } else{ if(group1=='ye') return group2!='ye'; var double=get.is.double(name2,true); if(double) return double.includes(group1); return group1==group2; } }; for(var i=0;iget.is.double(name2,true).includes(group)); } else if(lib.character[name1][1]=='ye'&&get.is.double(name2,true)){ chosen.push(lib.playerOL[i]); chosenCharacter.push([name1,name2]); } } event.result2=result; if(chosen.length){ for(var i=0;iget.is.double(name1,true).includes(group)); } if(lib.character[name1][1]=='ye'){ str='请选择你的副将代表的势力'; choice=get.is.double(name2,true); } chosen[i]=[chosen[i],[str,[choice.map(function(i){ return ['','','group_'+i]; }),'vcard']],1,true]; } game.me.chooseButtonOL(chosen,function(player,result){ if(player==game.me) player.trueIdentity=result.links[0][2].slice(6); }).set('switchToAuto',function(){ _status.event.result='ai'; }).set('processAI',function(){ return { bool:true, links:[_status.event.dialog.buttons.randomGet().link], } }); } else event._result={}; 'step 2' if(!result) result={}; var result2=event.result2; game.broadcastAll(function(result,result2){ for(var i=0;i根据“烽火”的数量,所有吴势力角色可于其准备阶段开始时选择并获得其中一个技能直到回合结束:一张以上:〖英姿〗;两张以上:〖好施〗;三张以上:〖涉猎〗;四张以上:〖度势〗;五张以上:可额外选择一项。
      锁定技,当你受到【杀】或锦囊牌造成的伤害后,你将一张“烽火”置入弃牌堆。', yuanjiangfenghuotu_ab:'江图', yuanjiangfenghuotu_bg:'图', wuxin:'悟心', wuxin_info:'摸牌阶段开始时,你可以观看牌堆顶的X张牌(X为群势力角色的数量),然后将这些牌以任意顺序置于牌堆顶。', hongfa:'弘法', hongfa_use:'天兵', hongfa_respond:'天兵', hongfa_info:'君主技,锁定技,此武将牌明置时,你获得“黄巾天兵符”;准备阶段开始时,若没有“天兵”,你将牌堆顶的X张牌置于“黄巾天兵符”上,称为“天兵”(X为群势力角色的数量)。', wendao:'问道', wendao_info:'出牌阶段限一次,你可以弃置一张不为【太平要术】的红色牌,然后获得弃牌堆或场上的一张【太平要术】。', huangjintianbingfu:'黄巾天兵符', huangjintianbingfu_ab:'兵符', huangjintianbingfu_bg:'符', huangjintianbingfu_info:'锁定技,当你计算群势力角色数时,每一张“天兵”均可视为一名群势力角色。
      当你失去体力时,你可改为将一张“天兵”置入弃牌堆。
      与你势力相同的角色可将一张“天兵”当作【杀】使用或打出。', wuhujiangdaqi:'五虎将大旗', wuhujiangdaqi_ab:'将旗', wuhujiangdaqi_bg:'旗', wuhujiangdaqi_info:'存活的蜀势力角色的技能按以下规则改动:
      武圣:将“红色牌”改为“任意牌”
      咆哮:增加描述“你使用的【杀】无视其他角色的防具”
      龙胆:增加描述“你发动〖龙胆〗使用或打出牌时摸一张牌”
      烈弓:增加描述“你的攻击范围+1”
      铁骑:将“一张明置的武将牌”改为“所有明置的武将牌”', zhangwu:'章武', zhangwu_info:'锁定技。当【飞龙夺凤】进入弃牌堆或其他角色的装备区后,你获得之。当你不因使用而失去【飞龙夺风】时,你展示此牌,将此牌置于牌堆底并摸两张牌。', shouyue:'授钺', shouyue_info:'君主技。只要此武将牌处于明置状态,你便拥有“五虎将大旗”。', jizhao:'激诏', jizhao_bg:'诏', jizhao_info:'限定技。当你处于濒死状态时,你可以将手牌补至体力上限,体力回复至2点,失去技能〖授钺〗并获得技能〖仁德〗。', gzshoucheng:'守成', gzshoucheng_info:'当与你势力相同的一名角色于其回合外失去手牌时,若其没有手牌,则你可以令其摸一张牌。', gzmingshi:'名士', gzmingshi_info:'锁定技,当你受到伤害时,若伤害来源有暗置的武将牌,此伤害-1。', fengshi:'锋矢', fengshi_sha:'锋矢', fengshi_info:'阵法技,在一个围攻关系中,若你是围攻角色,则你或另一名围攻角色使用【杀】指定被围攻角色为目标后,可令该角色弃置装备区内的一张牌。', gzsuishi:'随势', gzsuishi2:'随势', gzsuishi_info:'锁定技,其他角色进入濒死状态时,若伤害来源与你势力相同,你摸一张牌;其他角色死亡时,若其与你势力相同,你失去1点体力。', baoling:'暴凌', baoling_info:'主将技,锁定技,出牌阶段结束时,若你有副将,则你移除副将,然后加3点体力上限,回复3点体力,失去技能〖暴凌〗并获得〖崩坏〗。', yingyang:'鹰扬', yingyang_info:'当你的拼点牌亮出后,你可以令此牌的点数+3或-3(至多为K,至少为1)。', hunshang:'魂殇', hunshang_info:'副将技,此武将牌减少半个阴阳鱼;准备阶段,若你的体力值不大于1,则你本回合获得“英姿”和“英魂”。', gzguixiu:'闺秀', gzguixiu_info:'当你明置此武将牌时,你可以摸两张牌;当你移除此武将牌时,你可以回复1点体力。', gzcunsi:'存嗣', gzcunsi_info:'出牌阶段,你可以移除此武将牌并选择一名角色,然后其获得技能〖勇决〗,若你选择的目标角色不是自己,则其摸两张牌。', gzyongjue:'勇决', gzyongjue_info:'与你势力相同的一名角色于其回合内使用【杀】结算完成后,若此牌是其本回合内使用的第一张牌,则其可以获得此牌对应的所有实体牌。', gzqianxi:'潜袭', gzqianxi_info:'准备阶段开始时,你可以进行判定,然后你选择距离为1的一名角色,直到回合结束,该角色不能使用或打出与结果颜色相同的手牌。', gzshangyi:'尚义', gzshangyi_info:'出牌阶段限一次,你可以令一名其他角色观看你的手牌。若如此做,你选择一项:1.观看其手牌并可以弃置其中的一张黑色牌;2.观看其所有暗置的武将牌。', niaoxiang:'鸟翔', niaoxiang_sha:'鸟翔', niaoxiang_info:'阵法技,在同一个围攻关系中,若你是围攻角色,则你或另一名围攻角色使用【杀】指定被围攻角色为目标后,该角色需依次使用两张【闪】才能抵消。', yicheng:'疑城', yicheng_info:'当与你势力相同的一名角色成为【杀】的目标后,你可以令该角色摸一张牌,然后弃置一张牌。', gzyicheng:'疑城', gzyicheng_info:'阵法技。当你和你队列中的角色使用【杀】指定第一个目标后,或成为【杀】的目标后,其可以摸一张牌,然后弃置一张牌。', yizhi:'遗志', yizhi_info:'副将技,此武将牌减少半个阴阳鱼。若你的主将拥有技能〖观星〗,则将其描述中的X改为5;若你的主将没有技能〖观星〗,则你视为拥有技能〖观星〗。', tianfu:'天覆', tianfu_info:'主将技,阵法技,若当前回合角色与你处于同一队列,则你视为拥有技能〖看破〗。', ziliang:'资粮', ziliang_info:'副将技,当与你势力相同的一名角色受到伤害后,你可以将一张“田”交给该角色。', gzjixi:'急袭', gzjixi_info:'主将技,此武将牌减少半个阴阳鱼。你可以将一张“田”当作【顺手牵羊】使用。', huyuan:'护援', huyuan_info:'结束阶段开始时,你可以将一张装备牌置入一名角色的装备区,然后你可以弃置该角色距离为1的一名角色的一张牌。', heyi:'鹤翼', heyi_info:'阵法技。与你处于同一队列的角色视为拥有技能〖飞影〗。', gzhuyuan:'护援', gzhuyuan_info:'结束阶段开始时,你可以选择一项:⒈将一张非装备牌交给一名其他角色。⒉将一张装备牌置入其他角色的装备区内,然后你可以弃置场上的一张牌。', gz_shibing1wei:'魏兵', gz_shibing2wei:'魏兵', gz_shibing1shu:'蜀兵', gz_shibing2shu:'蜀兵', gz_shibing1wu:'吴兵', gz_shibing2wu:'吴兵', gz_shibing1qun:'群兵', gz_shibing2qun:'群兵', gz_shibing1jin:'晋兵', gz_shibing2jin:'晋兵', gz_shibing1ye:'士兵', gz_shibing2ye:'士兵', gz_shibing1key:'键兵', gz_shibing2key:'键兵', gzduanchang:'断肠', gzduanchang_info:'锁定技,当你死亡时,你令杀死你的角色失去一张武将牌上的所有技能。', gzweimu:'帷幕', gzweimu_info:'锁定技,当你成为黑色普通锦囊牌的目标时,或有黑色延时锦囊牌进入你的判定区时,取消之。', gzqianxun:'谦逊', gzqianxun_info:'锁定技,当你成为【顺手牵羊】的目标时,或有【乐不思蜀】进入你的判定区时,取消之。', gzkongcheng:'空城', gzkongcheng_info:'锁定技,当你成为【杀】或【决斗】的目标时,若你没有手牌,则取消之。', gzxiaoji:'枭姬', gzxiaoji_info:'当你失去装备区里的牌后,你可以摸一张牌。若你不是当前回合角色,则你改为摸三张牌。', gzrende:'仁德', gzrende_info:'出牌阶段,你可以将任意张手牌交给其他角色,然后若你于此阶段内给出第三张“仁德”牌时,你回复1点体力。', gzzhiheng:'制衡', gzzhiheng_info:'出牌阶段限一次,你可以弃置至多X张牌(X为你的体力上限),然后摸等量的牌。', duoshi:'度势', duoshi_info:'出牌阶段限四次,你可以将一张红色手牌当做【以逸待劳】使用。', gzxiaoguo:'骁果', gzxiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。', gzdangxian:'当先', gzdangxian_info:'锁定技。当你首次明置此武将牌时,你获得一枚“先驱”标记。回合开始时,你获得一个额外的出牌阶段。', gzhuanshi:'缓释', gzhuanshi_info:'一名己方角色的判定牌生效前,你可打出一张牌代替之。', gzhongyuan:'弘援', gzhongyuan_info:'①出牌阶段限一次。你可以令一张没有「合纵」标签的卡牌视为拥有「合纵」标签直到本回合结束。②当你即将因合纵效果摸牌时,你可放弃摸牌,并令一名己方角色摸等量的牌。', gzmingzhe:'明哲', gzmingzhe_info:'你的回合外,当你使用或打出红色手牌,或失去装备区内的红色装备牌时,你可摸一张牌。', gzxiongzhi:'雄志', gzxiongzhi_info:'限定技。出牌阶段,你可依次展示牌堆顶的X张牌并使用之(X为你的体力上限)。', gzquanbian:'权变', gzquanbian_info:'当你于出牌阶段内使用/打出手牌时,若此牌有花色且你本回合内未使用/打出过该花色的其他手牌,则你可以观看牌堆顶X张牌,选择获得其中的一张并展示之。若你本回合使用过与得到的牌花色相同的牌,则你本回合内不能再发动〖权变〗。', gzhuishi:'慧识', gzhuishi_info:'摸牌阶段,你可以放弃摸牌,改为观看牌堆顶的X张牌,获得其中的一半(向下取整),然后将其余牌置入牌堆底。(X为弃牌堆顶的两张牌的名称字数之和)', gzqingleng:'清冷', gzqingleng_info:'一名角色的回合结束时,若其有未明置的武将牌,则你可将一张牌当无距离限制的冰属性【杀】对其使用;若其所有武将牌均未明置,则你摸一张牌。', gzchoufa:'筹伐', gzchoufa_info:'出牌阶段限一次,你可展示一名其他角色的一张手牌A。你令其所有类型与A不同的手牌的牌名均视为【杀】且均视为无属性直到本回合结束。', gzbolan:'博览', gzbolan_info:'每名角色的出牌阶段限一次。其可以随机展示武将牌堆顶的一张武将牌,然后根据此武将牌包含的势力选择获得一个技能直到回合结束:魏:〖奇策〗;蜀:〖挑衅〗;吴:〖制衡〗;群:〖除疠〗;晋:〖三陈〗。若该角色不为你,则其失去1点体力。', gzsanchen:'三陈', gzsanchen_info:'出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则你于本回合获得一枚“陈”且其摸一张牌;否则你本阶段内不能再发动〖三陈〗。', gzpozhu:'破竹', gzpozhu_info:'主将技。此武将牌减少半个阴阳鱼。出牌阶段,你可以移去一枚“陈”并将一张手牌当做【出其不意】使用。', gzyimie:'夷灭', gzyimie_info:'主将技,此武将牌减少一整个阴阳鱼。每回合限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力。(Y为其体力值)', gztairan:'泰然', gztairan_info:'出牌阶段开始时,你可以失去任意点体力并弃置任意张牌(弃牌数不能大于你已损失的体力值)。若如此做,本回合结束时,你回复等量的体力并摸等量的牌。', gzxuanbei:'选备', gzxuanbei_info:'①当你首次明置此武将牌时,你获得两张拥有“应变”或“合纵”标签的牌(不足则摸牌),且你本回合内使用带有“应变”标签的牌时直接强化,使用带有“合纵”标签的牌时摸一张牌。②当你死亡时,你可以令一名其他角色变更副将。', gzzhaosong:'诏颂', gzzhaosong_info:'每局游戏每项限一次。①一名角色进入濒死状态时,你可以令其回复至2点体力并摸一张牌。②出牌阶段,你可观看一名其他角色的所有暗置武将牌和手牌,然后可以获得其区域内的一张牌。③一名角色使用【杀】选择唯一目标后,你可以为此【杀】增加两个目标。', gzlisi:'离思', gzlisi_info:'一名己方角色死亡后,你可以选择〖诏颂〗中的一个已发动过的选项,令其视为未发动过。', gzcaiyuan:'才媛', gzcaiyuan_info:'锁定技。结束阶段开始时,若你的手牌数大于本回合开始时的手牌数,则你摸两张牌或回复1点体力。', gzwanyi:'婉嫕', gzwanyi_info:'出牌阶段每项各限一次。你可以将一张带有“合纵”标签的牌当做【联军盛宴】/【火烧连营】/【挟天子以令诸侯】/【戮力同心】使用。', gzwanyi_info_yingbian:'出牌阶段每项各限一次。你可以将一张带有“应变”标签的牌当做【逐近弃远】/【洞烛先机】/【水淹七军】/【出其不意】使用。', gzmaihuo:'埋祸', gzmaihuo_info:'限定技。当有己方角色成为【杀】的目标时,你可以取消此【杀】的所有目标。然后此【杀】的使用者下回合开始时,其视为对你使用一张【杀】。若此【杀】对你造成伤害,则你防止此伤害,摸两张牌并移除此武将牌(若此武将牌为副将则改为变更副将)。', gzzhenxi:'震袭', gzzhenxi_info:'当你使用【杀】指定目标后,你可以选择一项:1.弃置目标角色一张牌;2.将一张♦非锦囊牌当做【乐不思蜀】或♣非锦囊牌当做【兵粮寸断】对目标角色使用;3.背水:若其有暗置的武将牌且你的武将牌均明置,则你可以依次执行这两项。', gzjiansu:'俭素', gzjiansu_tag:'俭', gzjiansu_info:'副将技。此武将牌减少半个阴阳鱼。①当你于回合外得到牌后,你可以展示这些牌,称为“俭”。②出牌阶段开始时,你可以弃置任意张“俭”,令一名体力值不大于X的角色回复1点体力(X为你以此法弃置的牌数)。', gzzhuidu:'追妒', gzzhuidu_info:'出牌阶段限一次。当你造成伤害时,你可以令受伤角色选择一项:1.此伤害+1;2.弃置装备区里的所有牌。若该角色为女性,则你可以弃置一张牌,改为令其选择两项。', gzshigong:'示恭', gzshigong_info:'限定技。当你于回合外进入濒死状态时,你可以移除副将,然后令当前回合角色选择一项:1.获得你以此法移除的副将武将牌上的一个没有技能标签的技能,然后令你将体力值回复至体力上限;2.令你将体力值回复至1点。', gz_old_huaxiong:'华雄', gzyaowu:'耀武', gzyaowu_info:'限定技。当你造成伤害后,你可以明置此武将牌,然后你加2点体力上限并回复2点体力,修改〖恃勇〗,且当你死亡后,所有与你势力相同的角色失去1点体力。', gzshiyong:'恃勇', gzshiyong_info:'锁定技。当你受到牌造成的伤害后,若此牌不为红色,你摸一张牌。', gzshiyongx:'恃勇·改', gzshiyongx_info:'锁定技。当你受到牌造成的伤害后,若此牌不为黑色,伤害来源摸一张牌。', gztanfeng:'探锋', gztanfeng_info:'准备阶段,你可以弃置与你势力不同的一名角色区域内的一张牌,然后其可以令你对其造成1点火焰伤害,并令你跳过本回合的一个阶段(准备阶段和结束阶段除外)。', //官盗「群雄割据」 gzduanshi:'断势', gzduanshi_info:'主将技,锁定技。此武将牌减少半个阴阳鱼。当一名角色因杀死与你势力相同的角色而摸牌时,其少摸一张牌。然后你摸一张牌。', gzjingce:'精策', gzjingce_info:'回合结束时,若于本回合内进入弃牌堆的牌数不小于X,你可以执行一个额外的摸牌阶段;若你本回合使用过的牌数不小于X,你可以执行一个额外的出牌阶段(X为你的体力值)。', gzzhengrong:'征荣', gzzhengrong_info:'锁定技。①你至大势力角色的距离-1。②当你选择“军令”时,你令可选军令数量+1。③当你造成或受到伤害时,若你没有存活的队友,则此伤害+1。', gzhongju:'鸿举', gzhongju_info:'限定技。出牌阶段,你可以选择一名其他角色A并选择一个“军令”。你执行该军令,然后令除A以外的所有其他角色依次选择一项:⒈执行该军令。⒉于本回合视为移出游戏。', gzbiaozhao:'表召', gzbiaozhao_info:'出牌阶段限一次。你可以选择两名势力不同的其他角色A和B。你视为对A使用一张【知己知彼】,然后将一张牌交给B并摸一张牌。', gzyechou:'业仇', gzyechou_info:'锁定技。当你死亡时,你视为对杀死你的角色依次使用三张【杀】,其中第一张不可被响应,第二张无视防具,第三张对其造成的伤害+1。若其以此法进入濒死状态,则于本次濒死结算中除其外与其势力相同的角色不能对其使用【桃】。', //官盗「十年经典」 gzdianhu:'点虎', gzdianhu_info:'锁定技。当你首次明置此武将牌时,你选择一名其他角色。与你势力相同的角色对其造成伤害后,伤害来源摸一张牌。', gzjianji:'谏计', gzjianji_info:'出牌阶段限一次。你可以令一名角色摸一张牌并展示之,然后其可以使用此牌。', gzgongjian:'攻坚', gzgongjian_info:'①当其他角色的牌因弃置而进入弃牌堆后,若令其弃置这些牌的角色为你,你获得其中所有的【杀】。②每回合限一次,当一名角色使用【杀】指定目标后,若有目标与本局游戏上一张被使用的【杀】相同,你可以令这些目标弃置两张牌。', gzkuimang:'溃蟒', gzkuimang_info:'锁定技。当你杀死与你势力不同且处于队列的角色时,你摸两张牌。', gzyinpan:'引叛', gzyinpan_info:'出牌阶段限一次。你可以选择一名其他角色,令所有与其势力不同的角色依次选择是否对其使用一张【杀】。然后其下回合使用【杀】的次数上限+X(X为其以此法受到的伤害次数),若其以此法进入过濒死状态,其回复1点体力。', gzxingmou:'兴谋', gzxingmou_info:'锁定技。①你杀死其他角色或其他角色杀死你均不执行奖惩。②其他角色因执行奖惩而摸牌时,你摸一张牌。', //官正「十年踪迹十年心」 gzyouyan:'诱言', gzyouyan_info:'回合内限一次。当你的牌因弃置而进入弃牌堆后,你可以展示牌堆顶的四张牌,然后获得其中与你此次弃置的牌花色均不同的牌。', gzzhuihuan:'追还', gzzhuihuan_info:'结束阶段,你可以选择至多两名角色,然后依次为被选择的角色标记A或B(字母不能重复标记)。直到你的下回合开始,当A第一次受到伤害后,其对来源造成1点伤害;当B第一次受到伤害后,来源弃置两张手牌。', //插个眼,手杀国战新张鲁 gzrebushi:'布施', gzrebushi_info:'①回合结束后,你获得X个“义舍”标记(X为你的体力值)。②其他角色的准备阶段,你可以失去1个“义舍”标记,交给其一张牌并摸两张牌。③准备阶段,你须弃置Y张牌,然后失去所有“义舍”标记(Y为场上存活人数-你的体力值-2)。', gzremidao:'米道', gzremidao_info:'①结束阶段开始时,若你的武将牌上没有“米”,则你可以摸两张牌。若如此做,你将两张牌置于武将牌上,称为“米”。②一名角色的判定牌生效前,你可以打出一张“米”作为新的判定牌,然后你获得原判定牌。', jiahe_reyingzi:'英姿', jiahe_haoshi:'好施', jiahe_shelie:'涉猎', jiahe_duoshi:'度势', //国战典藏2023 gzdiaodu:'调度', gzdiaodu_info:'①与你势力相同的角色使用装备牌时,其可以摸一张牌。②出牌阶段开始时,你可以获得一名与你势力相同的角色的装备区里的一张牌,然后你将此牌交给另一名角色。', gzqiance:'谦策', gzqiance_info:'与你势力相同的角色使用锦囊牌指定第一个目标后,你可以令其中的所有大势力角色无法响应此牌。', gzjujian:'举荐', gzjujian_info:'副将技,锁定技。①此武将牌计算体力上限时减少半个阴阳鱼。②与你势力相同的角色进入濒死状态时,你可以令其将体力值回复至1点,然后你变更副将。', gztongling:'通令', gztongling_info:'出牌阶段限一次,当你对一名与你势力不同的角色A造成伤害后,你可以选择一名与你势力相同的角色B,令B选择是否对A使用一张牌。若B选择使用,则此牌结算后,若此牌造成过伤害,你和B各摸两张牌,否则A获得你对其造成伤害的牌。', gzjinyu:'近谀', gzjinyu_info:'当你明置此武将牌后,你令所有与你距离为1以内的角色依次执行以下效果:若其武将牌均明置,则其选择一张武将牌暗置,否则其弃置两张牌。', gzrehuaiyi:'怀异', gzrehuaiyi_info:'出牌阶段限一次,你可以展示所有手牌。若其中至少包含两种颜色,则你可以弃置其中一种颜色的所有牌,然后获得至多等量名角色的各一张牌。然后你将以此法得到的装备牌置于武将牌上,称为“异”。你可以将“异”如手牌般使用或打出。', gzrezisui:'恣睢', gzrezisui_info:'锁定技。①摸牌阶段,你多摸X张牌。②结束阶段,若X大于你的体力上限,你死亡(X为你武将牌上的“异”数)。', gztaidan:'太丹', gztaidan_taipingyaoshu:'太丹', gztaidan_info:'锁定技,若你的防具栏为空且你的防具栏未被废除,你视为装备【太平要术】。', gzrejinghe:'经合', gzrejinghe_info:'出牌阶段限一次,你可以转动“天书”,然后令一名角色获得“天书”向上一面的技能直到你的下个回合开始。', gzrejinghe_faq:'转动“天书”', gzrejinghe_faq_info:'
    • 若游戏未拥有“天书”,系统将[雷击,阴兵,活气,鬼助,仙授,论道,观月,言政]以顺时针方向组成圆环作为“天书”,并转动圆环将随机一个技能至于最上面。
    • 若游戏已拥有“天书”,则以逆时针方向转动转动“天书”至下个技能于最上面。', gz_key_ushio:'冈崎汐', ushio_huanxin:'幻心', ushio_huanxin_info:'当你受到伤害后/使用【杀】造成伤害后/使用装备牌后,你可进行判定。然后你获得判定牌并弃置一张牌。', ushio_xilv:'汐旅', ushio_xilv2:'汐旅', ushio_xilv_info:'锁定技,此武将牌可作为任意单势力武将牌的副将。当你进行判定后,你令你的手牌上限+1直至你的下个结束阶段。', //官盗2023 fakexiaoguo:'骁果', fakexiaoguo_info:'一名其他角色的准备阶段,你可以弃置任意张基本牌,然后弃置其装备区等量的牌,若其装备区的牌数小于你弃置的牌数,则你对其造成1点伤害。', fakeduanbing:'短兵', fakeduanbing_info:'①你使用【杀】可以额外指定一名距离为1或以内的目标。②当你使用【杀】指定唯一目标后,你令目标角色需要额外使用一张【闪】响应此【杀】。', fakeduoshi:'度势', fakeduoshi_info:'每轮限一次,友方角色可以将一张红色手牌当作【以逸待劳】使用,然后若你为小势力角色,你可以令一名友方角色将X张手牌当作不可被响应的【火烧连营】使用(X为此【以逸待劳】指定的目标数)。', fakehanzhan:'酣战', fakehanzhan_info:'有你参与的拼点事件结束后,没赢的角色可以获得对方装备区的一张牌。', fakeshuangxiong:'双雄', fakeshuangxiong_info:'①摸牌阶段,你可以放弃摸牌并进行判定,本回合你可以将一张与此牌颜色不同的手牌当作【决斗】使用。②当你的判定牌于回合内生效后,你获得此牌。', fakeyicheng:'疑城', fakeyicheng_info:'与你势力相同的角色成为【杀】的目标后,你可以令其摸一张牌,然后其可以使用一张装备牌,其于此回合结束时弃置X张牌(X为你本回合对其发动此技能的次数)。', fakefenming:'奋命', fakefenming_info:'出牌阶段限一次,若你处于横置状态,你可以弃置所有处于横置状态的角色的各一张牌。', fakebaoling:'暴凌', fakebaoling_info:'主将技,锁定技,出牌阶段结束时,若你有副将,则你移除副将,加3点体力上限并回复3点体力,然后获得〖崩坏〗。', fakebenghuai:'崩坏', fakebenghuai_info:'结束阶段,若你的体力值不为全场最低,则你选择一项:①失去1点体力;②减1点体力上限;③背水:执行一个额外的摸牌阶段。', fakediaodu:'调度', fakediaodu_info:'①每回合每种牌的类别限一次,与你势力相同的角色使用牌时,若此牌有目标且包含其,则其可以摸一张牌。②出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。', fakeyigui:'役鬼', fakeyigui_info:'①当你首次明置此武将牌时,你将剩余武将牌堆的两张牌称为“魂”置于武将牌上。②你可以展示一张武将牌上的“魂”并将其置入剩余武将牌堆,视为使用一张本回合内未以此法使用过的类别的基本牌或普通锦囊牌(此牌须指定目标,且目标须为未确定势力的角色或野心家或与此“魂”势力相同的角色)。', fakejihun:'汲魂', fakejihun_info:'①当你受到伤害后,或与你势力不同的角色脱离濒死状态后,你可以将剩余武将牌堆的一张牌称为“魂”置于武将牌上。②准备阶段,你可以将至多两张“魂”置入剩余武将牌堆,然后将剩余武将牌堆的等量张牌称为“魂”置于武将牌上。', fakejueyan:'决堰', fakejizhi:'集智', fakejueyan_info:'主将技。①此武将牌计算体力上限时减少半个阴阳鱼。②准备阶段,你可以选择一个区域并于本回合的结束阶段弃置此区域的所有牌,然后你于本回合获得以下对应效果:⒈判定区:跳过判定阶段,获得〖集智〗直到回合结束;⒉装备区:摸三张牌,本回合手牌上限+3;⒊本回合使用【杀】的额定次数+3。', fakequanji:'权计', fakequanji_info:'①每回合每项各限一次,当你造成或受到伤害后,你可以摸X张牌,然后将等量的牌称为“权”置于武将牌上。②你的手牌上限+X(X为你武将牌上的“权”数)。', fakepaiyi:'排异', fakepaiyi_info:'出牌阶段限一次,你可以选择一名角色,然后选择一个军令令其选择是否执行。若其执行,则你摸X张牌,然后将一张“权”置入弃牌堆;若其不执行,则你可以对至多X名与其势力相同的角色各造成1点伤害,然后将等量的“权”置入弃牌堆。(X为你武将牌上的“权”数)', fakeshilu:'嗜戮', fakeshilu_info:'①出牌阶段结束时,若你有副将且本阶段未发动过副将武将牌上的非锁定技,则你更换副将并将原副将称为“戮”置于武将牌上。②准备阶段,你弃置X张手牌,然后摸X张牌(X为你武将牌上的“戮”数,少牌全弃,无牌不弃)。', fakexiongnve:'凶虐', fakexiongnve_info:'①当你使用【杀】造成伤害时或受到【杀】造成的伤害时,若你武将牌上的“戮”包含伤害来源的势力,则你令此伤害+1。②当你受到不为【杀】造成的伤害时,若你武将牌上的“戮”包含伤害来源的势力,则此伤害-1。', fakehuaiyi:'怀异', fakehuaiyi_info:'出牌阶段限一次,你可以移除副将或弃置一个区域的所有牌,然后令所有大势力角色依次交给你至少一张牌,然后若存在多个大势力,则你移除一个此次交给你牌总数唯一最少的势力的其中一名角色的副将。', fakezisui:'恣睢', fakezisui_info:'锁定技。①一名角色被你移除副将后,你将被移除的武将牌称为“异”置于武将牌上。②摸牌阶段,你多摸X张牌。③结束阶段,若X大于你的体力上限,你死亡。(X为你武将牌上的“异”数)', fakejujian:'举荐', fakejujian_info:'副将技。①此武将牌计算体力上限时减少半个阴阳鱼。②结束阶段,你可以弃置一张非基本牌并选择一名友方角色,令其选择摸两张牌或回复1点体力,然后其可以变更副将。', fakexibing:'息兵', fakexibing_info:'当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至体力值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。', fakechengshang:'承赏', fakechengshang_info:'出牌阶段限一次,当你使用存在花色和点数且指定了其他势力角色为目标的牌结算完毕后,若你未因此牌造成过伤害,则你可以摸一张牌,然后本阶段你可以将一张手牌当作初始游戏牌堆中与此牌花色和点数相同的另一张基本牌或普通锦囊牌使用一次。', fakezhente:'贞特', fakezhente_info:'每回合限一次,当你成为其他角色使用普通锦囊牌或黑色基本牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.令此牌对你无效。', fakezhiwei:'至微', fakezhiwei_info:'你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。若该角色未死亡,则此武将牌被暗置前,取消之。', fakekuangcai:'狂才', fakekuangcai_info:'锁定技,你于回合内使用牌无距离和次数限制;弃牌阶段开始时,若你本回合内:未使用过牌,则你本回合手牌上限+1;使用过牌但未造成过伤害,则你本回合手牌上限-1。', faketunchu:'屯储', faketunchu_info:'摸牌阶段,你可以额外摸两张牌,然后你将一至两张牌称为“粮”置于武将牌上。若如此做,你本回合不能使用【杀】。', fakeshuliang:'输粮', fakeshuliang_info:'友方角色的结束阶段,若你与其的距离不大于你武将牌上的“粮”数,则你可以移去一张“粮”,然后令其摸两张牌。', fakedujin:'独进', fakedujin_info:'①摸牌阶段,你可以额外摸X张牌(X为你装备区的牌数的一半,向上取整)。②当你首次明置此武将牌时,若你为你们势力第一个明置武将牌的角色,则你获得1个“先驱”标记。', fakezhufu:'注傅', fakezhufu_info:'出牌阶段,你可以弃置一张本阶段未以此法弃置过的花色的牌,然后根据此牌的花色为你使用的下一张牌添加对应的应变效果(无视条件触发):红桃——助战;方片——富甲;黑桃——残躯;草花——空巢。', fakeguishu:'鬼术', fakeguishu_info:'出牌阶段限一次,你可以将一张黑桃手牌当作【知己知彼】或【远交近攻】使用。若你本局游戏内已经发动过了〖鬼术〗,则你必须选择与上次不同的选项。', fakeyuanyu:'远域', fakeyuanyu_info:'锁定技,当你受到伤害时,若你不在伤害来源的攻击范围内,则防止此伤害。', fakemibei:'秘备', fakemibei_info:'①准备阶段,若你的手牌数不为全场最多,则你须选择一名手牌数为全场最多的角色,令其对你发起军令。②当你执行军令后,你将手牌数摸至与发起者相同(至多摸五张)。③当你拒绝执行军令后,你展示一至三张牌,然后你本回合可以将其中一张牌当作另一张基本牌或非延时锦囊牌使用一次。', fakeqizhi:'奇制', fakeqizhi_info:'当你于回合内使用非装备牌A时,你可以弃置不是此牌目标的一名角色的一张牌B,然后其摸一张牌。若A具有应变效果,且A和B的花色相同,则你无视条件触发A的应变效果。', fakejinqu:'进趋', fakejinqu_info:'结束阶段,你可以摸两张牌,然后你将手牌弃置至X张(X为你本回合发动过〖奇制〗的次数)。', fakejuzhan:'拒战', fakejuzhan_info:'转换技。阴:当你成为【杀】的目标后,你可以与使用者各摸X张牌,然后若使用者的武将牌均明置,则你可以暗置其一张武将牌,且其本回合不能明置此武将牌。阳,当你使用【杀】指定目标后,你可以获得目标角色的X张牌,然后若你的武将牌均明置,则其可以暗置此武将牌,且你本回合不能明置此武将牌。(X为使用者已损失的体力值且X至少为1)', fakedanshou:'胆守', fakedanshou_info:'每轮限一次,一名角色的准备阶段,你可以弃置一个区域的所有牌。若如此做,本回合其每个阶段开始时(准备阶段和结束阶段除外),你摸一张牌或令本回合以此法摸牌数+1,然后若你选择了摸牌且你本次至少摸了四张牌,则你可以对其造成1点伤害。', fakexunxi:'迅析', fakexunxi_info:'其他角色于回合外明置武将牌时,你可以视为对其使用一张【杀】(无距离限制)。', fakehuanjia:'擐甲', fakehuanjia_info:'锁定技,每回合每项各限一次。①当你成为【杀】的目标后,本回合你视为装备此牌使用者的防具,直到你的装备区中有防具。②当你使用【杀】指定唯一目标后,本回合你视为装备目标角色的武器,直到你的装备区中有武器。', fakexiongshu:'凶竖', fakexiongshu_info:'每回合限一次,一名角色使用【杀】或伤害类锦囊牌指定第一个目标后,若你为/不为此牌使用者,则你可以摸一张牌并令一名其他角色成为此牌的伤害来源/弃置一张牌并成为此牌的伤害来源。', fakejianhui:'奸回', fakejianhui_info:'当一名角色受到其势力相同的另一名角色造成的伤害后,你可以令其中一名角色摸一张牌,然后弃置其中另一名角色的一张牌。', fakechongxin:'崇信', fakechongxin_info:'出牌阶段限一次,你可以选择一名与你势力不同的角色,视为你使用一张指定你与其为目标的【以逸待劳】。', fakeweirong:'卫戎', fakeweirong_info:'转换技,每轮限一次,出牌阶段。阴:你可以弃置X张牌,然后当你于本轮不因此法得到牌后,你摸一张牌。阳:你可以摸X张牌,然后当你于本轮不因此法失去牌后,你弃置一张牌。(X为你上一轮以此法摸和弃置的牌数之和,且X至少为1,至多为你的体力上限)', gz_re_taishici:'太史慈', gz_xin_zhuran:'朱然', gz_jin_jiachong:'贾充', gz_jin_yanghu:'羊祜', gz_wangling:'王淩', fakequanbian:'权变', fakequanbian_tag:'牌堆顶', fakequanbian_info:'当你于回合内使用或打出牌时,你可以将一张手牌与牌堆顶X张牌的其中一张进行交换(X为你的体力上限)。', fakezhouting:'骤霆', fakezhouting_info:'限定技,出牌阶段,你可以依次使用牌堆顶X张牌中所有可以使用的牌,然后获得其中不能使用的牌,然后若有角色因此死亡,则你重置〖骤霆〗(X为你的体力上限)。', fakeqingleng:'清冷', fakeqingleng_info:'其他角色的结束阶段,若其武将牌均明置,则你可以将一张牌当作冰【杀】对其使用(无距离限制)。然后若此牌未对其造成伤害,则你暗置其一张武将牌,且直到其下个回合开始,其明置此武将牌时,你对其造成1点伤害。', fakexijue:'袭爵', fakexijue_info:'①当你首次明置此武将牌时,你获得2枚“爵”标记。②回合结束时,若你本回合造成过伤害,则你获得1枚“爵”标记。③你可以于合适的时机发动〖突袭〗或〖骁果〗(至多弃置X张基本牌),然后移去1枚“爵”标记。④摸牌阶段,你改为摸X张牌。(X为你的“爵”标记数,且X至多为你的体力上限)', fakexijue_xiaoguo:'骁果', fakexijue_xiaoguo_info:'一名其他角色的准备阶段,你可以弃置至多X张基本牌(X为你的“爵”标记数,且X至多为你的体力上限),然后弃置其装备区等量的牌,若其装备区的牌数小于你弃置的牌数,则你对其造成1点伤害。', fakeqimei:'齐眉', fakeqimei_info:'准备阶段,你可以选择一名其他角色。若如此做,直到回合结束:当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色回复1点体力;当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。', fakebaoqie:'宝箧', fakebaoqie_info:'①当你受到伤害时,若此武将牌未明置过,则你可以明置此武将牌并防止此伤害。②当你首次明置此武将牌时,你可以获得一名角色的宝物牌,然后你可以使用其中的一张牌。', fakeciwei:'慈威', fakeciwei_info:'其他角色于一回合内使用第偶数张牌时,你可以弃置一张牌并取消此牌的所有目标,然后若此牌为装备牌,你可以获得之且你可以使用之。', fakehuirong:'慧容', fakehuirong_info:'①当你受到伤害时,若此武将牌未明置过,则你可以明置此武将牌并防止此伤害。②当你首次明置此武将牌时,你可以令一名角色将手牌数调整至其体力值。', fakeyanxi:'宴戏', fakeyanxi_info:'出牌阶段限一次,你可以展示一名其他角色的一张手牌和牌堆顶的两张牌,然后你获得其中一种颜色或类别的所有牌且本回合手牌上限+X(X为你获得的牌数),然后其获得剩余的牌。', fakeshiren:'识人', fakeshiren_info:'①当你受到伤害时,若此武将牌未明置过,则你可以明置此武将牌并防止此伤害。②当你首次明置此武将牌时,你可以发动一次〖宴戏〗。', fakecanmou:'参谋', fakecanmou_info:'每回合每项限一次,一名角色使用普通锦囊牌指定第一个目标时,若其手牌数为全场唯一最多,则你可以为此牌增加或减少一个目标(目标数至少为1)。', fakezhuosheng:'擢升', fakezhuosheng_info:'每回合每种牌名限一次,你可以将至少两张手牌当作任意基本牌使用,若你以此法使用的牌中包含具有应变效果的牌,则你令此牌无视条件获得对应的应变效果。', fakejuhou:'拒后', fakejuhou_info:'阵法技,与你处于同一队列的角色成为【杀】或普通锦囊牌的目标后,你可以令其将任意张牌置于其武将牌上,然后其于此牌结算完毕后获得这些牌。', gznaxiang:'纳降', gznaxiang_info:'锁定技,当你受到其他角色造成的伤害后,或你对其他角色造成伤害后,你对其发动〖才望〗时的“弃置”改为“获得”直到你的下回合开始。', fakecaiwang:'才望', fakecaiwang_info:'①你可以助战自己。②每回合每项各限一次,当你响应助战后,若你弃置的牌和被强化的牌:颜色相同,你可以弃置一名其他角色的一张牌;颜色不同,你摸一张牌。', fakenaxiang:'纳降', fakenaxiang_info:'锁定技。①当你对与你势力不同的角色造成伤害后,或受到与你势力不同的角色对你造成的伤害后。你对其发起军令,若其不执行,则你不能对其发动〖纳降①〗直到你的下个回合开始。②你响应助战弃牌无类别限制,且你触发具有应变的卡牌的条件均视为助战。', guozhan_default:"国战标准", guozhan_zhen:"君临天下·阵", guozhan_shi:"君临天下·势", guozhan_bian:"君临天下·变", guozhan_quan:"君临天下·权", guozhan_jun:"君主武将", guozhan_jin:'文德武备', guozhan_single:'君临天下EX', guozhan_double:'双势力武将', guozhan_yexinjia:'野心家武将', guozhan_zongheng:'纵横捭阖', guozhan_tw:'海外服专属', guozhan_mobile:'移动版', guozhan_qunxiong:'群雄割据', guozhan_decade:'十年踪迹十年心', guozhan_others:"其他", }, junList:['liubei','zhangjiao','sunquan','caocao'], guozhanPile_yingbian:[ //黑桃普通 ['spade',1,'shandian'], ['spade',1,'xietianzi'], ['spade',1,'juedou'], ['spade',2,'bagua'], ['spade',2,'heiguangkai'], ['spade',2,'cixiong'], ['spade',2,'taigongyinfu'], ['spade',3,'zhujinqiyuan',null,['yingbian_zhuzhan','yingbian_add']], ['spade',3,'huoshaolianying'], ['spade',3,'shuiyanqijunx',null,['yingbian_zhuzhan','yingbian_add']], ['spade',4,'guohe'], ['spade',4,'sha'], ['spade',4,'shuiyanqijunx',null,['yingbian_zhuzhan','yingbian_add']], ['spade',5,'jueying'], ['spade',5,'qinglong'], ['spade',5,'sha'], ['spade',6,'qinggang'], ['spade',6,'jiu'], ['spade',6,'sha','ice'], ['spade',7,'sha'], ['spade',7,'sha'], ['spade',7,'sha','ice'], ['spade',8,'sha','ice'], ['spade',8,'sha','ice'], ['spade',8,'sha'], ['spade',9,'jiu'], ['spade',9,'sha','thunder'], ['spade',9,'sha'], ['spade',10,'bingliang'], ['spade',10,'sha','thunder'], ['spade',10,'sha',null,['yingbian_canqu','yingbian_add']], ['spade',11,'wuxie',null,['yingbian_kongchao','yingbian_draw']], ['spade',11,'sha',null,['yingbian_canqu','yingbian_add']], ['spade',11,'sha','thunder'], ['spade',12,'zhangba'], ['spade',12,'lulitongxin'], ['spade',12,'tiesuo'], ['spade',13,'wutiesuolian'], ['spade',13,'wuxie'], ['spade',13,'nanman',null,['yingbian_fujia','yingbian_remove']], //草花普通 ['club',1,'juedou'], ['club',1,'yuxi'], ['club',1,'huxinjing'], ['club',2,'sha'], ['club',2,'tianjitu'], ['club',2,'renwang'], ['club',2,'tengjia'], ['club',3,'sha'], ['club',3,'chiling'], ['club',3,'zhibi'], ['club',4,'sha',null,['yingbian_kongchao','yingbian_add']], ['club',4,'sha','thunder'], ['club',4,'zhibi'], ['club',5,'sha',null,['yingbian_kongchao','yingbian_add']], ['club',5,'sha','thunder'], ['club',5,'tongque'], ['club',6,'sha','thunder'], ['club',6,'sha',null,['yingbian_kongchao','yingbian_add']], ['club',6,'lebu'], ['club',7,'sha','thunder'], ['club',7,'sha'], ['club',7,'nanman',null,['yingbian_fujia','yingbian_remove']], ['club',8,'sha','thunder'], ['club',8,'sha',null,['yingbian_canqu','yingbian_add']], ['club',8,'sha'], ['club',9,'sha'], ['club',9,'jiu'], ['club',9,'jiu'], ['club',10,'bingliang'], ['club',10,'lulitongxin'], ['club',10,'sha'], ['club',11,'sha'], ['club',11,'huoshaolianying'], ['club',11,'sha'], ['club',12,'zhujinqiyuan',null,['yingbian_zhuzhan','yingbian_add']], ['club',12,'jiedao',null,['yingbian_fujia','yingbian_hit']], ['club',12,'tiesuo'], ['club',13,'tiesuo'], ['club',13,'wuxie',null,['guo']], ['club',13,'wuxie',null,['guo']], //红桃普通 ['heart',1,'wanjian'], ['heart',1,'taoyuan'], ['heart',1,'lianjunshengyan'], ['heart',2,'shan'], ['heart',2,'chuqibuyi',null,['yingbian_zhuzhan','yingbian_add']], ['heart',2,'diaohulishan'], ['heart',3,'chuqibuyi',null,['yingbian_zhuzhan','yingbian_add']], ['heart',3,'wugu'], ['heart',3,'jingfanma'], ['heart',4,'tao'], ['heart',4,'sha','fire',['yingbian_canqu','yingbian_damage']], ['heart',4,'shan'], ['heart',5,'qilin'], ['heart',5,'chitu'], ['heart',5,'shan',null,['yingbian_kongchao','yingbian_draw']], ['heart',6,'lebu'], ['heart',6,'tao'], ['heart',6,'shan',null,['yingbian_kongchao','yingbian_draw']], ['heart',7,'tao'], ['heart',7,'dongzhuxianji'], ['heart',7,'shan'], ['heart',8,'tao'], ['heart',8,'dongzhuxianji'], ['heart',8,'tao'], ['heart',9,'tao'], ['heart',9,'yuanjiao'], ['heart',9,'tao'], ['heart',10,'sha'], ['heart',10,'shan'], ['heart',10,'sha'], ['heart',11,'yiyi'], ['heart',11,'tao'], ['heart',11,'sha',null,['yingbian_zhuzhan','yingbian_add']], ['heart',12,'tao'], ['heart',12,'sha'], ['heart',12,'huoshaolianying'], ['heart',13,'zhuahuang'], ['heart',13,'shan'], ['heart',13,'huogong',null,['yingbian_zhuzhan','yingbian_add']], //方片普通 ['diamond',1,'wuxinghelingshan'], ['diamond',1,'zhuge'], ['diamond',1,'xietianzi'], ['diamond',2,'shan'], ['diamond',2,'tao'], ['diamond',2,'tao'], ['diamond',3,'shunshou'], ['diamond',3,'shan'], ['diamond',3,'tao'], ['diamond',4,'yiyi'], ['diamond',4,'sha','fire',['yingbian_canqu','yingbian_damage']], ['diamond',4,'sha','fire',['yingbian_zhuzhan','yingbian_add']], ['diamond',5,'guanshi'], ['diamond',5,'sha','fire'], ['diamond',5,'muniu'], ['diamond',6,'wuliu'], ['diamond',6,'shan'], ['diamond',6,'shan'], ['diamond',7,'shan',null,['yingbian_kongchao','yingbian_draw']], ['diamond',7,'shan',null,['yingbian_kongchao','yingbian_draw']], ['diamond',7,'shan'], ['diamond',8,'shan',null,['yingbian_kongchao','yingbian_draw']], ['diamond',8,'shan',null,['yingbian_kongchao','yingbian_draw']], ['diamond',8,'sha','fire'], ['diamond',9,'jiu'], ['diamond',9,'shan'], ['diamond',9,'sha','fire'], ['diamond',10,'shan'], ['diamond',10,'sha'], ['diamond',10,'diaohulishan'], ['diamond',11,'sha'], ['diamond',11,'shan'], ['diamond',11,'wuxie',null,['guo']], ['diamond',12,'sha'], ['diamond',12,'sanjian'], ['diamond',12,'wuxie',null,['guo']], ['diamond',12,'fangtian'], ['diamond',13,'zixin'], ['diamond',13,'shan'], ['diamond',13,'shan'], //特殊 ['heart',3,'taipingyaoshu'], ['diamond',4,'dinglanyemingzhu'], ['heart',5,'liulongcanjia'], ['spade',6,'feilongduofeng'], ['club',12,'gz_wenheluanwu'], ['heart',1,'gz_guguoanbang'], ['spade',12,'gz_haolingtianxia'], ['diamond',1,'gz_kefuzhongyuan'], ], guozhanPile_old:[ ['spade',1,'juedou'], ['spade',1,'shandian'], ['spade',2,'cixiong'], ['spade',2,'bagua'], ['spade',2,'hanbing'], ['spade',3,'guohe'], ['spade',3,'shunshou'], ['spade',4,'guohe'], ['spade',4,'shunshou'], ['spade',5,'sha'], ['spade',5,'jueying'], ['spade',6,'qinggang'], ['spade',6,'sha','thunder'], ['spade',7,'sha'], ['spade',7,'sha','thunder'], ['spade',8,'sha'], ['spade',8,'sha'], ['spade',9,'sha'], ['spade',9,'jiu'], ['spade',10,'sha'], ['spade',10,'bingliang'], ['spade',11,'sha'], ['spade',11,'wuxie'], ['spade',12,'zhangba'], ['spade',12,'tiesuo'], ['spade',13,'nanman'], ['spade',13,'dawan'], ['club',1,'juedou'], ['club',1,'baiyin'], ['club',2,'sha'], ['club',2,'tengjia'], ['club',2,'renwang'], ['club',3,'sha'], ['club',3,'zhibi'], ['club',4,'sha'], ['club',4,'zhibi'], ['club',5,'sha'], ['club',5,'dilu'], ['club',6,'lebu'], ['club',6,'sha','thunder'], ['club',7,'nanman'], ['club',7,'sha','thunder'], ['club',8,'sha'], ['club',8,'sha','thunder'], ['club',9,'sha'], ['club',9,'jiu'], ['club',10,'sha'], ['club',10,'bingliang'], ['club',11,'sha'], ['club',11,'sha'], ['club',12,'jiedao'], ['club',12,'tiesuo'], ['club',13,'wuxie',null,['guo']], ['club',13,'tiesuo'], ['diamond',1,'zhuge'], ['diamond',1,'zhuque'], ['diamond',2,'shan'], ['diamond',2,'tao'], ['diamond',3,'shan'], ['diamond',3,'shunshou'], ['diamond',4,'yiyi'], ['diamond',4,'sha','fire'], ['diamond',5,'guanshi'], ['diamond',5,'sha','fire'], ['diamond',6,'shan'], ['diamond',6,'wuliu'], ['diamond',7,'shan'], ['diamond',7,'shan'], ['diamond',8,'shan'], ['diamond',8,'shan'], ['diamond',9,'shan'], ['diamond',9,'jiu'], ['diamond',10,'shan'], ['diamond',10,'sha'], ['diamond',11,'shan'], ['diamond',11,'sha'], ['diamond',12,'sha'], ['diamond',12,'sanjian'], ['diamond',12,'wuxie',null,['guo']], ['diamond',13,'shan'], ['diamond',13,'zixin'], ['heart',1,'taoyuan'], ['heart',1,'wanjian'], ['heart',2,'shan'], ['heart',2,'huogong'], ['heart',3,'wugu'], ['heart',3,'huogong'], ['heart',4,'tao'], ['heart',4,'sha','fire'], ['heart',5,'qilin'], ['heart',5,'chitu'], ['heart',6,'tao'], ['heart',6,'lebu'], ['heart',7,'tao'], ['heart',7,'wuzhong'], ['heart',8,'tao'], ['heart',8,'wuzhong'], ['heart',9,'tao'], ['heart',9,'yuanjiao'], ['heart',10,'tao'], ['heart',10,'sha'], ['heart',11,'shan'], ['heart',11,'yiyi'], ['heart',12,'tao'], ['heart',12,'sha'], ['heart',12,'guohe'], ['heart',13,'shan'], ['heart',13,'zhuahuang'], ], guozhanPile:[ ['spade',1,'juedou'], ['spade',1,'shandian'], ['spade',2,'feilongduofeng'], ['spade',2,'bagua'], ['spade',2,'hanbing'], ['spade',3,'guohe'], ['spade',3,'shunshou'], ['spade',4,'guohe'], ['spade',4,'shunshou'], ['spade',5,'sha'], ['spade',5,'jueying'], ['spade',6,'qinggang'], ['spade',6,'sha','thunder'], ['spade',7,'sha'], ['spade',7,'sha','thunder'], ['spade',8,'sha'], ['spade',8,'sha'], ['spade',9,'sha'], ['spade',9,'jiu'], ['spade',10,'sha'], ['spade',10,'bingliang'], ['spade',11,'sha'], ['spade',11,'wuxie'], ['spade',12,'zhangba'], ['spade',12,'tiesuo'], ['spade',13,'nanman'], ['spade',13,'dawan'], ['club',1,'juedou'], ['club',1,'baiyin'], ['club',2,'sha'], ['club',2,'tengjia'], ['club',2,'renwang'], ['club',3,'sha'], ['club',3,'zhibi'], ['club',4,'sha'], ['club',4,'zhibi'], ['club',5,'sha'], ['club',5,'dilu'], ['club',6,'lebu'], ['club',6,'sha','thunder'], ['club',7,'nanman'], ['club',7,'sha','thunder'], ['club',8,'sha'], ['club',8,'sha','thunder'], ['club',9,'sha'], ['club',9,'jiu'], ['club',10,'sha'], ['club',10,'bingliang'], ['club',11,'sha'], ['club',11,'sha'], ['club',12,'jiedao'], ['club',12,'tiesuo'], ['club',13,'wuxie',null,['guo']], ['club',13,'tiesuo'], ['diamond',1,'zhuge'], ['diamond',1,'zhuque'], ['diamond',2,'shan'], ['diamond',2,'tao'], ['diamond',3,'shan'], ['diamond',3,'shunshou'], ['diamond',4,'yiyi'], ['diamond',4,'sha','fire'], ['diamond',5,'guanshi'], ['diamond',5,'sha','fire'], ['diamond',6,'shan'], ['diamond',6,'wuliu'], ['diamond',7,'shan'], ['diamond',7,'shan'], ['diamond',8,'shan'], ['diamond',8,'shan'], ['diamond',9,'shan'], ['diamond',9,'jiu'], ['diamond',10,'shan'], ['diamond',10,'sha'], ['diamond',11,'shan'], ['diamond',11,'sha'], ['diamond',12,'sha'], ['diamond',12,'sanjian'], ['diamond',12,'wuxie',null,['guo']], ['diamond',13,'shan'], ['diamond',13,'zixin'], ['heart',1,'taoyuan'], ['heart',1,'wanjian'], ['heart',2,'shan'], ['heart',2,'huogong'], ['heart',3,'wugu'], ['heart',3,'taipingyaoshu'], ['heart',3,'huogong'], ['heart',4,'tao'], ['heart',4,'sha','fire'], ['heart',5,'qilin'], ['heart',5,'chitu'], ['heart',6,'tao'], ['heart',6,'lebu'], ['heart',7,'tao'], ['heart',7,'wuzhong'], ['heart',8,'tao'], ['heart',8,'wuzhong'], ['heart',9,'tao'], ['heart',9,'yuanjiao'], ['heart',10,'tao'], ['heart',10,'sha'], ['heart',11,'shan'], ['heart',11,'yiyi'], ['heart',12,'tao'], ['heart',12,'sha'], ['heart',12,'guohe'], ['heart',13,'shan'], ['heart',13,'zhuahuang'], ['spade',1,'xietianzi',null,['lianheng']], ['spade',2,'minguangkai'], ['spade',3,'huoshaolianying',null,['lianheng']], ['spade',4,'sha'], ['spade',5,'qinglong'], ['spade',6,'jiu',null,['lianheng']], ['spade',7,'sha'], ['spade',8,'sha'], ['spade',9,'sha','thunder'], ['spade',10,'sha','thunder'], ['spade',11,'sha','thunder',['lianheng']], ['spade',12,'lulitongxin'], ['spade',13,'wuxie'], ['heart',1,'lianjunshengyan'], ['heart',2,'diaohulishan'], ['heart',3,'jingfanma',null,['lianheng']], ['heart',4,'shan'], ['heart',5,'shan'], ['heart',6,'shan'], ['heart',7,'shan'], ['heart',8,'tao'], ['heart',9,'tao'], ['heart',10,'sha'], ['heart',11,'sha'], ['heart',12,'huoshaolianying',null,['lianheng']], ['heart',13,'shuiyanqijunx'], ['club',1,'yuxi'], ['club',2,'huxinjing',null,['lianheng']], ['club',3,'chiling'], ['club',4,'sha'], ['club',5,'sha','thunder',['lianheng']], ['club',6,'sha'], ['club',7,'sha'], ['club',8,'sha'], ['club',9,'jiu'], ['club',10,'lulitongxin'], ['club',11,'huoshaolianying',null,['lianheng']], ['club',12,'shuiyanqijunx'], ['club',13,'wuxie',null,['guo']], ['diamond',1,'xietianzi',null,['lianheng']], ['diamond',2,'tao'], ['diamond',3,'tao',null,['lianheng']], ['diamond',4,'xietianzi',null,['lianheng']], ['diamond',5,'muniu'], ['diamond',6,'shan'], ['diamond',7,'shan'], ['diamond',8,'sha','fire'], ['diamond',9,'sha','fire'], ['diamond',10,'diaohulishan',null,['lianheng']], ['diamond',11,'wuxie',null,['guo']], ['diamond',12,'fangtian'], ['diamond',13,'shan'], ['diamond',6,'dinglanyemingzhu'], ['heart',13,'liulongcanjia'], //['spade',12,'gz_haolingtianxia'], //['diamond',1,'gz_kefuzhongyuan'], //['heart',1,'gz_guguoanbang'], //['club',12,'gz_wenheluanwu'], ], element:{ content:{ hideCharacter:function(){ game.addVideo('hideCharacter',player,num); var skills,log=event.log; switch(num){ case 0: if(log!==false) game.log(player,'暗置了主将'+get.translation(player.name1)); skills=lib.character[player.name1][3]; player.name=player.name2; player.sex=lib.character[player.name2][0]; player.classList.add('unseen'); break; case 1: if(log!==false) game.log(player,'暗置了副将'+get.translation(player.name2)); skills=lib.character[player.name2][3]; player.classList.add('unseen2'); break; } game.broadcast(function(player,name,sex,num,skills){ player.name=name; player.sex=sex; switch(num){ case 0:player.classList.add('unseen');break; case 1:player.classList.add('unseen2');break; } for(var i=0;i选项'+get.cnNumber(i+1,true)+':'+event.choiceList[i]+''); controls.push('选项'+get.cnNumber(i+1,true)); } } else if(event.controls) controls=event.controls; else controls=['执行该军令','不执行该军令']; if(!event.ai) event.ai=function(){return Math.floor(controls.length*Math.random())}; player.chooseControl(controls).set('dialog',dialog).set('ai',event.ai); 'step 1' event.result={ index:result.index, control:result.control, }; }, carryOutJunling:function(){ 'step 0' switch(event.junling){ case 'junling1':{ if(targets[0].isAlive()){ player.line(targets,'green'); targets[0].damage(player); } break; } case 'junling2':player.draw();event.num=1;break; case 'junling3':player.loseHp();break; case 'junling4':player.addTempSkill('junling4_eff');player.addTempSkill('fengyin_vice');player.addTempSkill('fengyin_main');break; case 'junling5':player.turnOver();player.addTempSkill('junling5_eff');break; } 'step 1' if(event.junling=='junling2'&&source!=player&&player.countCards('he')>0){ player.chooseCard('交给'+get.translation(source)+'第'+get.cnNumber(event.num)+'张牌(共两张)','he',true); event.ing=true; } if(event.junling=='junling6'){ var position='',num0=0; if(player.countCards('h')){position+='h';num0++;} if(player.countCards('e')){position+='e';num0++;} player.chooseCard('选择一张手牌和一张装备区内牌(若有),然后弃置其余的牌',position,num0,function(card){ if(ui.selected.cards.length) return get.position(card)!=get.position(ui.selected.cards[0]); return true; },true).set('complexCard',true).set('ai',function(card){return get.value(card)}); } 'step 2' if(event.junling=='junling2'&&source!=player){ if(result.cards.length&&event.ing){ player.give(result.cards,source); } event.num++; if(event.num<3){ event.ing=false; event.goto(1); } } if(event.junling=='junling6'){ var cards=player.getCards('he'); for(var i=0;i0){ num--; if(typeof this.singleHp=='boolean'){ if(this.singleHp){ this.singleHp=false; } else{ this.singleHp=true; this.maxHp--; } } else{ this.maxHp--; } } this.update(); }, hideCharacter:function(num,log){ if(this.isUnseen(2)) return; var name=this['name'+(num+1)]; var next=game.createEvent('hideCharacter'); next.player=this; next.toHide=name; next.num=num; next.log=log; next.setContent('hideCharacter'); return next; }, removeCharacter:function(num){ var name=this['name'+(num+1)]; var next=game.createEvent('removeCharacter'); next.player=this; next.toRemove=name; next.num=num; next.setContent('removeCharacter'); return next; }, $removeCharacter:function(num){ var name=this['name'+(num+1)]; var info=lib.character[name]; if(!info) return; var to='gz_shibing'+(info[0]=='male'?1:2)+info[1]; game.log(this,'移除了'+(num?'副将':'主将'),'#b'+name); this.reinit(name,to,false); this.showCharacter(num,false); _status.characterlist.add(name); }, changeVice:function(hidden){ var next=game.createEvent('changeVice'); next.player=this; next.setContent('changeVice'); next.num=(!_status.connectMode&&get.config('changeViceType')=='online')?1:3; if(hidden) next.hidden=true; return next; }, hasMainCharacter:function(){ return this.name1.indexOf('gz_shibing')!=0; }, hasViceCharacter:function(){ return this.name2.indexOf('gz_shibing')!=0; }, $showCharacter:function(num,log){ var showYe=false; if(num==0&&!this.isUnseen(0)){ return; } if(num==1&&!this.isUnseen(1)){ return; } if(!this.isUnseen(2)){ return; } game.addVideo('showCharacter',this,num); if(this.identity=='unknown'||((num==0||num==2)&&lib.character[this.name1][1]=='ye')){ this.group=this.getGuozhanGroup(num); if((num==0||num==2)&&lib.character[this.name1][1]=='ye'){ this.identity='ye'; if(!this._ye){ this._ye=true; showYe=true; } } else if(get.is.jun(this.name1)&&this.isAlive()){ this.identity=this.group; } else if(this.wontYe(this.group)){ this.identity=this.group; } else{ this.identity='ye'; } this.setIdentity(this.identity); this.ai.shown=1; this.node.identity.classList.remove('guessing'); if(_status.clickingidentity&&_status.clickingidentity[0]==this){ for(var i=0;i<_status.clickingidentity[1].length;i++){ _status.clickingidentity[1][i].delete(); _status.clickingidentity[1][i].style.transform=''; } delete _status.clickingidentity; } game.addVideo('setIdentity',this,this.identity); } var skills; switch(num){ case 0: if(log!==false) game.log(this,'展示了主将','#b'+this.name1); this.name=this.name1; skills=lib.character[this.name][3]; this.sex=lib.character[this.name][0]; this.classList.remove('unseen'); break; case 1: if(log!==false) game.log(this,'展示了副将','#b'+this.name2); skills=lib.character[this.name2][3]; if(this.sex=='unknown') this.sex=lib.character[this.name2][0]; if(this.name.indexOf('unknown')==0) this.name=this.name2; this.classList.remove('unseen2'); break; case 2: if(log!==false) game.log(this,'展示了主将','#b'+this.name1,'、副将','#b'+this.name2); this.name=this.name1; skills=lib.character[this.name][3].concat(lib.character[this.name2][3]); this.sex=lib.character[this.name][0]; this.classList.remove('unseen'); this.classList.remove('unseen2'); break; } game.broadcast(function(player,name,sex,num,identity,group){ player.identityShown=true; player.group=group; player.name=name; player.sex=sex; player.node.identity.classList.remove('guessing'); switch(num){ case 0:player.classList.remove('unseen');break; case 1:player.classList.remove('unseen2');break; case 2:player.classList.remove('unseen');player.classList.remove('unseen2');break; } player.ai.shown=1; player.identity=identity; player.setIdentity(identity); if(_status.clickingidentity&&_status.clickingidentity[0]==player){ for(var i=0;i<_status.clickingidentity[1].length;i++){ _status.clickingidentity[1][i].delete(); _status.clickingidentity[1][i].style.transform=''; } delete _status.clickingidentity; } },this,this.name,this.sex,num,this.identity,this.group); this.identityShown=true; for(var i=0;imap[player].length) return false; } return true; }, isNotMajor:function(){ for(var i=0;i0){ for(var i=0;i0){ if(effect<1) c=0.5; else c=1; if(targets.length==1&&targets[0]==this); else if(targets.length==1) this.ai.shown+=0.2*c; else this.ai.shown+=0.1*c; } } if(this.ai.shown>0.95) this.ai.shown=0.95; if(this.ai.shown<-0.5) this.ai.shown=-0.5; }, } }, get:{ guozhanReverse:function(name1,name2){ if(get.is.double(name2)) return false; if(['gz_xunyou','gz_lvfan','gz_liubei'].includes(name2)) return true; if(name1=='gz_re_xushu') return true; if(name2=='gz_dengai') return lib.character[name1][2]%2==1; if(['gz_sunce','gz_jiangwei'].includes(name1)) return name2=='gz_zhoutai'||lib.character[name2][2]%2==1; return false; }, guozhanRank:function(name,player){ if(name.indexOf('gz_shibing')==0) return -1; if(name.indexOf('gz_jun_')==0) return 7; if(player){ var skills=lib.character[name][3].slice(0); for(var i=0;i0})) eff1=2; else{ if(get.damageEffect(targets[0],performer,source)>=0) eff1=2; else eff1=-2; if(get.damageEffect(targets[0],source,performer)>=0) eff2=2; else eff2=-2; } break; case 'junling2': if(performer.countCards('he')){eff1=1;eff2=0;} else{eff1=2;eff2=-1;} break; case 'junling3': if(performer.hp==1&&!performer.hasSkillTag('save',true)) eff2=-5; else{ if(performer==viewer){ if(performer.hasSkillTag('maihp',true)) eff2=3; else eff2=-2; } else{ if(performer.hasSkillTag('maihp',false)) eff2=3; else eff2=-2; } } break; case 'junling4':eff1=0;eff2=-2;break; case 'junling5': var td=performer.isTurnedOver(); if(td){ if(performer==viewer){ if(_status.currentPhase==performer&&performer.hasSkill('jushou')) eff2=-3; else eff2=3; } else eff2=3; } else{ if(performer==viewer){ if(performer.hasSkillTag('noturn',true)) eff2=0; else eff2=-3; } else{ if(performer.hasSkillTag('noturn',false)) eff2=0; else eff2=-3; } } break; case 'junling6': if(performer.countCards('h')>1) eff2+=1-performer.countCards('h'); if(performer.countCards('e')>1) eff2+=1-performer.countCards('e'); break; } return Math.sign(att1)*eff1+Math.sign(att2)*eff2; }, realAttitude:function(from,to,difficulty,toidentity){ var getIdentity=function(player){ if(player.isUnseen()){ if(!player.wontYe()) return 'ye'; return player.getGuozhanGroup(0); } return player.identity; }; var fid=getIdentity(from); if(fid==toidentity&&toidentity!='ye'){ return 4+difficulty; } if(from.identity=='unknown'&&fid==toidentity){ if(from.wontYe()) return 4+difficulty; } var groups=[]; var map={},sides=[],pmap=_status.connectMode?lib.playerOL:game.playerMap,player; for(var i of game.players){ if(i.identity=='unknown') continue; var added=false; for(var j of sides){ if(i.isFriendOf(pmap[j])){ added=true; map[j].push(i); if(i==this) player=j; break; } } if(!added){ map[i.playerid]=[i]; sides.push(i.playerid); if(i==this) player=i.playerid; } } for(var i in map){ var num=map[i].length; groups.push(num); } var max=Math.max.apply(this,groups); if(max<=1) return -3; var from_p; if(from.identity=='unknown'&&from.wontYe()) from_p=get.population(fid); else from_p=game.countPlayer(function(current){ return current.isFriendOf(from); }); var to_p=game.countPlayer(function(current){ return current.isFriendOf(to); }); if(to.identity=='ye') to_p+=1.5; if(to_p>=max) return -5; if(from_p>=max) return -2-to_p; if(max>=game.players.length/2){ if(to_p<=from_p){ return 0.5; } return 0; } if(to_p=0.5) return att*to.ai.shown; var nshown=0; for(var i=0;i=game.players.length/2&&att>=0){ return 0; } return Math.min(0,Math.random()-0.5)+difficulty; } if(to.ai.shown>=0.2){ if(att>2){ return Math.max(0,Math.random()-0.5)+difficulty; } if(att>=0){ return 0; } return Math.min(0,Math.random()-0.7)+difficulty; } if(att>2){ return Math.max(0,Math.random()-0.7)+difficulty; } if(att>=0){ return Math.min(0,Math.random()-0.3)+difficulty; } return Math.min(0,Math.random()-0.5)+difficulty; }, }, help:{ '国战模式': '
      声明
      • 以下所有规则均为根据公开爆料整理,经村规改动后制定的临时规则。不代表任何官方意见。请以后续发布的官方规则作为标准。
      ' +'
      双势力武将
      • 双势力武将牌可以和野心家武将牌/包含势力单武将牌/含有重叠势力的其他双势力武将牌组合,若你的主将为双势力武将,则:若你的副将为单势力武将牌,你的势力视为此势力;若你的副将为双势力武将,你的势力视为两张武将牌上的重叠势力(若重叠势力不止一个则需在游戏开始时选择一个作为自己的势力);野心家武将牌为主将,双势力武将牌为副将时,游戏开始时需选择一个副将所含势力作为副将的势力。
      • 变更副将时,可以选择包含原势力的双势力武将牌。左慈发动〖役鬼〗时,可以使用双势力武将牌同时指定两个不同势力的角色为目标。
      • 特殊地,“冈崎汐”作为多势力武将牌,结算流程和规则与其他双势力武将相同。
      ' +'
      野心家武将
      • 野心家武将只能放在主将位置。副将可以为任意非野心家武将牌。
      • 选择了野心家武将牌的角色(以下简称“野心家角色”)仅明置副将时,若副将为单势力武将牌,则势力暂时视为与该武将牌相同。若副将为双势力武将牌,则势力视为游戏开始时选择的副将代表的势力。
      • 野心家角色明置主将时,其势力改为野心家。若其是首次明置该武将牌,则其获得一个“野心家”标记。
      • “野心家”标记可以当做“先驱”标记,“阴阳鱼”标记或是“珠联璧合”标记使用。当同时拥有两种标记时,优先弃置原装标记,下次发动时才弃置“野心家”标记。
      • 野心家角色变更副将时,若其主将未明置过,则按照副将的势力进行变更。若主将已经明置过,则可以选择所有的非野心家武将牌。左慈发动〖役鬼〗时,可以使用野心家武将牌同时指定所有势力的角色为目标。' +'
      • 当场上触发了胜利条件时,若这些角色中存在未明置过主将的野心家角色,则这些野心家角色选择是否“暴露野心”。若无人选择“是”且场上存在非野心家角色存活,则所有非野心家角色胜利,野心家角色失败。若有人选择“是”,则这些角色明置主将,然后选择是否发起“拉拢人心”。
      • 选择发起“拉拢人心”的野心家角色选择一个新的势力作为自己的势力,弃置“野心家”标记,令所有其他非野心家角色且非君主且非已“结盟”角色依次选择是否和该野心家角色“结盟”。选择“是”的角色将势力改为和该野心家势力相同。此次“拉拢人心”对所有其他角色询问结束后,所有选择“否”的角色将手牌摸至四张并回复1点体力。
      ' +'
      纵横捭阖
      • 当一名角色对目标角色发动具有拥有“纵横”衍生技的技能时,其可以令对方获得“纵横”衍生技直到其下回合结束。
      ', }, }; });