diff --git a/audio/die/clan_wangyun.mp3 b/audio/die/clan_wangyun.mp3 new file mode 100644 index 000000000..1972828e1 Binary files /dev/null and b/audio/die/clan_wangyun.mp3 differ diff --git a/audio/die/dc_duyu.mp3 b/audio/die/dc_duyu.mp3 new file mode 100644 index 000000000..7fff13162 Binary files /dev/null and b/audio/die/dc_duyu.mp3 differ diff --git a/audio/die/dc_huanghao.mp3 b/audio/die/dc_huanghao.mp3 new file mode 100644 index 000000000..e44d2cd2d Binary files /dev/null and b/audio/die/dc_huanghao.mp3 differ diff --git a/audio/die/dc_wangjun.mp3 b/audio/die/dc_wangjun.mp3 new file mode 100644 index 000000000..cc34e23ee Binary files /dev/null and b/audio/die/dc_wangjun.mp3 differ diff --git a/audio/die/haopu.mp3 b/audio/die/haopu.mp3 new file mode 100644 index 000000000..6a5e78d94 Binary files /dev/null and b/audio/die/haopu.mp3 differ diff --git a/audio/die/sunlingluan.mp3 b/audio/die/sunlingluan.mp3 new file mode 100644 index 000000000..482dacbf8 Binary files /dev/null and b/audio/die/sunlingluan.mp3 differ diff --git a/audio/die/yuechen.mp3 b/audio/die/yuechen.mp3 new file mode 100644 index 000000000..8fcb39d6b Binary files /dev/null and b/audio/die/yuechen.mp3 differ diff --git a/audio/die/zhoubuyi.mp3 b/audio/die/zhoubuyi.mp3 new file mode 100644 index 000000000..6014f39e9 Binary files /dev/null and b/audio/die/zhoubuyi.mp3 differ diff --git a/audio/skill/clanjiexuan1.mp3 b/audio/skill/clanjiexuan1.mp3 new file mode 100644 index 000000000..be4b660cb Binary files /dev/null and b/audio/skill/clanjiexuan1.mp3 differ diff --git a/audio/skill/clanjiexuan2.mp3 b/audio/skill/clanjiexuan2.mp3 new file mode 100644 index 000000000..5f4da7430 Binary files /dev/null and b/audio/skill/clanjiexuan2.mp3 differ diff --git a/audio/skill/clanmingjie1.mp3 b/audio/skill/clanmingjie1.mp3 new file mode 100644 index 000000000..7af974f44 Binary files /dev/null and b/audio/skill/clanmingjie1.mp3 differ diff --git a/audio/skill/clanmingjie2.mp3 b/audio/skill/clanmingjie2.mp3 new file mode 100644 index 000000000..11d3317d5 Binary files /dev/null and b/audio/skill/clanmingjie2.mp3 differ diff --git a/audio/skill/clanzhongliu_clan_wangyun1.mp3 b/audio/skill/clanzhongliu_clan_wangyun1.mp3 new file mode 100644 index 000000000..2911411f5 Binary files /dev/null and b/audio/skill/clanzhongliu_clan_wangyun1.mp3 differ diff --git a/audio/skill/clanzhongliu_clan_wangyun2.mp3 b/audio/skill/clanzhongliu_clan_wangyun2.mp3 new file mode 100644 index 000000000..ac19d7223 Binary files /dev/null and b/audio/skill/clanzhongliu_clan_wangyun2.mp3 differ diff --git a/audio/skill/dcchangqu1.mp3 b/audio/skill/dcchangqu1.mp3 new file mode 100644 index 000000000..d71e6dff2 Binary files /dev/null and b/audio/skill/dcchangqu1.mp3 differ diff --git a/audio/skill/dcchangqu2.mp3 b/audio/skill/dcchangqu2.mp3 new file mode 100644 index 000000000..722ae7d95 Binary files /dev/null and b/audio/skill/dcchangqu2.mp3 differ diff --git a/audio/skill/dccunwei1.mp3 b/audio/skill/dccunwei1.mp3 new file mode 100644 index 000000000..a6a05a155 Binary files /dev/null and b/audio/skill/dccunwei1.mp3 differ diff --git a/audio/skill/dccunwei2.mp3 b/audio/skill/dccunwei2.mp3 new file mode 100644 index 000000000..ce5f786f2 Binary files /dev/null and b/audio/skill/dccunwei2.mp3 differ diff --git a/audio/skill/dcdyqingshi1.mp3 b/audio/skill/dcdyqingshi1.mp3 new file mode 100644 index 000000000..81820817c Binary files /dev/null and b/audio/skill/dcdyqingshi1.mp3 differ diff --git a/audio/skill/dcdyqingshi2.mp3 b/audio/skill/dcdyqingshi2.mp3 new file mode 100644 index 000000000..00d0125e4 Binary files /dev/null and b/audio/skill/dcdyqingshi2.mp3 differ diff --git a/audio/skill/dcgonghu1.mp3 b/audio/skill/dcgonghu1.mp3 new file mode 100644 index 000000000..2fb837625 Binary files /dev/null and b/audio/skill/dcgonghu1.mp3 differ diff --git a/audio/skill/dcgonghu2.mp3 b/audio/skill/dcgonghu2.mp3 new file mode 100644 index 000000000..27d4c8828 Binary files /dev/null and b/audio/skill/dcgonghu2.mp3 differ diff --git a/audio/skill/dcjianguo1.mp3 b/audio/skill/dcjianguo1.mp3 new file mode 100644 index 000000000..0be7becde Binary files /dev/null and b/audio/skill/dcjianguo1.mp3 differ diff --git a/audio/skill/dcjianguo2.mp3 b/audio/skill/dcjianguo2.mp3 new file mode 100644 index 000000000..98423cb19 Binary files /dev/null and b/audio/skill/dcjianguo2.mp3 differ diff --git a/audio/skill/dclingyue1.mp3 b/audio/skill/dclingyue1.mp3 new file mode 100644 index 000000000..71ee24e0d Binary files /dev/null and b/audio/skill/dclingyue1.mp3 differ diff --git a/audio/skill/dclingyue2.mp3 b/audio/skill/dclingyue2.mp3 new file mode 100644 index 000000000..cb2c2c348 Binary files /dev/null and b/audio/skill/dclingyue2.mp3 differ diff --git a/audio/skill/dcpandi1.mp3 b/audio/skill/dcpandi1.mp3 new file mode 100644 index 000000000..2c8db76a7 Binary files /dev/null and b/audio/skill/dcpandi1.mp3 differ diff --git a/audio/skill/dcpandi2.mp3 b/audio/skill/dcpandi2.mp3 new file mode 100644 index 000000000..5b48b655c Binary files /dev/null and b/audio/skill/dcpandi2.mp3 differ diff --git a/audio/skill/dcporui1.mp3 b/audio/skill/dcporui1.mp3 new file mode 100644 index 000000000..1c2010a85 Binary files /dev/null and b/audio/skill/dcporui1.mp3 differ diff --git a/audio/skill/dcporui2.mp3 b/audio/skill/dcporui2.mp3 new file mode 100644 index 000000000..a12a08890 Binary files /dev/null and b/audio/skill/dcporui2.mp3 differ diff --git a/audio/skill/dcqinqing1.mp3 b/audio/skill/dcqinqing1.mp3 new file mode 100644 index 000000000..69b07e13c Binary files /dev/null and b/audio/skill/dcqinqing1.mp3 differ diff --git a/audio/skill/dcqinqing2.mp3 b/audio/skill/dcqinqing2.mp3 new file mode 100644 index 000000000..cc9f0179e Binary files /dev/null and b/audio/skill/dcqinqing2.mp3 differ diff --git a/audio/skill/dcshiji1.mp3 b/audio/skill/dcshiji1.mp3 new file mode 100644 index 000000000..036f4926f Binary files /dev/null and b/audio/skill/dcshiji1.mp3 differ diff --git a/audio/skill/dcshiji2.mp3 b/audio/skill/dcshiji2.mp3 new file mode 100644 index 000000000..2562858b1 Binary files /dev/null and b/audio/skill/dcshiji2.mp3 differ diff --git a/audio/skill/dcsilun1.mp3 b/audio/skill/dcsilun1.mp3 new file mode 100644 index 000000000..e49281613 Binary files /dev/null and b/audio/skill/dcsilun1.mp3 differ diff --git a/audio/skill/dcsilun2.mp3 b/audio/skill/dcsilun2.mp3 new file mode 100644 index 000000000..818dcd92d Binary files /dev/null and b/audio/skill/dcsilun2.mp3 differ diff --git a/audio/skill/dctongye1.mp3 b/audio/skill/dctongye1.mp3 new file mode 100644 index 000000000..f950ddf48 Binary files /dev/null and b/audio/skill/dctongye1.mp3 differ diff --git a/audio/skill/dctongye2.mp3 b/audio/skill/dctongye2.mp3 new file mode 100644 index 000000000..f2747c93e Binary files /dev/null and b/audio/skill/dctongye2.mp3 differ diff --git a/audio/skill/huisheng_dc_huanghao1.mp3 b/audio/skill/huisheng_dc_huanghao1.mp3 new file mode 100644 index 000000000..ec3a440fe Binary files /dev/null and b/audio/skill/huisheng_dc_huanghao1.mp3 differ diff --git a/audio/skill/huisheng_dc_huanghao2.mp3 b/audio/skill/huisheng_dc_huanghao2.mp3 new file mode 100644 index 000000000..f161337fe Binary files /dev/null and b/audio/skill/huisheng_dc_huanghao2.mp3 differ diff --git a/audio/skill/olzhenying1.mp3 b/audio/skill/olzhenying1.mp3 new file mode 100644 index 000000000..463954aa1 Binary files /dev/null and b/audio/skill/olzhenying1.mp3 differ diff --git a/audio/skill/olzhenying2.mp3 b/audio/skill/olzhenying2.mp3 new file mode 100644 index 000000000..1b17adb50 Binary files /dev/null and b/audio/skill/olzhenying2.mp3 differ diff --git a/card/yongjian.js b/card/yongjian.js index 993c0e56f..f42767f49 100644 --- a/card/yongjian.js +++ b/card/yongjian.js @@ -60,7 +60,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){ else player.choosePlayerCard(target,'h',true); 'step 1' if(result.bool){ - event.show_card=result.cards[0],str=get.translation(player); + event.show_card=result.cards[0]; + var str=get.translation(player); player.showCards(event.show_card); target.chooseControl().set('choiceList',[ '令'+str+'获得'+get.translation(event.show_card), @@ -699,11 +700,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ duanjian_append:'不要因为手快而装给自己。', serafuku:'水手服', serafuku_info:'锁定技。当你成为【杀】的目标后,若你的性别包含男性,则你进行判定:若结果为黑色,则此牌对你的伤害值基数+1。', - serafuku_append:'セーラー服だからです、
结论!
', + serafuku_append:'セーラー服だからです、
結論!
', yinfengyi:'引蜂衣', yinfengyi_info:'锁定技。当你受到渠道为锦囊牌的伤害时,此伤害+1。当你因〖毒①〗而失去体力时,失去体力的量值+1。', yonglv:'庸驴', - yonglv_info:'锁定技。其他角色至你的距离视为1。', + yonglv_info:'锁定技。①你至其他角色的距离-1。②其他角色至你的距离视为1。', yonglv_append:'它旁边的就是王仲宣。', zhanxiang:'战象', zhanxiang_info:'锁定技。①其他角色至你的距离+1。②当你成为〖赠予〗的目标后,你将此次赠予的效果改为“将赠予牌移动至弃牌堆”。', diff --git a/character/clan.js b/character/clan.js index 001543789..27ef90ec8 100644 --- a/character/clan.js +++ b/character/clan.js @@ -779,7 +779,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var num=player.countCards('h'); var str='是否交给其'+get.cnNumber(num)+'张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。'; - target.chooseCard(get.translation(player)+'对你发动了【驳龙】',str,num,'he').set('ai',card=>{ + if(!num||target.countCards('he'){ if(_status.event.canGive) return 5+Math.max(0,3-_status.event.player.hp)/1.5-get.value(card); return 0; }).set('canGive',function(){ @@ -840,7 +841,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cards.addArray(evt.getl(current).hs); }); }) - return event.cards.some(card=>!cards.contains(card)); + if(event.cards.some(card=>!cards.contains(card))) return false; + return true; }, content:function(){ 'step 0' @@ -1445,9 +1447,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=result.targets[0],num=lib.skill.clansankuang.getNum(target),num2=target.countCards('he'); event.target=target; player.logSkill('clansankuang',target); - if(num==0||num2==0) event._result={bool:false}; + if(num2==0) event._result={bool:false}; else if(num2<=num) event._result={bool:true,cards:target.getCards('he')}; - else target.chooseCard('he',true,[num,Infinity]).set('ai',get.unuseful).set('prompt','交给'+get.translation(player)+'至少'+get.cnNumber(num)+'张牌'); + else{ + var cards=trigger.cards.filterInD('oe'); + target.chooseCard('he',num>0,[num,Infinity]).set('ai',get.unuseful).set('prompt',num>0? + '是否交给'+get.translation(player)+'任意张牌'+(cards.length?'并获得'+get.translation(cards):'')+'?': + '交给'+get.translation(player)+'至少'+get.cnNumber(num)+'张牌'); + } }else event.finish(); 'step 2' if(result.bool){ @@ -1455,6 +1462,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.give(cards,player); game.delayx(); } + else event.finish(); 'step 3' if(trigger.cards.filterInD().length) target.gain(trigger.cards.filterInD(),'gain2','bySelf'); else if(trigger.cards.filterInD('e').length) target.gain(trigger.cards.filterInD('e'),get.owner(trigger.cards.filterInD('e')[0]),'give'); @@ -2323,14 +2331,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clanbolong:'驳龙', clanbolong_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.你交给其一张牌,然后视为对其使用一张雷【杀】;2.交给你等同于你手牌数的牌,然后视为对你使用一张【酒】。', clanzhongliu:'中流', - clanzhongliu_info:'宗族技,锁定技。当你使用牌时,若此牌对应的实体牌不全为同族角色的手牌,你重置武将牌上的技能。', + clanzhongliu_info:'宗族技,锁定技。当你使用牌时,若此牌对应的实体牌均不为太原王氏角色的手牌,你重置武将牌上的技能。', clan_zhongyan:'族钟琰', clanguangu:'观骨', clanguangu_info:'转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。', clanxiaoyong:'啸咏', clanxiaoyong_info:'锁定技。当你于回合内首次使用字数为X的牌时,你重置〖观骨〗(X为你上次发动〖观骨〗观看的牌数)。', clanbaozu:'保族', - clanbaozu_info:'宗族技,限定技。当一名同族角色进入濒死状态时,你可以令其横置并回复1点体力。', + clanbaozu_info:'宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。', clan_wangyun:'族王允', clanjiexuan:'解悬', clanjiexuan_info:'限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。', diff --git a/character/collab.js b/character/collab.js index 22921c374..5de2d131d 100644 --- a/character/collab.js +++ b/character/collab.js @@ -4,6 +4,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'collab', connect:true, character:{ + dc_caocao:['male','wei',4,['dcjianxiong']], + dc_liubei:['male','shu',4,['dcrende']], + dc_sunquan:['male','wu',4,['dczhiheng']], zhutiexiong:['male','qun',3,['dcbianzhuang']], wu_zhutiexiong:['male','qun',3,['dcbianzhuang'],['unseen']], xiaoyuehankehan:['male','qun',3,['dctongliao','dcwudao']], @@ -30,9 +33,227 @@ game.import('character',function(lib,game,ui,get,ai,_status){ collab_tongque:["sp_fuwan","sp_fuhuanghou","sp_jiben","old_lingju",'sp_mushun'], collab_duanwu:['sunwukong','longwang','taoshen'], collab_decade:['libai','xiaoyuehankehan','zhutiexiong','wu_zhutiexiong'], + collab_remake:['dc_caocao','dc_liubei','dc_sunquan'], }, }, skill:{ + //隅泣曹操 + dcjianxiong:{ + audio:'rejianxiong', + trigger:{ + player:'damageEnd', + }, + content:function (){ + 'step 0' + if(get.itemtype(trigger.cards)=='cards'&&get.position(trigger.cards[0],true)=='o'){ + player.gain(trigger.cards,'gain2'); + } + player.draw(player.countMark('dcjianxiong')+1,'nodelay'); + 'step 1' + if(player.countMark('dcjianxiong')<4) player.addMark('dcjianxiong',1,false); + }, + marktext:'雄', + intro:{ + markcount:function(storage,player){ + return player.countMark('dcjianxiong')+1; + }, + content:function(storage,player){ + return '摸牌数为'+(player.countMark('dcjianxiong')+1); + }, + }, + ai:{ + maixie:true, + maixie_hp:true, + effect:{ + target:function (card,player,target){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; + if(get.tag(card,'damage')&&player!=target){ + var cards=card.cards,evt=_status.event; + if(evt.player==target&&card.name=='damage'&&evt.getParent().type=='card') cards=evt.getParent().cards.filterInD(); + if(target.hp<=1) return; + if(get.itemtype(cards)!='cards') return; + for(var i of cards){ + if(get.name(i,target)=='tao') return [1,5+player.countMark('dcjianxiong')/2]; + } + if(get.value(cards,target)>=(7-player.countMark('dcjianxiong')/2+target.getDamagedHp())) return [1,3+player.countMark('dcjianxiong')/2]; + return [1,0.6+player.countMark('dcjianxiong')/2]; + } + }, + }, + }, + }, + //缺德刘备 + dcrende:{ + audio:'rerende', + enable:'phaseUse', + filter:function(event,player){ + return game.hasPlayer(current=>{ + return lib.skill.dcrende.filterTarget(null,player,current); + }); + }, + discard:false, + lose:false, + delay:false, + filterTarget:function(card,player,target){ + if(player.getStorage('dcrende_targeted').contains(target)) return false; + return player!=target&&target.countGainableCards(player,'h')>1; + }, + content:function(){ + 'step 0' + player.addTempSkill('dcrende_targeted','phaseUseAfter'); + player.markAuto('dcrende_targeted',[target]); + player.gainPlayerCard(target,'h',true,2); + 'step 1' + var list=[]; + for(var name of lib.inpile){ + if(get.type(name)!='basic') continue; + var card={name:name,isCard:true}; + if(lib.filter.cardUsable(card,player,event.getParent('chooseToUse'))&&game.hasPlayer(current=>{ + return player.canUse(card,current); + })){ + list.push(['基本','',name]); + } + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + card.nature=nature; + if(lib.filter.cardUsable(card,player,event.getParent('chooseToUse'))&&game.hasPlayer(current=>{ + return player.canUse(card,current); + })){ + list.push(['基本','',name,nature]); + } + } + } + } + if(list.length){ + player.chooseButton(['是否视为使用一张基本牌?',[list,'vcard']]).set('ai',function(button){ + var player=_status.event.player; + var card={name:button.link[2],nature:button.link[3],isCard:true}; + if(card.name=='tao'){ + if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()){ + return 5; + } + return 1; + } + if(card.name=='sha'){ + if(game.hasPlayer(function(current){ + return player.canUse(card,current)&&get.effect(current,card,player,player)>0 + })){ + if(card.nature=='fire') return 2.95; + if(card.nature=='thunder'||card.nature=='ice') return 2.92; + return 2.9; + } + return 0; + } + if(card.name=='jiu'){ + return 0.5; + } + return 0; + }); + } + else{ + event.finish(); + } + 'step 2' + if(result&&result.bool&&result.links[0]){ + var card={name:result.links[0][2],nature:result.links[0][3],isCard:true}; + player.chooseUseTarget(card,true); + } + }, + subSkill:{ + targeted:{ + onremove:true, + charlotte:true, + }, + }, + ai:{ + fireAttack:true, + order:function(skill,player){ + return 10; + }, + result:{ + target:function(player,target){ + if(target.hasSkillTag('noh')) return -0.1; + return -2; + } + }, + threaten:3, + }, + }, + //会玩孙权 + dczhiheng:{ + audio:'rezhiheng', + enable:'phaseUse', + position:'he', + filterCard:lib.filter.cardDiscardable, + discard:false, + lose:false, + delay:false, + selectCard:[1,Infinity], + filter:function(event,player){ + var skill=player.getStat().skill; + return !skill.dczhiheng||skill.dczhiheng<1+player.getStorage('dczhiheng_hit').length; + }, + check:function(card){ + var player=_status.event.player; + if(get.position(card)=='h'&&!player.countCards('h','du')&&(player.hp>2||!player.countCards('h',function(card){ + return get.value(card)>=8; + }))){ + return 1; + } + return 6-get.value(card) + }, + group:'dczhiheng_add', + content:function(){ + 'step 0' + player.discard(cards); + event.num=1; + var hs=player.getCards('h'); + if(!hs.length) event.num=0; + for(var i=0;i{ + position:'he', + list:game.filterPlayer(current=>{ if(current==player||current==trigger.player) return false; return current.hasHistory('lose',function(evt){ return evt.cards.length>0; }); }), filterTarget:function(card,player,target){ - return _status.event.targets.contains(target); + return _status.event.list.map(i=>i[0]).contains(target); }, ai1:function(card){ return 7-get.value(card); }, ai2:function(target){ - return get.effect(target,{name:'sha'},_status.event.player,_status.event.player); + return get.effect(target,{name:'sha'},_status.event.player,_status.event.player)*_status.event.list.find(i=>{ + return i[0]==target; + })[1]; } }); 'step 1' @@ -700,7 +700,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ expose:0.4, - threaten:4.8 + threaten:3.8, } }, dcgonghu:{ @@ -721,6 +721,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return num>1; } if(player.hasMark('dcgonghu_basic')) return false; + if(_status.currentPhase&&_status.currentPhase==player) return false; var evt=event.getl(player); if(!evt||!evt.cards2||!evt.cards2.some(i=>get.type2(i,player)=='basic')) return false; var num=0; @@ -3259,7 +3260,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(bool1) val+=5; if(bool2){ if(bool1) target.maxHp++; - val+=get.recoverEffect(target,player,player); + val+=Math.max(0,get.recoverEffect(target,player,player)); if(bool1) target.maxHp--; } if(bool3){ @@ -3471,7 +3472,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{ source:'damageBegin1', }, - usable:2, + //usable:2, filter:function(event,player){ return player.countDiscardableCards(player,'he')>0&&player!=event.player; }, @@ -9825,9 +9826,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ perfectPair:{}, characterReplace:{ dongbai:['re_dongbai','dongbai','jsrg_dongbai'], - chunyuqiong:['chunyuqiong','re_chunyuqiong'], + chunyuqiong:['chunyuqiong','re_chunyuqiong','jsrg_chunyuqiong'], kanze:['re_kanze','kanze'], - chendeng:['ol_chendeng','re_chendeng','chendeng'], + chendeng:['ol_chendeng','re_chendeng','chendeng','jsrg_chendeng'], miheng:['miheng','re_miheng'], liuba:['ol_liuba','dc_liuba','liuba'], lvkuanglvxiang:['lvkuanglvxiang','dc_lvkuanglvxiang'], @@ -10102,7 +10103,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dccuijin_info:'当你或你攻击范围内的角色使用【杀】时,你可以弃置一张牌,令此【杀】的伤害基数+1。然后当此杀被目标角色抵消或无效或防止伤害后,你摸一张牌,对使用者造成1点伤害。', panghui:'庞会', dcyiyong:'异勇', - dcyiyong_info:'每回合限两次。当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。', + dcyiyong_info:'当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。', chenjiao:'陈矫', dcxieshoux:'协守/清严', dcxieshou:'协守', @@ -10124,7 +10125,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liupi:'刘辟', dcjuying:'踞营', dcjuying_info:'出牌阶段结束时,若你于此阶段内使用【杀】的次数未达到上限,你可以选择任意项:1.下回合使用【杀】的次数上限+1;2.本回合手牌上限+2;3.摸三张牌。若你选择的项数超过了你的体力值,你弃置X张牌(X为你选择的项数减你的体力值)。', - dc_huanghao:'黄皓', + dc_huanghao:'新杀黄皓', + dc_huanghao_ab:'黄皓', dcqinqing:'寝情', dcqinqing_info:'结束阶段,你可以弃置一名攻击范围内包含一号位的其他角色一张牌。然后若其手牌数大于一号位,你摸一张牌。', dccunwei:'存畏', @@ -10163,7 +10165,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuantanyuanxiyuanshang:'袁谭袁尚袁熙', dcneifa:'内伐', dcneifa_info:'出牌阶段开始时,你可以摸三张牌,然后弃置一张牌。若你弃置的牌类型为:基本牌,本阶段你不能使用锦囊牌,且【杀】的使用次数上限+X且可以额外指定一名目标;锦囊牌,本阶段你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5。你以此法选择的额外目标均无距离限制)。', - dc_sunziliufang:'孙资刘放', + dc_sunziliufang:'新杀孙资刘放', dcqinshen:'勤慎', dcqinshen_info:'弃牌阶段结束时,你可以摸X张牌(X为本回合未进入过弃牌堆的花色数)。', dcweidang:'伪谠', @@ -10194,7 +10196,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcqinghuang_info:'出牌阶段开始时,你可以减1点体力上限,然后你于本回合发动〖踏寂〗时额外随机执行一种效果。', dc_huojun:'霍峻', dcgue:'孤扼', - dcgue_info:'每名其他角色的回合限一次。当你需要使用或打出【杀】或【闪】时,若你有手牌,你可以展示之。若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。', + dcgue_info:'每回合限一次。当你需要使用或打出【杀】或【闪】时,若你有手牌,你可以展示之。若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。', dcsigong:'伺攻', dcsigong_info:'其他角色的回合结束时,若其于本回合内使用牌被响应过,你可以将手牌摸至或弃置至1,视为对其使用一张需使用X张【闪】抵消的【杀】,且此【杀】的伤害基数+1(X为你以此法弃置的牌数且至少为1)。当你以此法造成伤害后,该技能于本轮失效。', peiyuanshao:'裴元绍', @@ -10240,7 +10242,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcporui:'破锐', dcporui_info:'每轮限一次。其他角色的结束阶段,你可以弃置一张基本牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为其本回合失去的牌数且至多为5)。', dcgonghu:'共护', - dcgonghu_info:'锁定技。你的回合外:①当你失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你造成或受到伤害后,若你本回合内造成或受到的伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。', + dcgonghu_info:'锁定技。①当你于回合外失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你于回合外造成或受到伤害后,若你本回合内造成或受到的伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。', yue_caiwenji:'乐蔡琰', dcshuangjia:'霜笳', dcshuangjia_tag:'胡笳', diff --git a/character/jsrg.js b/character/jsrg.js new file mode 100644 index 000000000..03b69f47a --- /dev/null +++ b/character/jsrg.js @@ -0,0 +1,4276 @@ +'use strict'; +game.import('character',function(lib,game,ui,get,ai,_status){ + return { + name:'jsrg', + connect:true, + characterSort:{ + jsrg:{ + jiangshanrugu_qi:['jsrg_liuhong','jsrg_hejin','jsrg_sunjian','jsrg_huangfusong','jsrg_xushao','jsrg_dongbai','jsrg_qiaoxuan','jsrg_yangbiao','jsrg_kongrong','jsrg_zhujun','jsrg_liubei','jsrg_wangyun','jsrg_liuyan','jsrg_caocao','jsrg_nanhualaoxian'], + jiangshanrugu_cheng:['jsrg_sunce','jsrg_xuyou','jsrg_lvbu','jsrg_zhanghe','jsrg_zoushi','jsrg_guanyu','jsrg_chendeng','jsrg_zhenji','jsrg_zhangliao','jsrg_xugong','jsrg_chunyuqiong'], + }, + }, + character:{ + //起 + jsrg_liuhong:['male','qun',4,['jsrgchaozheng','jsrgshenchong','jsrgjulian'],['zhu']], + jsrg_hejin:['male','qun',4,['jsrgzhaobing','jsrgzhuhuan','jsrgyanhuo']], + jsrg_sunjian:['male','qun',4,['jsrgpingtao','jsrgjuelie']], + jsrg_huangfusong:['male','qun',4,['jsrgguanhuo','jsrgjuxia']], + jsrg_xushao:['male','qun',3,['sbyingmen','sbpingjian']], + jsrg_dongbai:['female','qun',3,['jsrgshichong','jsrglianzhu']], + jsrg_qiaoxuan:['male','qun',3,['jsrgjuezhi','jsrgjizhao']], + jsrg_yangbiao:['male','qun','3/4',['jsrgzhaohan','jsrgrangjie','jsrgyizheng']], + jsrg_kongrong:['male','qun',3,['jsrglirang','jsrgzhengyi']], + jsrg_zhujun:['male','qun',4,['jsrgfendi','jsrgjuxiang']], + jsrg_liubei:['male','qun',4,['jsrgjishan','jsrgzhenqiao']], + jsrg_wangyun:['male','qun',3,['jsrgshelun','jsrgfayi'],['clan:太原王氏']], + jsrg_liuyan:['male','qun',3,['xinfu_limu','jsrgtushe','jsrgtongjue'],['zhu']], + jsrg_caocao:['male','qun',4,['jsrgzhenglve','jsrghuilie']], + jsrg_nanhualaoxian:['male','qun',3,['jsrgshoushu','jsrgxundao','jsrglinghua']], + //承 + jsrg_sunce:['male','wu',4,['jsrgduxing','jsrgzhiheng','jsrgzhasi','jsrgbashi'],['zhu']], + jsrg_xuyou:['male','wei',3,['jsrglipan','jsrgqingxi','jsrgjinmie'],['doublegroup:wei:qun']], + jsrg_lvbu:['male','qun',5,['jsrgwuchang','jsrgqingjiao','jsrgchengxu'],['doublegroup:qun:shu']], + jsrg_zhanghe:['male','wei',4,['jsrgqiongtu','jsrgxianzhu'],['doublegroup:qun:wei']], + jsrg_zoushi:['female','qun',3,['jsrgguyin','jsrgzhangdeng']], + jsrg_guanyu:['male','shu',5,['jsrgguanjue','jsrgnianen']], + jsrg_chendeng:['male','qun',3,['jsrglunshi','jsrgguitu']], + jsrg_zhenji:['female','qun',3,['jsrgjixiang','jsrgchengxian']], + jsrg_zhangliao:['male','qun',4,['jsrgzhengbing','jsrgtuwei'],['doublegroup:qun:wei']], + jsrg_xugong:['male','wu',3,['jsrgbiaozhao','jsrgyechou']], + jsrg_chunyuqiong:['male','qun',4,['jsrgcangchu','jsrgshishou']], + }, + characterIntro:{ + qiaoxuan:'桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。', + jsrg_caocao:'初平元年二月,董卓徙天子都长安,焚洛阳宫室,众诸侯畏卓兵强,莫敢进。操怒斥众人:“为人臣而临此境,当举义兵以诛暴乱,大众已合,诸君何疑?此一战而天下定矣!”遂引兵汴水,遇卓将徐荣,大破之。操迎天子,攻吕布,伐袁术,安汉室,拜为征西将军。是时,袁绍兼四州之地,将攻许都。操欲扫清寰宇,兴复汉室,遂屯兵官渡。既克绍,操曰:“若天命在吾,吾为周文王矣。”', + jsrg_sunce:'建安五年,操、绍相拒于官渡,孙策欲阴袭许昌,迎汉帝,遂密治兵,部署诸将。未发,会为许贡门客所刺,将计就计,尽托江东于权,诈死以待天时。八月,操、绍决战,孙策亲冒矢石,斩将刈旗,得扬、豫之地。曹操败走冀、青,刘备远遁荆、益。而后历时七年,孙策三分天下已有其二,帝于洛阳,建霸王未竟之功业。权表求吴王,封为仲帝,共治天下。', + }, + characterTitle:{ + }, + perfectPair:{}, + card:{ + }, + characterFilter:{ + jsrg_xushao:function(mode){ + return mode!='guozhan'; + }, + }, + skill:{ + //江山如故·承 + //404孙策 + jsrgduxing:{ + audio:2, + enable:'phaseUse', + viewAs:{ + name:'juedou', + storage:{jsrgduxing:true}, + isCard:true, + }, + viewAsFilter:function(player){ + if(player.hasSkill('jsrgduxing_used')) return false; + }, + filterCard:()=>false, + selectCard:-1, + selectTarget:[1,Infinity], + precontent:function(){ + player.logSkill('jsrgduxing'); + delete event.result.skill; + var targets=event.result.targets; + for(var target of targets){ + target.addTempSkill('jsrgduxing_allsha'); + } + player.addTempSkill('jsrgduxing_restore'); + player.addTempSkill('jsrgduxing_used','phaseUseAfter'); + }, + ai:{ + order:5, + result:{ + target:function(player,target){ + var eff=Math.sign(get.effect(target,{name:'juedou'},player,player)); + if(player.hasSkillTag('directHit_ai',true,{ + target:target, + card:{name:'juedou'}, + },true)||ui.selected.targets.concat(target).reduce((p,c)=>{ + return p+c.countCards('h'); + },0){ + current.removeSkill('jsrgduxing_allsha'); + },true); + } + }, + }, + }, + jsrgzhiheng:{ + audio:2, + trigger:{ + source:'damageBegin1', + }, + forced:true, + filter:function(event,player){ + if(event.getParent().type!='card') return false; + var respondEvts=[]; + respondEvts.addArray(event.player.getHistory('useCard')).addArray(event.player.getHistory('respond')); + respondEvts=respondEvts.filter(i=>i.respondTo).map(evt=>evt.respondTo); + return respondEvts.some(list=>{ + return list[0]==player; + }); + }, + content:function(){ + trigger.num++; + }, + }, + jsrgzhasi:{ + audio:2, + trigger:{ + player:'damageBegin4', + }, + limited:true, + skillAnimation:true, + animationColor:'wood', + filter:function(event,player){ + return event.num>=player.getHp(); + }, + content:function(){ + player.awakenSkill('jsrgzhasi'); + trigger.cancel(); + player.removeSkill('jsrgzhiheng'); + game.log(player,'失去了技能','#g【猘横】'); + player.addSkillLog('rezhiheng'); + player.addSkill('jsrgzhasi_undist'); + }, + subSkill:{ + undist:{ + inherit:'undist', + charlotte:true, + trigger:{ + player:['useCardAfter','damageEnd'], + }, + filter:function(event,player){ + if(event.name=='useCard') return event.targets.some(target=>{ + return target!=player; + }); + return true; + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + player.removeSkill('jsrgzhasi_undist'); + }, + mark:true, + intro:{ + content:'诈死中,不计入距离和座次的计算', + }, + }, + }, + }, + jsrgbashi:{ + audio:2, + trigger:{player:'chooseToRespondBefore'}, + zhuSkill:true, + filter:function(event,player){ + if(event.responded) return false; + if(player.storage.jsrgbashiing) return false; + if(!player.hasZhuSkill('jsrgbashi')) return false; + if(!event.filterCard({name:'sha'},player,event)&&!event.filterCard({name:'shan'},player,event)) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wu'; + }); + }, + check:function(event,player){ + if(get.damageEffect(player,event.player,player)>=0) return false; + return true; + }, + content:function(){ + 'step 0' + event.targets=game.filterPlayer(); + 'step 1' + var target=event.targets.shift(); + event.target=target; + if(!target) event.finish(); + else if(!target.isIn()||target==player) event.redo(); + else if(target.group=='wu'){ + if((target==game.me&&!_status.auto)||( + get.attitude(target,player)>2)|| + target.isOnline()){ + player.storage.jsrgbashiing=true; + var list=['sha','shan'].filter(name=>trigger.filterCard({name:name},player,trigger)); + var names=list.map(i=>'【'+i+'】').join('或'); + var next=target.chooseToRespond('是否替'+get.translation(player)+'打出一张'+names+'?',{name:list}); + next.set('ai',function(){ + var event=_status.event; + return (get.attitude(event.player,event.source)-2); + }); + next.set('skillwarn','替'+get.translation(player)+'打出一张'+names); + next.autochoose=function(){ + if(!lib.filter.autoRespondSha.apply(this,arguments)) return false; + return lib.filter.autoRespondShan.apply(this,arguments); + }; + next.set('source',player); + } + } + 'step 2' + delete player.storage.jsrgbashiing; + if(result.bool){ + event.finish(); + var name=result.card.name; + trigger.result={bool:true,card:{name:name,isCard:true}}; + trigger.responded=true; + trigger.animate=false; + if(typeof target.ai.shown=='number'&&target.ai.shown<0.95){ + target.ai.shown+=0.3; + if(target.ai.shown>0.95) target.ai.shown=0.95; + } + } + else{ + event.goto(1); + } + }, + ai:{ + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(arg=='use') return false; + if(player.storage.jsrgbashiing) return false; + if(!player.hasZhuSkill('jsrgbashi')) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wu'; + }); + }, + }, + }, + //许攸 + jsrglipan:{ + audio:2, + trigger:{ + player:'phaseEnd', + }, + direct:true, + content:function(){ + 'step 0' + var list=lib.group.slice(); + list.remove(player.group); + var getV=function(group){ + var val=1; + if(group=='wei'||group=='qun') val++; + game.countPlayer(current=>{ + if(current.group!=group) return false; + var att=get.attitude(player,current); + if(att>0) val++; + else if(att==0) val+=0.5; + else val--; + }); + return val; + }; + var maxGroup=list.slice().sort((a,b)=>{ + return getV(b)-getV(a); + })[0]; + list.push('cancel2'); + player.chooseControl(list).set('prompt',get.prompt('jsrglipan')).set('prompt2','变更为另一个势力').set('ai',()=>{ + return _status.event.choice; + }).set('choice',maxGroup); + 'step 1' + var group=result.control; + if(group=='cancel2') + player.logSkill('jsrglipan'); + player.popup(group+'2',get.groupnature(group,'raw')); + player.changeGroup(group); + var num=game.countPlayer(current=>{ + return current.group==group&¤t!=player; + }); + if(num>0) player.draw(num); + var next=player.phaseUse(); + next.jsrglipan=true; + event.next.remove(next); + trigger.next.push(next); + player.addTempSkill('jsrglipan_backfire'); + }, + subSkill:{ + backfire:{ + trigger:{ + player:'phaseUseEnd', + }, + charlotte:true, + forced:true, + popup:false, + filter:function(event,player){ + return event.jsrglipan; + }, + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>{ + return current.group==player.group; + }); + targets.sortBySeat(); + event.targets=targets; + 'step 1' + var target=targets.shift(); + event.target=target; + if(target&&target.isIn()&&target.canUse({name:'juedou'},player)){ + target.chooseCardTarget({ + position:'hes', + prompt:'是否将一张牌当【决斗】对'+get.translation(player)+'使用?', + filterCard:function(card,player){ + return player.canUse(get.autoViewAs({name:'juedou'},[card]),_status.event.getParent().player); + }, + filterTarget:function(card,player,target){ + var source=_status.event.getParent().player; + if(target!=source&&!ui.selected.targets.contains(source)) return false; + card=get.autoViewAs({name:'juedou'},[card]); + return lib.filter.filterTarget.apply(this,arguments); + }, + selectTarget:function(){ + var card=get.card(),player=get.player(); + if(!card) return; + card=get.autoViewAs({name:'juedou'},[card]); + var range=[1,1]; + game.checkMod(card,player,range,'selectTarget',player); + return range; + }, + ai1:function(card){ + var player=_status.event.player,target=_status.event.getParent().player; + var eff=get.effect(target,get.autoViewAs({name:'juedou'},[card]),player,player); + if(eff<=0) return 0; + return (player.hp==1?10:6)-get.value(card); + }, + ai2:function(target){ + if(target==_status.event.getParent().player) return 100; + return get.effect(target,{name:'juedou'},_status.event.player); + } + }); + } + 'step 2' + if(result.bool){ + var cards=result.cards; + var cardx=get.autoViewAs({name:'juedou'},cards); + var targets=result.targets.filter(targetx=>{ + return target.canUse(cardx,targetx); + }); + if(targets.length) target.useCard(cardx,cards,targets); + } + if(targets.length) event.goto(1); + } + } + }, + }, + jsrgqingxi:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(player.group!='qun') return false; + return game.hasPlayer(current=>lib.skill.jsrgqingxi.filterTarget('',player,current)); + }, + groupSkill:true, + filterTarget:function(card,player,target){ + if(target.countCards('h')>=player.countCards('h')) return false; + return !player.getStorage('jsrgqingxi_used').contains(target); + }, + content:function(){ + 'step 0' + player.addTempSkill('jsrgqingxi_used','phaseUseAfter'); + player.markAuto('jsrgqingxi_used',[target]); + var num=player.countCards('h')-target.countCards('h'); + if(num>0) player.chooseToDiscard(num,true,'轻袭:弃置'+get.cnNumber(num)+'张手牌'); + 'step 1' + var card={ + name:'sha', + nature:'stab', + isCard:true, + }; + if(player.canUse(card,target,false)) player.useCard(card,target,false); + }, + ai:{ + order:8, + result:{ + target:function(player,target){ + var num=target.countCards('h')-player.countCards('h'); + var cnt=player.countCards('h',card=>{ + return get.value(card)<5; + }); + if(cntcurrent.countCards('h')>player.countCards('h')); + }, + groupSkill:true, + filterTarget:function(card,player,target){ + return target.countCards('h')>player.countCards('h'); + }, + content:function(){ + 'step 0' + var card={ + name:'sha', + nature:'fire', + storage:{jsrgjinmie:target}, + isCard:true, + }; + if(player.canUse(card,target,false)){ + player.useCard(card,target,false); + player.addTempSkill('jsrgjinmie_effect'); + } + }, + ai:{ + order:0.5, + result:{ + target:function(player,target){ + var eff=get.effect(target,{name:'sha',nature:'fire'},player,target)/30; + if(!target.mayHaveShan()) eff*=2; + var del=target.countCards('h')-player.countCards('h')+1.5; + eff*=Math.sqrt(del); + return eff; + } + } + }, + subSkill:{ + effect:{ + trigger:{ + source:'damageSource', + }, + filter:function(event,player){ + return event.card&&event.card.storage&&event.card.storage.jsrgjinmie&&event.card.storage.jsrgjinmie.isIn(); + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + 'step 0' + var target=trigger.card.storage.jsrgjinmie; + var del=target.countCards('h')-player.countCards('h'); + if(del>0){ + player.line(target); + player.discardPlayerCard(target,'h',true,del); + } + // else if(del<0){ + // player.line(target); + // target.draw(-del); + // } + } + } + }, + }, + //吕布 + jsrgwuchang:{ + audio:2, + trigger:{ + player:'gainAfter', + global:'loseAsyncAfter', + }, + forced:true, + filter:function(event,player){ + var cards=event.getg(player); + if(!cards.length) return false; + return game.hasPlayer(current=>{ + if(current==player) return false; + return event.getl(current).cards2.length; + }); + }, + group:'jsrgwuchang_add', + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>{ + if(current==player) return false; + return trigger.getl(current).cards2.length; + }); + var target=targets[0]; + player.changeGroup(target.group); + player.popup(target.group+'2',get.groupnature(target.group,'raw')); + }, + subSkill:{ + add:{ + trigger:{ + source:'damageBegin1', + }, + filter:function(event,player){ + if(!event.card||!['sha','juedou'].contains(event.card.name)||event.getParent().type!='card') return false; + return event.player.group==player.group; + }, + forced:true, + content:function(){ + 'step 0' + trigger.num++; + var group='qun'; + player.changeGroup(group); + player.popup(group+'2',get.groupnature(group,'raw')); + }, + } + }, + }, + jsrgqingjiao:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(player.group!='qun') return false; + if(!player.countCards('hes')) return false; + return !player.hasSkill('jsrgqingjiao_tuixinzhifu')&&game.hasPlayer(current=>{ + return current.countCards('h')>player.countCards('h'); + })||!player.hasSkill('jsrgqingjiao_chenghuodajie')&&game.hasPlayer(current=>{ + return current.countCards('h')0?'tuixinzhifu':'chenghuodajie'; + if(player.hasSkill('jsrgqingjiao_'+name)) return false; + return player.canUse({name:name,cards:ui.selected.cards},target); + }, + content:function(){ + var del=target.countCards('h')-player.countCards('h'); + var name=del>0?'tuixinzhifu':'chenghuodajie'; + player.useCard({name:name},target,cards); + player.addTempSkill('jsrgqingjiao_'+name,'phaseUseAfter'); + }, + subSkill:{ + tuixinzhifu:{ + charlotte:true, + }, + chenghuodajie:{ + charlotte:true, + }, + } + }, + jsrgchengxu:{ + audio:2, + trigger:{player:'useCard'}, + forced:true, + filter:function(event,player){ + if(player.group!='shu') return false; + return game.hasPlayer(current=>{ + return current!=player&¤t.group==player.group; + }); + }, + groupSkill:true, + content:function(){ + trigger.directHit.addArray(game.filterPlayer(current=>{ + return current!=player&¤t.group==player.group; + })); + }, + ai:{ + directHit_ai:true, + skillTagFilter:function(player,tag,arg){ + return player.group=='shu'&&player.group==arg.target.group; + }, + }, + }, + //张郃 + jsrgqiongtu:{ + audio:2, + enable:'chooseToUse', + groupSkill:true, + viewAs:{ + name:'wuxie', + suit:'none', + number:null, + isCard:true, + }, + filter:function(event,player){ + return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); + }, + viewAsFilter:function(player){ + return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); + }, + filterCard:function(card){ + return get.type(card)!='basic'; + }, + position:'he', + popname:true, + ignoreMod:true, + precontent:function(){ + 'step 0' + player.logSkill('jsrgqiongtu'); + delete event.result.skill; + var card=event.result.cards[0]; + event.card=card; + event.result.card={ + name:event.result.card.name, + storage:{jsrgqiongtu:true}, + isCard:true, + }; + event.result.cards=[]; + player.addToExpansion(card,player,'give').gaintag.add('jsrgqiongtu'); + player.addTempSkill('jsrgqiongtu_check'); + }, + marktext:'途', + intro:{ + content:'expansion', + markcount:'expansion', + }, + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + delete player.storage[skill]; + }, + subSkill:{ + check:{ + trigger:{ + global:'useCardAfter', + }, + filter:function(event,player){ + return event.card.name=='wuxie'&&event.card.storage&&event.card.storage.jsrgqiongtu; + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + 'step 0' + game.delayx(); + var evt=trigger.getParent(4); + if(evt.name=='phaseJudge'){ + state=evt.cancelled; + } + else{ + state=evt._neutralized; + } + if(state){ + player.draw(); + } + else{ + player.changeGroup('wei'); + var cards=player.getExpansions('jsrgqiongtu'); + if(cards.length) player.gain(cards,'gain2'); + } + } + }, + }, + }, + jsrgxianzhu:{ + audio:2, + enable:'chooseToUse', + filter:function(event,player){ + return player.group=='wei'&&player.hasCard(card=>{ + return _status.connectMode||get.type(card)=='trick'; + },'hs'); + }, + groupSkill:true, + viewAs:{ + name:'sha', + storage:{jsrgxianzhu:true}, + }, + position:'hs', + filterCard:function(card){ + return get.type(card)=='trick'; + }, + check:function(card){ + var player=_status.event.player; + var cardx={ + name:'sha', + storage:{jsrgxianzhu:true}, + cards:[card], + } + if(game.hasPlayer(current=>{ + return player.canUse(cardx,current)&&get.effect(current,card,player,player)>0&&get.effect(current,cardx,player,player)>0; + })) return 15-get.value(card); + return 0; + }, + onuse:function(links,player){ + player.addTempSkill('jsrgxianzhu_after'); + }, + mod:{ + cardUsable:function(card){ + if(card.storage&&card.storage.jsrgxianzhu) return Infinity; + }, + }, + subSkill:{ + after:{ + trigger:{ + global:'damageSource', + }, + filter:function(event,player){ + var targets=event.getParent(2).targets; + if(!targets||targets.length!=1) return false; + if(!event.card||!event.card.storage||!event.card.storage.jsrgxianzhu) return false; + var target=event.player,card=event.cards[0]; + if(!target.isIn()) return false; + if(get.type(card)!='trick') return false; + if(!player.canUse(card,target,false)) return false; + return true; + }, + forced:true, + charlotte:true, + group:'jsrgxianzhu_inf', + content:function(){ + var card={ + name:trigger.cards[0].name, + isCard:true, + } + player.useCard(card,trigger.player,false); + game.delayx(); + }, + }, + inf:{ + trigger:{player:'useCard1'}, + forced:true, + popup:false, + firstDo:true, + filter:function(event,player){ + if(event.card.storage&&event.card.storage.jsrgxianzhu&&event.addCount!==false) return true; + return false; + }, + content:function(){ + trigger.addCount=false; + var stat=player.getStat().card,name=trigger.card.name; + if(typeof stat[name]=='number') stat[name]--; + }, + }, + }, + }, + //邹氏 + jsrgguyin:{ + audio:2, + trigger:{ + player:'phaseZhunbeiBegin', + }, + check:function(event,player){ + return player.isTurnedOver()||game.countPlayer2(current=>current.hasSex('male'))>=2; + }, + content:function(){ + 'step 0' + player.turnOver(); + 'step 1' + var targets=game.filterPlayer(current=>current!=player&¤t.hasSex('male')); + event.targets=targets; + player.line(targets); + game.delayx(); + 'step 2' + var target=targets.shift(); + event.target=target; + target.chooseBool('是否响应'+get.translation(player)+'的【孤吟】?','你可以翻面。').set('ai',()=>{ + return _status.event.bool; + }).set('bool',function(){ + return target.isTurnedOver()||get.attitude(target,player)>0&&(game.countPlayer2(current=>current.hasSex('male'))>=3||target.getHp()<=1&&player.hasSkill('jsrgzhangdeng')); + }()); + 'step 3' + if(result.bool){ + target.turnOver(); + } + if(targets.length) event.goto(2); + 'step 4' + var targets=game.filterPlayer(current=>{ + return current==player||current.isTurnedOver(); + }); + event.targets=targets; + event.num=0; + event.index=0; + 'step 5' + var target=targets[event.index]; + if(target.isIn()){ + target.draw(); + if(target==player) event.num++; + } + event.index++; + if(event.index>=targets.length) event.index=0; + 'step 6' + if(event.num>=game.countPlayer2(current=>current.hasSex('male'))) event.finish(); + else event.goto(5); + }, + }, + jsrgzhangdeng:{ + audio:2, + trigger:{ + global:'logSkill', + }, + filter:function(event,player){ + return event.player.getHistory('useSkill',evt=>{ + return evt.skill=='jsrgzhangdeng_jiu'; + }).map(evt=>evt.event).indexOf(event.log_event)==1; + }, + global:'jsrgzhangdeng_jiu', + forced:true, + locked:false, + content:function(){ + player.turnOver(false); + }, + subSkill:{ + jiu:{ + audio:'jsrgzhangdeng', + enable:'chooseToUse', + filter:function(event,player){ + return player.isTurnedOver()&&game.hasPlayer(current=>{ + return current.hasSkill('jsrgzhangdeng'); + }); + }, + viewAs:{name:'jiu',isCard:true}, + viewAsFilter:function(player){ + return player.isTurnedOver()&&game.hasPlayer(current=>{ + return current.hasSkill('jsrgzhangdeng'); + }); + }, + filterCard:()=>false, + selectCard:-1, + precontent:function(){ + player.logSkill('jsrgzhangdeng_jiu'); + var targets=game.filterPlayer(current=>{ + return current.hasSkill('jsrgzhangdeng'); + }); + player.line(targets[0]); + delete event.result.skill; + }, + }, + }, + }, + //关羽 + jsrgguanjue:{ + audio:2, + trigger:{ + player:['useCard','respond'], + }, + filter:function(event,player){ + return lib.suit.contains(get.suit(event.card)); + }, + forced:true, + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>current!=player); + var suit=get.suit(trigger.card); + for(var target of targets){ + target.addTempSkill('jsrgguanjue_ban'); + target.markAuto('jsrgguanjue_ban',[suit]); + } + }, + subSkill:{ + ban:{ + onremove:true, + charlotte:true, + mod:{ + cardEnabled:function(card,player){ + if(player.getStorage('jsrgguanjue_ban').contains(get.suit(card))) return false; + }, + cardRespondable:function(card,player){ + if(player.getStorage('jsrgguanjue_ban').contains(get.suit(card))) return false; + }, + cardSavable:function(card,player){ + if(player.getStorage('jsrgguanjue_ban').contains(get.suit(card))) return false; + }, + }, + mark:true, + marktext:'绝', + intro:{ + content:'本回合内不能使用或打出$的牌', + }, + }, + }, + }, + jsrgnianen:{ + audio:2, + enable:['chooseToUse','chooseToRespond'], + filter:function(event,player){ + if(!player.countCards('hes')) return false; + if(player.hasSkill('jsrgnianen_blocker')) return false; + for(var name of lib.inpile){ + if(get.type2(name)!='basic') continue; + var card={name:name}; + if(event.filterCard(card,player,event)) return true; + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + card.nature=nature; + if(event.filterCard(card,player,event)) return true; + } + } + } + return false; + }, + derivation:'mashu', + chooseButton:{ + dialog:function(event,player){ + var list=[]; + for(var name of lib.inpile){ + if(name=='sha'){ + if(event.filterCard({name:name},player,event)) list.push(['基本','','sha']); + for(var nature of lib.inpile_nature){ + if(event.filterCard({name:name,nature:nature},player,event)) list.push(['基本','','sha',nature]); + } + } + else if(get.type(name)=='basic'&&event.filterCard({name:name},player,event)) list.push(['基本','',name]); + } + var dialog=ui.create.dialog('念恩',[list,'vcard']); + dialog.direct=true; + return dialog; + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent()); + }, + check:function(button){ + if(_status.event.getParent().type!='phase') return 1; + var player=_status.event.player; + if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].contains(button.link[2])) return 0; + return player.getUseValue({ + name:button.link[2], + nature:button.link[3], + }); + }, + backup:function(links,player){ + return { + audio:'jsrgnianen', + filterCard:true, + popname:true, + check:function(card){ + return 8-get.value(card); + }, + position:'hes', + viewAs:{name:links[0][2],nature:links[0][3]}, + precontent:function(){ + delete event.result.skill; + var card=event.result.card; + if(get.color(card,player)!='red'||get.name(card)!='sha'||get.nature(card)){ + player.addTempSkill('jsrgnianen_blocker'); + player.addAdditionalSkill('jsrgnianen_blocker','mashu'); + } + }, + } + }, + prompt:function(links,player){ + return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; + } + }, + hiddenCard:function(player,name){ + if(!lib.inpile.contains(name)) return false; + var type=get.type2(name); + return type=='basic'&&player.countCards('hes')>0&&!player.hasSkill('jsrgnianen_blocker'); + }, + ai:{ + fireAttack:true, + respondSha:true, + respondShan:true, + skillTagFilter:function(player){ + if(!player.countCards('hes')||player.hasSkill('jsrgnianen_blocker')) return false; + }, + order:1, + result:{ + player:function(player){ + if(_status.event.dying) return get.attitude(player,_status.event.dying); + return 1; + }, + }, + }, + subSkill:{ + blocker:{ + charlotte:true, + mark:true, + marktext:'恩', + intro:{content:'视为拥有〖马术〗'}, + }, + }, + }, + //生鱼片 + jsrglunshi:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + return game.hasPlayer(current=>{ + return current.inRangeOf(target); + }); + }, + content:function(){ + 'step 0' + var num=game.countPlayer(current=>{ + return current.inRangeOf(target); + }); + var len=target.countCards('h'); + num=Math.max(0,Math.min(len+num,5)-len); + if(num>0) target.draw(num); + 'step 1' + var num=game.countPlayer(current=>{ + return current.inRange(target); + }); + if(num>0) target.chooseToDiscard(num,'he',true,get.translation(player)+'对你发动了【论势】','请弃置'+get.cnNumber(num)+'张牌'); + }, + ai:{ + order:6, + result:{ + target:function(player,target){ + var num1=game.countPlayer(current=>{ + return current.inRangeOf(target); + }),num2=game.countPlayer(current=>{ + return current.inRange(target); + }); + var len=target.countCards('h'); + num1=Math.max(0,Math.min(len+num1,5)-len); + return (num1-num2+1)/2; + } + } + }, + }, + jsrgguitu:{ + audio:2, + trigger:{ + player:'phaseZhunbeiBegin', + }, + direct:true, + filter:function(event,player){ + return game.countPlayer(current=>{ + return current.getEquips(1).length; + })>=2; + }, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgguitu'),(card,player,target)=>{ + return target.getEquips(1).length; + },[1,2]).set('filterOk',()=>{ + var num=0; + for(var target of ui.selected.targets){ + num+=target.getEquips(1).length; + } + return num>=2; + }).set('ai',target=>{ + var sign=-1; + var val=0; + if(ui.selected.targets.length){ + sign=1; + var targetx=ui.selected.targets[0]; + var cards=targetx.getEquips(1); + var list=cards.map(card=>{ + return [card,get.value(card,targetx)]; + }); + list.sort((a,b)=>{ + return b[1]-a[1]; + }); + val=get.attitude(_status.event.player,targetx)*list[0][1]; + } + var cards=target.getEquips(1); + var list=cards.map(card=>{ + return [card,get.value(card,target)]; + }); + list.sort((a,b)=>{ + return b[1]-a[1]; + }); + return get.attitude(_status.event.player,target)*list[0][1]*sign-val; + }); + 'step 1' + if(result.bool){ + var targets=result.targets.slice(); + targets.sortBySeat(); + event.targets=targets; + player.logSkill('jsrgguitu',targets); + event.rangeList=targets.map(target=>{ + return target.getAttackRange(); + }); + var weapons=[]; + for(var target of targets){ + weapons.addArray(target.getEquips(1)); + } + if(weapons.length>2){ + var list=['诡图:选择要交换的武器牌']; + for(var target of targets){ + list.addArray([ + '
'+get.translation(target)+'的武器牌
', + target.getEquips(1) + ]) + } + player.chooseButton(list,true,2).set('filterButton',button=>{ + var count=_status.event.count; + if(count==1) return true; + for(var i=0;i{ + var player=_status.event.player; + var card=button.link; + var owner=get.owner(card); + var att=get.attitude(player,owner); + var val=-get.value(card)*att; + return val; + }); + } + else event._result={bool:true,links:weapons}; + } + else event.finish(); + 'step 2' + if(result.bool){ + var links=result.links; + var list=[]; + for(var target of targets){ + var weapons=target.getEquips(1); + weapons=weapons.filter(i=>links.contains(i)); + if(weapons.length){ + list.push([target,weapons]); + } + } + if(list.length==2){ + event.players=list.map(i=>i[0]); + event.cards=list.map(i=>i[1]); + } + else{ + event.players=[list[0][0],list[0][0]]; + event.cards=list[0][1]; + } + game.loseAsync({ + player:event.players[0], + target:event.players[1], + cards1:event.cards[0], + cards2:event.cards[1], + }).setContent('swapHandcardsx'); + } + else event.finish(); + 'step 3' + for(var i=0;i{ + return target.getAttackRange(); + }); + for(var i=0;ilist.contains(name)); + var str=get.translation(trigger.player)+(evt.card?'因'+get.translation(evt.card):'')+'需要'+reason+'一张'+names+',是否弃置一张牌视为其'+reason+'之'+ + (used.length?('(你不能以此法令其'+reason+get.translation(used)+')'):'')+'?若如此做,你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。'; + event.str=str; + if(!listx.length) event.finish(); + if(listx.length==1) event._result={bool:true,links:listx}; + else{ + event.asked=true; + player.chooseButton([ + '###'+get.prompt('jsrgjixiang',trigger.player)+'###
'+str+'
', + [listx,'vcard'] + ]).set('ai',()=>Math.random()+1); + } + 'step 1' + if(result.bool){ + var name=result.links[0][2],nature=result.links[0][3]; + var card={name:name,nature:nature,isCard:true}; + event.card=card; + var reason=(trigger.name=='chooseToUse'?'使用':'打出'); + var prompt=event.asked? + '济乡:是否弃置一张牌'+(trigger.filterTarget?'并选择目标角色':'')+'?': + get.prompt('jsrgjixiang',trigger.player); + var str=event.asked?'若如此做,视为'+get.translation(trigger.player)+reason+get.translation(card)+',然后你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。':event.str; + var next=player.chooseCardTarget({ + prompt:prompt, + prompt2:str, + filterCard:lib.filter.cardDiscardable, + position:'he', + goon:get.attitude(player,trigger.player)>1&&(evt.card?get.effect(trigger.player,evt.card,evt.player,player)<0:get.effect(trigger.player,{name:list[0]},trigger.player,player)>0), + ai1:function(card){ + if(_status.event.goon) return 6-get.value(card); + return 0; + }, + _get_card:card, + }); + var keys=['filterTarget','selectTarget','ai2']; + for(var key of keys) delete next[key]; + for(var i in trigger){ + if(!next.hasOwnProperty(i)) next[i]=trigger[i]; + } + next.filterTargetx=trigger.filterTarget||(()=>false); + next.filterTarget=function(card,player,target){ + var filter=this.filterTargetx; + if(typeof filter!='function') filter=(()=>filter); + card=_status.event._get_card; + player=_status.event.getTrigger().player; + return this.filterTargetx.apply(this,arguments); + }; + if(typeof next.selectTarget!='number'&&typeof next.selectTarget!='function'&&get.itemtype(next.selectTarget)!='select') next.selectTarget=-1; + } + else event.finish(); + 'step 2' + if(result.bool){ + var cardx=result.cards[0]; + var targets=result.targets||[]; + event.targets=targets; + player.logSkill('jsrgjixiang',trigger.player); + player.addTempSkill('jsrgjixiang_used'); + player.markAuto('jsrgjixiang_used',[card.name]); + player.discard(cardx); + trigger.untrigger(); + trigger.set('responded',true); + var result={ + bool:true, + card:card + }; + if(targets.length) result.targets=targets; + trigger.result=result; + player.draw(); + var phaseName; + for(var name of lib.phaseName){ + var evt=trigger.getParent(name); + if(!evt||evt.name!=name) continue; + phaseName=name; + break; + } + if(phaseName){ + player.addTempSkill('jsrgjixiang_add',phaseName+'After'); + player.addMark('jsrgjixiang_add',1,false); + } + } + }, + subSkill:{ + used:{ + charlotte:true, + onremove:true, + mark:true, + marktext:'乡', + intro:{ + content:'已触发过牌名:$', + }, + }, + add:{ + charlotte:true, + onremove:true, + mark:true, + intro:{ + markcount:(storage,player)=>2+(storage||0), + content:(storage,player)=>'〖称贤〗剩余可发动次数为'+(2+(storage||0)), + }, + }, + save:{ + charlotte:true, + ai:{ + save:true, + skillTagFilter:function(player,arg,target){ + return _status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('jsrgjixiang')&&_status.currentPhase.countCards('he'); + }, + }, + }, + }, + }, + jsrgchengxian:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(!player.countCards('hs')) return false; + if(2+player.countMark('jsrgjixiang_add')<=0) return false; + for(var name of lib.inpile){ + if(get.type(name)!='trick') continue; + if(player.getStorage('jsrgchengxian_used').contains(name)) continue; + if(event.filterCard({name:name},player,event)) return true; + } + return false; + }, + chooseButton:{ + dialog:function(event,player){ + var list=[]; + for(var name of lib.inpile){ + if(player.getStorage('jsrgchengxian_used').contains(name)) continue; + var info=get.info({name:name}); + if(!info||info.type!='trick') continue; + if(info.notarget) continue; + if(!info.selectTarget) continue; + if(get.type(name)=='trick'&&event.filterCard({name:name},player,event)) list.push(['锦囊','',name]); + } + var dialog=ui.create.dialog('称贤',[list,'vcard']); + return dialog; + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent()); + }, + check:function(button){ + if(_status.event.getParent().type!='phase') return 1; + var player=_status.event.player; + if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].contains(button.link[2])) return 0; + return player.getUseValue({ + name:button.link[2], + nature:button.link[3], + }); + }, + backup:function(links,player){ + return { + audio:'jsrgchengxian', + filterCard:function(card,player){ + var num=game.countPlayer(current=>{ + return player.canUse(card,current); + }); + if(!num) return false; + var cardx=get.copy(lib.skill.jsrgchengxian_backup.viewAs); + cardx.cards=[card]; + var num2=game.countPlayer(current=>{ + return player.canUse(cardx,current); + }); + return num==num2; + }, + popname:true, + check:function(card){ + return 8-get.value(card); + }, + position:'hs', + viewAs:{name:links[0][2]}, + precontent:function(){ + player.logSkill('jsrgchengxian'); + player.addTempSkill('jsrgjixiang_add'); + if(typeof player.storage.jsrgjixiang_add!='number') player.storage.jsrgjixiang_add=0; + player.storage.jsrgjixiang_add--; + player.addTempSkill('jsrgchengxian_used'); + player.markAuto('jsrgchengxian_used',[event.result.card.name]); + delete event.result.skill; + }, + } + }, + prompt:function(links,player){ + return '将一张合法目标数与'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'相同的手牌当此牌使用'; + } + }, + //理解错了,下面这个不用了 + getNumber:function(card,player){ + var rangex=null; + var info=get.info(card); + if(!info) return null; + if(info.notarget) return null; + if(info.selectTarget!=undefined){ + var select=get.select(info.selectTarget); + if(select[0]<0){ + if(!info.toself){ + var count=game.countPlayer(current=>{ + return lib.filter.targetEnabled(card,player,current); + }); + } + else count=1; + rangex=[count,count]; + } + else rangex=select; + } + return rangex; + }, + ai:{ + order:1, + result:{ + player:function(player){ + if(_status.event.dying) return get.attitude(player,_status.event.dying); + return 1; + }, + }, + }, + subSkill:{ + used:{ + charlotte:true, + onremove:true, + mark:true, + intro:{ + content:'已使用过$', + }, + }, + }, + }, + //张辽 + jsrgzhengbing:{ + audio:2, + enable:'phaseUse', + usable:3, + filter:function(event,player){ + return player.group=='qun'; + }, + filterCard:lib.filter.cardRecastable, + check:function(card,player){ + var val=5+['shan','tao'].contains(get.name(card))*1.5; + if(player.needsToDiscard()>2&&get.name(card)=='sha'&&player.countCards('hs','sha')>1) val+=0.5; + return val-get.value(card); + }, + position:'he', + groupSkill:true, + lose:false, + discard:false, + delay:false, + content:function(){ + 'step 0' + player.recast(cards); + switch(get.name(cards[0])){ + case 'sha': + player.addTempSkill('jsrgzhengbing_sha'); + player.addMark('jsrgzhengbing_sha',2,false); + break; + case 'shan': + player.draw(); + break; + case 'tao': + player.changeGroup('wei'); + } + }, + ai:{ + order:7, + result:{player:1}, + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + mod:{ + maxHandcard:function(player,num){ + return num+player.countMark('jsrgzhengbing_sha'); + }, + }, + intro:{ + content:'手牌上限+#', + }, + } + }, + }, + jsrgtuwei:{ + audio:2, + trigger:{ + player:'phaseUseBegin', + }, + filter:function(event,player){ + return player.group=='wei'&&game.hasPlayer(current=>{ + return player.inRange(current)&¤t.countGainableCards(player,'he')>0; + }); + }, + groupSkill:true, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgtuwei'),'获得攻击范围内任意名角色的各一张牌。然后回合结束时这些角色中未受过伤害的角色依次获得你的一张牌。',(card,player,target)=>{ + return player.inRange(current)&&target.countGainableCards(player,'he')>0; + },[1,Infinity]).set('ai',target=>{ + var player=_status.event.player; + return get.effect(target,{name:'shunshou'},player,player); + }).set('damage',player.hasCard(card=>{ + return player.hasValueTarget(card)&&get.tag(card,'damage'); + },'hs')); + 'step 1' + if(result.bool){ + var targets=result.targets.slice(); + targets.sortBySeat(); + player.logSkill('jsrgtuwei',targets); + player.gainMultiple(result.targets,'he'); + player.addTempSkill('jsrgtuwei_backfire'); + player.markAuto('jsrgtuwei_backfire',targets); + } + }, + subSkill:{ + backfire:{ + audio:'jsrgtuwei', + trigger:{ + player:'phaseEnd', + }, + charlotte:true, + onremove:true, + forced:true, + filter:function(event,player){ + return player.getStorage('jsrgtuwei_backfire').some(target=>{ + return !target.getHistory('damage').length&&target.isIn(); + }); + }, + content:function(){ + 'step 0' + var targets=player.getStorage('jsrgtuwei_backfire').filter(target=>{ + return !target.getHistory('damage').length&&target.isIn(); + }); + event.targets=targets.sortBySeat(); + 'step 1' + var target=targets.shift(); + if(target.isIn()&&player.countGainableCards(target,'he')){ + target.line(player); + target.gainPlayerCard(player,true,'he'); + } + if(player.countCards('he')&&targets.length) event.redo(); + }, + ai:{ + effect:{ + player:function(card,player,target){ + if(player!=target&&get.tag(card,'damage')&&target&&player.getStorage('jsrgtuwei_backfire').contains(target)&&!target.getHistory('damage').length) return [1,1,1,0]; + }, + }, + }, + }, + }, + }, + //许贡 + jsrgbiaozhao:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return game.countPlayer(current=>current!=player)>=2; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgbiaozhao'),lib.filter.notMe,2).set('ai',target=>{ + var player=_status.event.player; + var att=get.attitude(player,target); + if(!ui.selected.targets.length) return att*(Math.sqrt(target.countCards('hs'))+0.1); + return -att/Math.sqrt(target.countCards('hs')+0.1); + }).set('targetprompt',['用牌无限制','打你变疼']); + 'step 1' + if(result.bool){ + var targets=result.targets; + player.logSkill('jsrgbiaozhao',targets); + player.addTempSkill('jsrgbiaozhao_syujin',{player:['phaseBegin','die']}); + if(!player.storage.jsrgbiaozhao_syujin) player.storage.jsrgbiaozhao_syujin=[]; + player.storage.jsrgbiaozhao_syujin.push(targets); + targets[0].addSkill('jsrgbiaozhao_A'); + targets[0].markAuto('jsrgbiaozhao_A',[targets[1]]); + targets[1].addSkill('jsrgbiaozhao_B'); + targets[1].addMark('jsrgbiaozhao_B'+player.playerid,1,false); + targets[1].markAuto('jsrgbiaozhao_B',[player]); + } + }, + subSkill:{ + syujin:{ + charlotte:true, + onremove:function(player,skill){ + var list=player.storage.jsrgbiaozhao_syujin; + for(var targets of list){ + targets[0].unmarkAuto('jsrgbiaozhao_A',[targets[1]]); + targets[1].unmarkAuto('jsrgbiaozhao_B',[player]); + delete targets[1].storage['jsrgbiaozhao_B'+player.playerid]; + if(!targets[0].getStorage('jsrgbiaozhao_A')) targets[0].removeSkill('jsrgbiaozhao_A'); + if(!targets[1].getStorage('jsrgbiaozhao_B')) targets[1].removeSkill('jsrgbiaozhao_B'); + } + delete player.storage.jsrgbiaozhao_syujin; + }, + }, + A:{ + charlotte:true, + onremove:true, + mark:true, + marktext:'表', + intro:{ + content:'对$使用牌无次数和距离限制', + }, + mod:{ + targetInRange:function(card,player,target){ + if(player.getStorage('jsrgbiaozhao_A').contains(target)) return true; + }, + cardUsableTarget:function(card,player,target){ + if(player.getStorage('jsrgbiaozhao_A').contains(target)) return true; + }, + }, + }, + B:{ + trigger:{ + source:'damageBegin1', + }, + charlotte:true, + forced:true, + onremove:function(player,skill){ + for(var i in player.storage){ + if(i.indexOf('jsrgbiaozhao_B')==0) delete player.storage[i]; + } + }, + filter:function(event,player){ + return event.card&&player.getStorage('jsrgbiaozhao_B').contains(event.player); + }, + content:function(){ + trigger.num+=player.countMark('jsrgbiaozhao_B'+trigger.player.playerid)||1; + }, + mark:true, + marktext:'召', + intro:{ + content:function(storage,player){ + var str=''; + for(var target of storage){ + str+='对'+get.translation(target)+'使用牌造成的伤害+'+player.countMark('jsrgbiaozhao_B'+target.playerid); + } + return str; + } + }, + }, + } + }, + jsrgyechou:{ + audio:2, + trigger:{player:'die'}, + forceDie:true, + direct:true, + skillAnimation:true, + animationColor:'wood', + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgyechou'),lib.filter.notMe).set('ai',target=>{ + var player=_status.event.player; + return -get.attitude(player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgyechou',target); + target.addSkill('jsrgyechou_effect'); + target.addMark('jsrgyechou_effect',1,false); + } + }, + subSkill:{ + effect:{ + trigger:{ + player:'damageBegin3', + }, + filter:function(event,player){ + return event.num>=player.getHp(); + }, + forced:true, + charlotte:true, + onremove:true, + content:function(){ + trigger.num*=2*player.countMark('jsrgyechou_effect'); + }, + mark:true, + marktext:'仇', + intro:{ + content:'当你受到伤害值不小于体力值的伤害时,此伤害翻&倍', + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + if(target.hp==1) return 2; + } + } + } + }, + }, + } + }, + //淳于琼 + jsrgcangchu:{ + audio:'recangchu', + trigger:{ + global:'phaseJieshuBegin', + }, + filter:function(event,player){ + if(player.hasSkill('jsrgshishou_blocker')) return false; + return player.getHistory('gain').length; + }, + direct:true, + content:function(){ + 'step 0' + var num=0; + player.getHistory('gain',evt=>{ + num+=evt.cards.length; + }); + event.num=num; + player.chooseTarget(get.prompt('jsrgcangchu'),'令至多'+get.cnNumber(num)+'名角色各摸'+get.cnNumber(num>game.countPlayer()?2:1)+'张牌',[1,num]).set('ai',target=>{ + var player=_status.event.player; + return get.attitude(player,target)/Math.sqrt(target.countCards('hs')+1); + }); + 'step 1' + if(result.bool){ + var targets=result.targets.slice(); + targets.sortBySeat(); + player.logSkill('jsrgcangchu',targets); + game.asyncDraw(targets,num>game.countPlayer()?2:1); + game.delayex(); + } + }, + }, + jsrgshishou:{ + audio:'reshishou', + trigger:{ + player:'useCard', + }, + forced:true, + filter:function(event,player){ + return event.card.name=='jiu'; + }, + group:'jsrgshishou_burn', + content:function(){ + 'step 0' + player.draw(3); + player.addTempSkill('jsrgshishou_nouse'); + }, + mod:{ + aiOrder:function(player,card,num){ + if(card.name=='jiu') return 0.01; + }, + }, + ai:{ + effect:{ + player_use:function(card,player,target){ + if(card.name=='jiu') return [1,1]; + }, + } + }, + subSkill:{ + nouse:{ + charlotte:true, + mod:{ + cardEnabled:function(card,player){ + return false; + }, + cardUsable:function(card,player){ + return false; + }, + cardSavable:function(card,player){ + return false; + }, + }, + mark:true, + marktext:'失', + intro:{ + content:'喝醉了,不能再使用牌', + } + }, + burn:{ + audio:'reshishou', + trigger:{ + player:'damageEnd', + }, + forced:true, + filter:function(event,player){ + return event.nature=='fire'; + }, + content:function(){ + player.addTempSkill('jsrgshishou_blocker',{player:'phaseEnd'}); + } + }, + blocker:{ + charlotte:true, + mark:true, + marktext:'守', + intro:{ + content:'〖仓储〗失效直到下回合结束', + } + } + }, + }, + //江山如故·起 + sbyingmen:{ + forbid:['guozhan'], + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + return event.name!='phase'||game.phaseNumber==0; + }, + content:function(){ + if(!_status.characterlist) lib.skill.pingjian.initList(); + var characters=_status.characterlist.randomRemove(4); + lib.skill.sbyingmen.addVisitors(characters,player); + game.delayx(); + }, + group:'sbyingmen_reload', + subSkill:{ + reload:{ + trigger:{player:'phaseBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + return player.getStorage('sbyingmen').length<4; + }, + content:function(){ + if(!_status.characterlist) lib.skill.pingjian.initList(); + var characters=_status.characterlist.randomRemove(4-player.getStorage('sbyingmen').length); + lib.skill.sbyingmen.addVisitors(characters,player); + game.delayx(); + }, + }, + }, + getSkills:function(characters,player){ + var skills=[]; + for(var name of characters){ + if(Array.isArray(lib.character[name])){ + for(var skill of lib.character[name][3]){ + var list=get.skillCategoriesOf(skill,player); + list.remove('锁定技'); + if(list.length>0) continue; + var info=get.info(skill); + if(info&&(!info.unique||info.gainable)) skills.add(skill); + } + } + } + return skills; + }, + addVisitors:function(characters,player){ + player.addSkillBlocker('sbyingmen'); + game.log(player,'将','#y'+get.translation(characters),'加入了','#g“访客”') + lib.skill.rehuashen.drawCharacter(player,characters); + player.markAuto('sbyingmen',characters) + var storage=player.getStorage('sbyingmen'); + var skills=lib.skill.sbyingmen.getSkills(storage,player); + player.addInvisibleSkill(skills); + }, + removeVisitors:function(characters,player){ + var skills=lib.skill.sbyingmen.getSkills(characters,player); + var characters2=player.getStorage('sbyingmen').slice(0); + characters2.removeArray(characters); + skills.removeArray(lib.skill.sbyingmen.getSkills(characters2,player)); + player.unmarkAuto('sbyingmen',characters); + _status.characterlist.addArray(characters); + player.removeInvisibleSkill(skills); + }, + onremove:function(player,skill){ + lib.skill.sbyingmen.removeVisitors(player.getSkills('sbyingmen'),player); + player.removeSkillBlocker('sbyingmen'); + }, + skillBlocker:function(skill,player){ + if(!player.invisibleSkills.contains(skill)||skill=='sbpingjian'||skill=='sbpingjian') return false; + return !player.hasSkill('sbpingjian'); + }, + marktext:'客', + intro:{ + name:'访客', + mark:function(dialog,storage,player){ + if(!storage||!storage.length) return '当前没有“访客”'; + dialog.addSmall([storage,'character']); + var skills=lib.skill.sbyingmen.getSkills(storage,player); + if(skills.length) dialog.addText('
  • 当前可用技能:'+get.translation(skills),false); + }, + }, + }, + sbpingjian:{ + trigger:{player:['useSkill','logSkillBegin']}, + forced:true, + filter:function(event,player){ + var skill=event.sourceSkill||event.skill; + return player.invisibleSkills.contains(skill)&&lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player).contains(skill); + }, + content:function(){ + 'step 0' + var visitors=player.getStorage('sbyingmen').slice(0); + var drawers=visitors.filter(function(name){ + return Array.isArray(lib.character[name])&&lib.character[name][3].contains(trigger.sourceSkill); + }); + event.drawers=drawers; + if(visitors.length==1) event._result={bool:true,links:visitors}; + else{ + var dialog=['评鉴:请选择移去一张“访客”']; + if(drawers.length) dialog.push('
    如果移去'+get.translation(drawers)+',则你摸一张牌
    '); + dialog.push([visitors,'character']); + player.chooseButton(dialog,true); + } + 'step 1' + if(result.bool){ + lib.skill.sbyingmen.removeVisitors(result.links,player); + game.log(player,'移去了','#y'+get.translation(result.links[0])); + if(event.drawers.contains(result.links[0])){ + player.addTempSkill('sbpingjian_draw'); + player.storage.sbpingjian_draw.push(trigger.skill); + } + } + }, + group:'sbpingjian_trigger', + subSkill:{ + draw:{ + charlotte:true, + init:function(player,skill){ + if(!player.storage[skill]) player.storage[skill]=[]; + }, + onremove:true, + trigger:{player:['useSkillAfter','logSkill']}, + forced:true, + popup:false, + filter:function(event,player){ + return player.getStorage('sbpingjian_draw').contains(event.skill); + }, + content:function(){ + player.storage.sbpingjian_draw.remove(trigger.skill); + player.draw(); + if(!player.storage.sbpingjian_draw.length) player.removeSkill('sbpingjian_draw'); + }, + }, + trigger:{ + trigger:{player:'triggerInvisible'}, + forced:true, + forceDie:true, + popup:false, + charlotte:true, + priority:10, + filter:function(event,player){ + if(event.revealed) return false; + var info=get.info(event.skill); + if(info.charlotte) return false; + var skills=lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player); + game.expandSkills(skills); + return skills.contains(event.skill); + }, + content:function(){ + "step 0" + if(get.info(trigger.skill).silent){ + event.finish(); + } + else{ + var info=get.info(trigger.skill); + var event=trigger,trigger=event._trigger; + var str; + var check=info.check; + if(info.prompt) str=info.prompt; + else{ + if(typeof info.logTarget=='string'){ + str=get.prompt(event.skill,trigger[info.logTarget],player); + } + else if(typeof info.logTarget=='function'){ + var logTarget=info.logTarget(trigger,player); + if(get.itemtype(logTarget).indexOf('player')==0) str=get.prompt(event.skill,logTarget,player); + } + else{ + str=get.prompt(event.skill,null,player); + } + } + if(typeof str=='function'){str=str(trigger,player)} + var next=player.chooseBool('评鉴:'+str); + next.set('yes',!info.check||info.check(trigger,player)); + next.set('hsskill',event.skill); + next.set('forceDie',true); + next.set('ai',function(){ + return _status.event.yes; + }); + if(typeof info.prompt2=='function'){ + next.set('prompt2',info.prompt2(trigger,player)); + } + else if(typeof info.prompt2=='string'){ + next.set('prompt2',info.prompt2); + } + else if(info.prompt2!=false){ + if(lib.dynamicTranslate[event.skill]) next.set('prompt2',lib.dynamicTranslate[event.skill](player,event.skill)); + else if(lib.translate[event.skill+'_info']) next.set('prompt2',lib.translate[event.skill+'_info']); + } + if(trigger.skillwarn){ + if(next.prompt2){ + next.set('prompt2',''+trigger.skillwarn+'。'+next.prompt2); + } + else{ + next.set('prompt2',trigger.skillwarn); + } + } + } + "step 1" + if(result.bool){ + trigger.revealed=true; + } + else{ + trigger.untrigger(); + trigger.cancelled=true; + } + } + }, + }, + }, + jsrgchaozheng:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + logTarget:function(event,player){ + return game.filterPlayer(i=>i!=player); + }, + prompt:'是否发动【朝争】?', + content:function(){ + player.chooseToDebate(game.filterPlayer(i=>i!=player)).set('callback',lib.skill.jsrgchaozheng.callback); + }, + callback:function(){ + var result=event.debateResult; + if(result.bool&&result.opinion){ + var opinion=result.opinion,targets=result.red.map(i=>i[0]); + targets.sortBySeat(); + targets.forEach(i=>i[opinion=='red'?'recover':'loseHp']()); + if(targets.length==0||result.black.length==0) player.draw(result.targets.length); + } + } + }, + jsrgshenchong:{ + audio:2, + enable:'phaseUse', + limited:true, + filterTarget:lib.filter.notMe, + skillAnimation:true, + animationColor:'soil', + content:function(){ + 'step 0' + player.awakenSkill('jsrgshenchong'); + target.addSkillLog('jsrgfeiyang'); + target.addSkillLog('jsrgbahu'); + 'step 1' + player.addSkill('jsrgshenchong_die'); + player.markAuto('jsrgshenchong_die',[target]); + }, + ai:{ + order:1, + result:{target:1} + }, + subSkill:{ + die:{ + audio:'jsrgshenchong', + trigger:{player:'die'}, + charlotte:true, + forced:true, + forceDie:true, + filter:function(event,player){ + return player.getStorage('jsrgshenchong_die').length; + }, + content:function(){ + var targets=player.getStorage('jsrgshenchong_die'); + player.line(targets); + targets.sortBySeat().forEach(current=>{ + current.clearSkills(true); + current.chooseToDiscard(current.countCards('h'),'h',true); + }); + } + } + } + }, + jsrgfeiyang:{ + trigger:{player:'phaseJudgeBegin'}, + direct:true, + filter:function(event,player){ + return player.countCards('j')&&player.countCards('h')>1; + }, + content:function(){ + 'step 0' + player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ + return 6-get.value(card); + }); + 'step 1' + if(result.bool){ + player.discardPlayerCard(player,'j',true); + } + }, + }, + jsrgbahu:{ + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + content:function(){ + player.draw(); + }, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+1; + }, + }, + }, + jsrgjulian:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.hasZhuSkill('jsrgjulian')&&lib.skill.jsrgjulian.logTarget(null,player).length; + }, + prompt:'是否发动【聚敛】?', + prompt2:'你可以获得其他所有群势力角色的各一张牌', + logTarget:function(event,player){ + return game.filterPlayer(current=>{ + return current.group=='qun'&¤t.countGainableCards(player,'h')>0&¤t!=player; + }) + }, + content:function(){ + game.filterPlayer(current=>{ + return current.group=='qun'&¤t!=player; + }).sortBySeat().forEach(i=>{ + player.gainPlayerCard(i,'h',true); + }); + }, + group:'jsrgjulian_draw', + zhuSkill:true, + subSkill:{ + draw:{ + audio:'jsrgjulian', + trigger:{global:'gainAfter'}, + filter:function(event,player){ + var source=event.player; + if(source==player||source.group!='qun') return false; + var evt=event.getParent('phaseDraw'); + return (!evt||evt.player!=source)&&event.getParent().name=='draw'&&event.getParent(2).name!='jsrgjulian_draw'&&player.hasZhuSkill('jsrgjulian',event.player); + }, + direct:true, + usable:2, + content:function(){ + 'step 0' + var source=trigger.player; + event.source=source; + source.chooseBool('是否响应'+get.translation(player)+'的【聚敛】摸一张牌?'); + 'step 1' + if(result.bool){ + source.logSkill('jsrgjulian_draw',player); + source.draw(); + } + else player.storage.counttrigger.jsrgjulian_draw--; + } + }, + give:{ + charlotte:true, + onremove:true + } + } + }, + //何进 + jsrgzhaobing:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + filter:function(event,player){ + var hs=player.getCards('h'); + if(!hs.length) return false; + for(var i of hs){ + if(!lib.filter.cardDiscardable(i,player,'jsrgzhaobing')) return false; + } + return true; + }, + content:function(){ + 'step 0' + var cards=player.getCards('h'); + var num=cards.length; + var prompt2='弃置所有手牌,令至多'+get.cnNumber(num)+'名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力'; + player.chooseTarget(get.prompt('jsrgzhaobing'),prompt2,[1,num],lib.filter.notMe).set('ai',target=>{ + if(!_status.event.goon) return 0; + return 2-get.attitude(_status.event.player,target); + }).set('goon',num/2{ + return 2-get.attitude(player,current)>0; + })); + 'step 1' + if(result.bool){ + player.logSkill('jsrgzhaobing',result.targets); + event.targets=result.targets; + event.targets.sortBySeat(); + player.chooseToDiscard(true,'h',player.countCards('h')); + } + else event.finish(); + 'step 2' + var target=targets.shift(); + event.target=target; + target.chooseCard('诏兵:交给'+get.translation(player)+'一张【杀】,或失去1点体力',(card)=>{ + return get.name(card)=='sha'; + }).set('ai',card=>{ + if(_status.event.goon) return 0; + return 6-get.value(card); + }).set('goon',get.effect(target,{name:'losehp'},target,target)>=0); + 'step 3' + if(result.bool) target.give(result.cards,player,true); + else target.loseHp(); + if(targets.length) event.goto(2); + }, + ai:{ + expose:0.2 + } + }, + jsrgzhuhuan:{ + audio:'mouzhu', + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + var hs=player.getCards('h','sha'); + if(!hs.length) return false; + for(var i of hs){ + if(!lib.filter.cardDiscardable(i,player,'jsrgzhuhuan')) return false; + } + return true; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgzhuhuan'),lib.filter.notMe).set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgzhuhuan',target); + var hs=player.getCards('h','sha'); + event.num=hs.length; + player.discard(hs); + } + else event.finish(); + 'step 2' + target.chooseToDiscard(get.translation(player)+'对你发动了【诛宦】','弃置'+get.cnNumber(num)+'张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸'+get.cnNumber(num)+'张牌').set('ai',card=>{ + if(_status.event.goon) return 0; + return 5.5-get.value(card); + }).set('goon',target.hp<=2||get.attitude(target,player)>=0||player.isHealthy()); + 'step 3' + if(result.bool){ + target.loseHp(); + } + else{ + player.draw(num); + player.recover(); + } + }, + ai:{ + expose:0.2 + } + }, + jsrgyanhuo:{ + inherit:'spyanhuo', + forced:true, + }, + //孙坚 + jsrgpingtao:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:lib.filter.notMe, + content:function(){ + 'step 0' + var att=get.attitude(target,player); + target.chooseCard(get.translation(player)+'对你发动了【平讨】','交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】','he').set('ai',card=>{ + if(_status.event.give){ + if(card.name=='sha'||card.name=='tao'||card.name=='jiu') return 0; + return 8-get.value(card); + } + if(_status.event.att<0&&card.name=='sha') return -1; + return 4-get.value(card); + }).set('give',(att>=0||target.hp==1&&target.countCards('hs','shan')<=1)&&get.effect(target,{name:'sha'},player,target)<0).set('att',att); + 'step 1' + if(result.bool){ + target.give(result.cards,player); + player.addTempSkill('jsrgpingtao_sha'); + player.addMark('jsrgpingtao_sha',1,false); + } + else if(player.canUse('sha',target,false)){ + player.useCard({name:'sha',isCard:true},target,false); + } + }, + ai:{ + expose:0.15, + order:5, + result:{target:-1} + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + marktext:'讨', + intro:{ + content:'本回合使用【杀】的次数上限+#', + }, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('jsrgpingtao_sha'); + }, + } + } + } + }, + jsrgjuelie:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.card&&event.card.name=='sha'&&event.getParent().type=='card'&&(player.isMinHandcard()||player.isMinHp()); + }, + forced:true, + locked:false, + group:'jsrgjuelie_discard', + content:function(){ + trigger.num++; + }, + shaRelated:true, + ai:{ + unequip_ai:true, + skillTagFilter:function(player,tag,arg){ + if(!arg||!arg.name||arg.name!='sha') return false; + if(!arg.target) return false; + var card=arg.target.getEquip(2); + return card&&get.value(card)>0&&player.hasCard(cardx=>{ + return lib.filter.cardDiscardable(cardx,player,'jsrgjuelie_discard')&&get.value(cardx)<5; + }); + }, + }, + subSkill:{ + discard:{ + audio:'jsrgjuelie', + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + return player.countCards('he')&&event.card.name=='sha'; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌',[1,Infinity],'he').set('ai',card=>{ + if(ui.selected.cards.length>=_status.event.max) return 0; + if(_status.event.goon) return 4.5-get.value(card); + return 0; + }).set('max',trigger.target.countDiscardableCards(player,'he')).set('goon',get.attitude(player,trigger.target)<0).set('logSkill',['jsrgjuelie_discard',trigger.target]); + 'step 1' + if(result.bool){ + var num=result.cards.length; + if(trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard('平讨:弃置'+get.translation(trigger.target)+get.cnNumber(num)+'张牌',num,'he',trigger.target,true); + } + } + } + } + }, + //皇甫嵩 + jsrgguanhuo:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + return event.card.storage&&event.card.storage.jsrgguanhuo&&!game.hasPlayer2(current=>{ + return current.hasHistory('damage',evt=>evt.card==event.card); + }); + }, + forced:true, + locked:false, + group:'jsrgguanhuo_viewas', + content:function(){ + 'step 0' + var count=player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length; + if(count==1){ + player.addTempSkill('jsrgguanhuo_ex','phaseUseAfter'); + player.addMark('jsrgguanhuo_ex',1,false); + trigger.targets.forEach(i=>i.removeSkill('huogong2')); + } + else{ + player.removeSkill('jsrgguanhuo'); + game.log(player,'失去了技能','#g【观火】'); + } + }, + ai:{ + effect:{ + player:function(card,player){ + if(_status.event.getParent().skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length==1) return 'zeroplayertarget'; + if(_status.event.type=='phase'&&_status.event.skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length>1&&player.countCards('h')<=3) return [0,0]; + } + } + }, + subSkill:{ + viewas:{ + audio:'jsrgguanhuo', + enable:'phaseUse', + viewAs:{ + name:'huogong', + isCard:true, + storage:{ + jsrgguanhuo:true + } + }, + filterCard:()=>false, + selectCard:-1, + prompt:'视为使用一张【火攻】', + ai:{ + order:function(item,player){ + return get.order({name:'huogong'})+0.01; + }, + } + }, + ex:{ + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.card&&event.card.name=='huogong'&&event.getParent().type=='card'; + }, + forced:true, + charlotte:true, + onremove:true, + intro:{content:'当你造成渠道为【火攻】的伤害时,此伤害+#'}, + content:function(){ + trigger.num+=player.countMark('jsrgguanhuo_ex'); + } + } + } + }, + jsrgjuxia:{ + audio:2, + trigger:{target:'useCardToTargeted'}, + usable:1, + countSkill:function(player){ + return player.getSkills(null,false,false).filter(function(skill){ + var info=get.info(skill); + if(!info||info.charlotte) return false; + if(info.zhuSkill) return player.hasZhuSkill(skill); + return true; + }).length; + }, + filter:function(event,player){ + return event.player!=player&&lib.skill.jsrgjuxia.countSkill(event.player)>lib.skill.jsrgjuxia.countSkill(player); + }, + direct:true, + content:function(){ + 'step 0' + var goon=get.effect(player,trigger.card,trigger.player,trigger.player)<1; + if(goon&&!event.isMine()&&!event.isOnline()) game.delayx(); + trigger.player.chooseBool('是否对'+get.translation(player)+'发动【居下】?','令'+get.translation(trigger.card)+'对其无效,然后其摸两张牌').set('ai',()=>{ + return _status.event.goon; + }).set('goon',goon); + 'step 1' + if(result.bool){ + trigger.player.logSkill('jsrgjuxia',player); + trigger.excluded.add(player); + player.draw(2); + } + else player.storage.counttrigger.jsrgjuxia--; + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(lib.skill.jsrgjuxia.countSkill(target)>=lib.skill.jsrgjuxia.countSkill(player)) return; + if(card&&(card.cards||card.isCard)&&get.attitude(target,player)>0&&(!target.storage.counttrigger||!target.storage.counttrigger.jsrgjuxia)) return [0,0.5,0,0.5]; + }, + }, + } + }, + //许劭 + jsrgyingmen:{ + audio:2, + trigger:{ + global:'phaseBefore', + player:['enterGame','phaseBegin'], + }, + forced:true, + filter:function(event,player,name){ + if(player.getStorage('jsrgyingmen').length>=4) return false; + if(name=='phaseBefore') return game.phaseNumber==0; + return event.name!='phase'||event.player==player; + }, + update:function(player){ + var id=player.playerid; + var characters=player.getStorage('jsrgyingmen'); + var skillName='jsrgpingjian_'+id; + var skillsx=[],skillsx2=[]; + var map={}; + var skillsy=lib.skill[skillName]?lib.skill[skillName].group:[]; + for(var name of characters){ + var skills=lib.character[name][3].slice(); + skills=skills.filter(skill=>{ + var list=get.skillCategoriesOf(skill,player); + list.removeArray(['锁定技','Charlotte']); + if(list.length) return false; + var info=get.info(skill); + return info&&(!info.unique||info.gainable); + }); + game.expandSkills(skills); + for(var i=0;i{ + return lib.skill.jsrgyingmen.bannedList.contains(skill); + })) continue; + list.push(name); + _status.characterlist.remove(name); + if(list.length>=4-num) break; + } + if(list.length){ + player.markAuto('jsrgyingmen',list); + if(player.hasSkill('jsrgpingjian',null,false,false)) lib.skill.jsrgyingmen.update(player); + game.log(player,'将','#g'+get.translation(list),'置为','#y访客'); + game.broadcastAll(function(player,list){ + var cards=[]; + for(var i=0;i{ + return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; + })) return true; + } + return false; + }, + content:function(){ + 'step 0' + var current; + var skill=trigger.skill,name=trigger.event?trigger.event.name:''; + var visitors=player.getStorage('jsrgyingmen'); + for(var visitor of visitors){ + var skills=lib.character[visitor][3].slice(); + game.expandSkills(skills); + var info=get.info(skill); + if(info&&info.charlotte) continue; + if(skills.some(skillx=>{ + return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; + })){ + current=visitor; + break; + } + } + event.current=current; + player.chooseButton(['###评鉴:移去一名访客###
    若移去的访客为'+get.translation(current)+',则你摸一张牌
    ',[player.getStorage('jsrgyingmen'),'character']],true).set('ai',button=>{ + if(button.link==_status.event.toremove) return 1; + return Math.random(); + }).set('toremove',function(){ + var list=player.getStorage('jsrgyingmen'); + var rand=Math.random(); + if(rand<0.33) return list[0]; + if(rand<0.66) return current; + return list.randomGet(); + }()); + 'step 1' + if(result.bool){ + var visitor=result.links[0]; + game.log(player,'从','#y访客','中移去了','#g'+get.translation(visitor)); + player.popup(visitor); + player.unmarkAuto('jsrgyingmen',[visitor]); + _status.characterlist.add(visitor); + if(visitor==event.current) player.draw(); + lib.skill.jsrgyingmen.update(player); + } + }, + subSkill:{ + blocker:{ + init:function(player,skill){ + player.addSkillBlocker(skill); + }, + onremove:function(player,skill){ + player.removeSkillBlocker(skill); + }, + charlotte:true, + locked:true, + skillBlocker:function(skill,player){ + if(skill!='jsrgpingjian_'+player.playerid) return false; + if(player._jsrgpingjian_blockerChecking) return; + player._jsrgpingjian_blockerChecking=true; + var own=player.hasSkill('jsrgpingjian'); + delete player._jsrgpingjian_blockerChecking; + return !own; + } + }, + } + }, + //董白 + jsrgshichong:{ + audio:2, + zhuanhuanji:true, + trigger:{player:'useCardToPlayered'}, + direct:true, + filter:function(event,player){ + return event.target!=player&&event.targets.length==1&&event.target.isIn()&&event.target.countCards('h'); + }, + mark:true, + marktext:'☯', + intro:{ + content:function(storage,player){ + var str='转换技。当你使用牌指定其他角色为唯一目标后,'; + if(storage) return str+'目标角色可以交给你一张手牌。'; + return str+'你可以获得目标角色一张手牌。'; + }, + }, + content:function(){ + 'step 0' + if(!player.storage.jsrgshichong){ + player.chooseBool(get.prompt('jsrgshichong',trigger.target),'你可以获得该角色的一张手牌').set('ai',()=>{ + return _status.event.bool; + }).set('bool',get.attitude(player,trigger.target)<=0); + } + else{ + trigger.target.chooseCard('是否发动'+get.translation(player)+'的【恃宠】?','你可以选择一张手牌,并交给该角色').set('ai',card=>{ + if(_status.event.goon) return 5-get.value(card); + return 0-get.value(card); + }).set('goon',get.attitude(trigger.target,player)>2); + } + 'step 1' + if(result.bool){ + if(!player.storage.jsrgshichong){ + player.logSkill('jsrgshichong',trigger.target); + player.gainPlayerCard(trigger.target,'h',true); + } + else{ + trigger.target.logSkill('jsrgshichong',player); + trigger.target.give(result.cards,player); + } + player.changeZhuanhuanji('jsrgshichong'); + } + } + }, + jsrglianzhu:{ + audio:2, + enable:'phaseUse', + usable:1, + filterCard:{color:'black'}, + position:'h', + filterTarget:lib.filter.notMe, + lose:false, + discard:false, + delay:false, + content:function(){ + 'step 0' + player.showCards(cards,get.translation(player)+'发动了【连诛】'); + 'step 1' + player.give(cards,target); + 'step 2' + event.targets=game.filterPlayer(current=>{ + return current.group==target.group&¤t!=player; + }).sortBySeat(); + game.delayx(); + 'step 3' + var target=targets.shift(); + if(player.canUse('guohe',target)){ + player.useCard({name:'guohe',isCard:true},target); + } + if(targets.length) event.redo(); + }, + ai:{ + order:4, + result:{ + target:function(player,target){ + var targets=game.filterPlayer(current=>{ + return current.group==target.group&¤t!=player; + }); + var eff=targets.reduce((p,c)=>{ + return p+get.effect(c,{name:'guohe'},player,player); + }) + if(ui.selected.cards.length) eff+=get.value(ui.selected.cards[0],target); + return eff; + } + } + } + }, + //桥玄 + jsrgjuezhi:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + if(_status.currentPhase!=player||player.hasSkill('jsrgjuezhi_used',null,null,false)) return false; + return event.card&&event.getParent().type=='card'&&lib.skill.jsrgjuezhi.getNum(event.player,player)>0; + }, + forced:true, + locked:false, + getNum:function(target,player){ + return target.countCards(card=>{ + var subtype=get.subtypes(card); + for(var i of subtype){ + if(player.hasDisabledSlot(i)) return true; + } + return false; + }); + }, + group:'jsrgjuezhi_disable', + content:function(){ + player.addTempSkill('jsrgjuezhi_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); + trigger.num+=lib.skill.jsrgjuezhi.getNum(trigger.player,player); + }, + subSkill:{ + disable:{ + audio:'jsrgjuezhi', + trigger:{ + player:'loseAfter', + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + direct:true, + filter:function(event,player){ + var evt=event.getl(player); + return evt&&evt.es&&evt.es.length>0; + }, + content:function(){ + 'step 0' + event.cards=trigger.getl(player).es; + 'step 1' + var card=cards.shift(),subtypes=get.subtypes(card).filter(slot=>player.hasEnabledSlot(slot)); + event.subtypes=subtypes; + if(subtypes.length>0){ + player.chooseBool(get.prompt('jsrgjuezhi_disable'),'废除你的'+get.translation(subtypes)+'栏').set('ai',()=>1); + } + else event._result={bool:false}; + 'step 2' + if(result.bool){ + player.logSkill('jsrgjuezhi_disable'); + player.disableEquip(event.subtypes); + } + if(cards.length>0) event.goto(1); + }, + }, + used:{charlotte:true} + } + }, + jsrgjizhao:{ + audio:2, + trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgjizhao')).set('ai',target=>{ + var player=_status.event.player; + if(player.countCards('j')) return player==target?10:0.1; + return 6-get.attitude(player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgjizhao',target); + target.chooseToUse({ + filterCard:function(card,player,event){ + if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; + return lib.filter.filterCard.apply(this,arguments); + }, + prompt:'急召:使用一张手牌,否则'+get.translation(player)+'可以移动你区域里的一张牌', + addCount:false, + goon:target!=player||!player.countCards('j'), + ai1:function(card){ + if(_status.event.goon) return get.order(card); + return 0; + } + }); + } + 'step 2' + if(result.bool){event.finish();return;} + var targets=game.filterPlayer(current=>{ + if(current==target) return false; + var hs=target.getCards('h'); + if(hs.length) return true; + var js=target.getCards('j'); + for(var i=0;i0) return att; + return 0; + } + return -att*att2; + }); + next.set('targetprompt','移动目标'); + next.set('prompt','急召:是否移动'+get.translation(target)+'的一张牌?'); + } + else event.finish(); + 'step 3' + if(result.bool){ + var target2=result.targets[0]; + event.targets=[target,target2]; + player.line2(event.targets,'green'); + } + else{ + event.finish(); + } + 'step 4' + game.delay(); + 'step 5' + if(targets.length==2){ + player.choosePlayerCard('hej',true,function(button){ + var player=_status.event.player; + var targets0=_status.event.targets0; + var targets1=_status.event.targets1; + if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ + if(get.position(button.link)=='j') return 12; + if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; + return 0; + } + else{ + if(get.position(button.link)=='j') return -10; + if(get.position(button.link)=='h') return 10; + return get.value(button.link)*get.effect(targets1,button.link,player,targets1); + } + },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ + var targets1=_status.event.targets1; + if(get.position(button.link)=='h'){ + return true; + } + else if(get.position(button.link)=='j'){ + return targets1.canAddJudge(button.link); + } + else{ + return targets1.canEquip(button.link); + } + }); + } + else{ + event.finish(); + } + 'step 6' + if(result.bool&&result.links.length){ + var link=result.links[0]; + if(get.position(link)=='h'){ + event.targets[1].gain(link); + } + else if(get.position(link)=='e'){ + event.targets[1].equip(link); + } + else if(link.viewAs){ + event.targets[1].addJudge({name:link.viewAs},[link]); + } + else{ + event.targets[1].addJudge(link); + } + event.targets[0].$give(link,event.targets[1],false); + game.log(event.targets[0],'的',get.position(link)=='h'?'一张手牌':link,'被移动给了',event.targets[1]); + game.delay(); + } + }, + ai:{ + effect:{ + target:function(card,player,target,current){ + if(get.type(card)=='delay'&¤t<0){ + if(target.countCards('j')) return; + return 'zerotarget'; + } + }, + }, + } + }, + //杨彪 + jsrgzhaohan:{ + audio:'zhaohan', + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + if(game.shuffleNumber==0) return player.isDamaged(); + return true; + }, + content:function(){ + player[game.shuffleNumber>0?'loseHp':'recover'](); + } + }, + jsrgrangjie:{ + audio:'rangjie', + trigger:{player:'damageEnd'}, + filter:function(event,player){ + return player.canMoveCard(); + }, + check:function(event,player){ + return player.canMoveCard(true); + }, + content:function(){ + 'step 0' + event.num=trigger.num; + 'step 1' + event.num--; + if(player.canMoveCard()) player.moveCard(true); + 'step 2' + if(result.bool){ + var card=result.card; + var suit=get.suit(card,false); + var cards=Array.from(ui.discardPile.childNodes); + var gains=[]; + var history=game.getGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose') return evt.position==ui.discardPile; + return evt.name=='cardsDiscard'; + }); + for(var i=history.length-1;i>=0;i--){ + var evt=history[i]; + var cards2=evt.cards.filter(card=>{ + return cards.contains(card)&&get.suit(card,false)==suit; + }); + if(cards2.length){ + gains.addArray(cards2); + cards.removeArray(cards2); + } + if(!cards.length) break; + } + if(gains.length){ + player.chooseButton(['让节:是否获得一张'+get.translation(suit)+'牌?',gains]).set('ai',get.buttonValue); + } + else event._result={bool:false}; + } + 'step 3' + if(result.bool){ + player.gain(result.links,'gain2'); + } + 'step 4' + if(event.num>0&&player.hasSkill('jsrgrangjie')){ + player.chooseBool(get.prompt2('jsrgrangjie')).set('ai',()=>_status.event.bool).set('bool',lib.skill.jsrgrangjie.check(trigger,player)); + } + else event.finish(); + 'step 5' + if(result.bool){ + player.logSkill('jsrgrangjie'); + event.goto(1); + } + }, + ai:{ + maixie:true, + maixie_hp:true, + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + if(target._jsrgrangjie_aiChecking) return; + target._jsrgrangjie_aiChecking=true; + var moveCard=target.canMoveCard(true); + delete target._jsrgrangjie_aiChecking; + if(!moveCard||!target.hasFriend()) return; + var num=1; + if(get.attitude(player,target)>0){ + if(player.needsToDiscard()){ + num=0.5; + } + else{ + num=0.3; + } + } + if(target.hp>=4) return [1,num*2]; + if(target.hp==3) return [1,num*1.5]; + if(target.hp==2) return [1,num*0.5]; + } + }, + }, + }, + }, + jsrgyizheng:{ + audio:'yizheng', + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(function(current){ + return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + }); + }, + filterTarget:function(card,player,current){ + return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + }, + content:function(){ + 'step 0' + player.chooseToCompare(target); + 'step 1' + if(result.bool){ + target.skip('phaseDraw'); + target.addTempSkill('yizheng2',{player:'phaseDrawSkipped'}); + event.finish(); + } + else{ + target.chooseControl('1','2','cancel').set('prompt','是否对'+get.translation(player)+'造成至多2点伤害?').set('ai',()=>{ + return _status.event.choice; + }).set('choice',get.damageEffect(player,target,target)>0?(get.attitude(target,player)>0?0:1):'cancel2'); + } + 'step 2' + if(result.control!='cancel2'){ + var num=result.index+1; + target.line(player); + player.damage(target,num); + } + }, + ai:{ + order:1, + result:{ + target:function(player,target){ + if(target.skipList.contains('phaseDraw')||target.hasSkill('pingkou')) return 0; + var hs=player.getCards('h').sort(function(a,b){ + return b.number-a.number; + }); + var ts=target.getCards('h').sort(function(a,b){ + return b.number-a.number; + }); + if(!hs.length||!ts.length) return 0; + if(hs[0].number>ts[0].number) return -1; + return 0; + }, + }, + }, + }, + //孔融 + jsrglirang:{ + audio:'splirang', + trigger:{global:'phaseDrawBegin'}, + direct:true, + filter:function(event,player){ + return event.player!=player&&!player.hasSkill('jsrglirang_used')&&player.countCards('he')>1; + }, + content:function(){ + 'step 0' + player.chooseCard(get.prompt('jsrglirang',trigger.player),'你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。',2,'he').set('ai',card=>{ + if(!_status.event.give) return 0; + var player=_status.event.player,target=_status.event.target; + return target.getUseValue(card)-player.getUseValue(card)+0.5; + }).set('give',get.attitude(player,trigger.player)>0).set('target',trigger.player); + 'step 1' + if(result.bool){ + player.logSkill('jsrglirang',trigger.player); + var cards=result.cards; + player.give(cards,trigger.player); + player.addTempSkill('jsrglirang_used','roundStart'); + player.addTempSkill('jsrglirang_given'); + player.markAuto('jsrglirang_used',[trigger.player]); + } + }, + subSkill:{ + used:{ + charlotte:true, + onremove:true, + intro:{content:'本轮〖礼让〗目标:$'}, + }, + given:{ + audio:'splirang', + trigger:{global:'phaseDiscardEnd'}, + filter:function(event,player){ + return event.player.hasHistory('lose',evt=>{ + return evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.cards2.filterInD('d').length>0; + }); + }, + charlotte:true, + prompt2:function(event,player){ + var cards=[]; + event.player.getHistory('lose',evt=>{ + if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2.filterInD('d')); + }); + return '获得'+get.translation(cards); + }, + content:function(){ + var cards=[]; + trigger.player.getHistory('lose',evt=>{ + if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2.filterInD('d')); + }); + player.gain(cards,'gain2'); + } + } + } + }, + jsrgzhengyi:{ + audio:2, + trigger:{player:'damageBegin4'}, + filter:function(event,player){ + var list=player.getStorage('jsrglirang_used'); + if(!list.length) return false; + return !player.getHistory('damage').length&&list[0].isIn(); + }, + direct:true, + content:function(){ + 'step 0' + var target=player.getStorage('jsrglirang_used')[0]; + event.target=target; + target.chooseBool('是否对'+get.translation(player)+'发动【争义】?','将此'+(trigger.source?'来源为'+get.translation(trigger.source):'无来源')+'的'+trigger.num+'点伤害转移给你').set('ai',()=>{ + return _status.event.bool; + }).set('bool',get.damageEffect(player,trigger.source,target)>get.damageEffect(target,trigger.source,target)); + 'step 1' + if(result.bool){ + target.logSkill('jsrgzhengyi',player); + trigger.cancel(); + target.damage(trigger.source,trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); + } + } + }, + //朱儁 + jsrgfendi:{ + audio:2, + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + return event.targets.length==1&&event.card.name=='sha'&&event.targets[0].countCards('h')>0; + }, + usable:1, + logTarget:'target', + content:function(){ + 'step 0' + var target=trigger.target; + event.target=target; + player.choosePlayerCard(target,'h',true,[1,Infinity],'分敌:展示'+get.translation(target)+'的任意张手牌').set('ai',button=>{ + if(_status.event.all) return 1; + if(ui.selected.buttons.length) return 0; + return Math.random(); + }).set('all',!target.mayHaveShan()&&Math.random()<0.75).set('forceAuto',true); + 'step 1' + if(result.bool){ + var cards=result.cards; + target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【分敌】'); + target.addGaintag(cards,'jsrgfendi_tag'); + target.addTempSkill('jsrgfendi_blocker'); + player.addTempSkill('jsrgfendi_gain'); + if(!trigger.card.storage) trigger.card.storage={}; + trigger.card.storage.jsrgfendi=true; + player.storage.jsrgfendi_gain=target; + } + else player.storage.counttrigger.jsrgfendi--; + }, + subSkill:{ + blocker:{ + trigger:{ + player:['damageBefore','damageCancelled','damageZero'], + target:['shaMiss','useCardToExcluded','useCardToEnd'], + global:['useCardEnd'], + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + player.removeSkill('jsrgfendi_blocker'); + }, + mod:{ + cardEnabled:function(card,player){ + if(card.cards){ + for(var i of card.cards){ + if(!i.hasGaintag('jsrgfendi_tag')) return false; + } + } + else if(get.itemtype(card)=='card'){ + if(!card.hasGaintag('jsrgfendi_tag')) return false; + } + }, + cardRespondable:function(card,player){ + return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + }, + cardSavable:function(card,player){ + return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + }, + }, + }, + gain:{ + trigger:{global:'damageSource'}, + charlotte:true, + forced:true, + direct:true, + onremove:true, + filter:function(event,player){ + var target=player.storage.jsrgfendi_gain; + return event.card&&event.card.storage&&event.card.storage.jsrgfendi&&target&&target.isIn()&&target.hasCard(card=>{ + return card.hasGaintag('jsrgfendi_tag'); + },'h'); + }, + content:function(){ + player.logSkill('jsrgfendi_gain',player.storage.jsrgfendi_gain); + player.gain(player.storage.jsrgfendi_gain.getCards('h',card=>{ + return card.hasGaintag('jsrgfendi_tag'); + }),'give'); + } + } + } + }, + jsrgjuxiang:{ + audio:2, + trigger:{ + player:'gainAfter', + global:'loseAsyncAfter', + }, + filter:function(event,player){ + var evt=event.getParent('phaseDraw'); + if(evt&&evt.name=='phaseDraw') return false; + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + if(!cards.length) return false; + for(var card of cards){ + if(!lib.filter.cardDiscardable(card,player,'jsrgjuxiang')) return false; + } + return true; + }, + check:function(event,player){ + var target=_status.currentPhase; + if(!target||get.attitude(player,target)<=0) return false; + var evt=event.getParent('phaseDiscard'),evt2=event.getParent('phaseJieshu'); + if(evt&&evt.name=='phaseDiscard'||evt2&&evt.name=='phaseJieshu') return false; + if(target.getCardUsable({name:'sha'})>=target.countCards('hs','sha')) return false; + if(!target.hasValueTarget({name:'sha'})) return false; + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + var val=0; + for(var i of cards) val+=get.value(i); + if(val<10) return true; + return false; + }, + prompt2:function(event,player){ + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + var target=_status.currentPhase; + var str='弃置'+get.translation(cards); + if(target&&target.isIn()){ + var list=[]; + for(var card of cards){ + list.add(get.suit(card,player)); + } + var num=list.length; + str+=',然后令'+get.translation(target)+'于此回合额定的出牌阶段内使用【杀】的次数上限+'+num; + } + return str; + }, + content:function(){ + 'step 0' + var hs=player.getCards('h'); + var cards=trigger.getg(player).filter(i=>hs.contains(i)); + var list=[]; + for(var card of cards){ + list.add(get.suit(card,player)); + } + event.num=list.length; + player.discard(cards); + 'step 1' + var target=_status.currentPhase; + if(target&&target.isIn()){ + target.addTempSkill('jsrgjuxiang_sha'); + target.addMark('jsrgjuxiang_sha',num,false); + var evt=trigger.getParent('phaseUse'); + if(evt&&evt.name=='phaseUse'&&!evt.skill){ + evt.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); + evt.player.addMark('jsrgjuxiang_buff',num,false); + } + } + }, + subSkill:{ + sha:{ + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + return !event.skill; + }, + silent:true, + charlotte:true, + forced:true, + onremove:true, + content:function(){ + trigger.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); + trigger.player.addMark('jsrgjuxiang_buff',player.countMark('jsrgjuxiang_sha'),false); + } + }, + buff:{ + charlotte:true, + intro:{content:'使用【杀】的次数上限+#'}, + onremove:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('jsrgjuxiang_buff'); + }, + } + } + } + }, + //刘备 + jsrgjishan:{ + audio:2, + trigger:{global:'damageBegin4'}, + usable:1, + filter:function(event,player){ + return player.hp>0; + }, + logTarget:'player', + onremove:true, + prompt2:'失去1点体力并防止此伤害,然后你与其各摸一张牌', + check:function(event,player){ + return get.damageEffect(event.player,event.source,player,event.nature)*Math.sqrt(event.num)<=get.effect(player,{name:'losehp'},player,player); + }, + group:'jsrgjishan_recover', + content:function(){ + 'step 0' + trigger.cancel(); + player.loseHp(); + player.markAuto('jsrgjishan',[trigger.player]); + 'step 1' + if(player.isIn()&&trigger.player.isIn()){ + var targets=[player,trigger.player]; + targets.sortBySeat(_status.currentPhase); + targets[0].draw('nodelay'); + targets[1].draw(); + } + }, + intro:{content:'已帮助$抵挡过伤害'}, + ai:{expose:0.2}, + subSkill:{ + recover:{ + audio:'jsrgjishan', + trigger:{source:'damageSource'}, + filter:function(event,player){ + return game.hasPlayer(current=>{ + return current.isMinHp()&&player.getStorage('jsrgjishan').contains(current); + }); + }, + usable:1, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgjishan_recover'),'令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力',(card,player,target)=>{ + return target.isMinHp()&&player.getStorage('jsrgjishan').contains(target); + }).set('ai',target=>{ + return get.recoverEffect(target,_status.event.player,_status.event.player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgjishan_recover',target); + target.recover(); + } + else player.storage.counttrigger.jsrgjishan_recover--; + } + } + } + }, + jsrgzhenqiao:{ + audio:2, + trigger:{player:'useCardToTargeted'}, + forced:true, + shaRelated:true, + filter:function(event,player){ + return event.isFirstTarget&&event.card.name=='sha'&&player.hasEmptySlot(1); + }, + content:function(){ + // trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); + // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); + trigger.getParent().effectCount++; + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(player._jsrgzhenqiao_aiChecking) return; + if(target==player&&get.subtype(card)=='equip1'&&!player.getEquip(1)){ + player._jsrgzhenqiao_aiChecking=true; + var eff=get.effect(target,card,player,player); + delete player._jsrgzhenqiao_aiChecking; + if(eff<3) return 'zerotarget'; + } + } + } + }, + mod:{ + attackRange:function(player,num){ + return num+1; + }, + } + }, + //王允 + jsrgshelun:{ + audio:2, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(current=>player.inRange(current)); + }, + filterTarget:function(card,player,target){ + return player.inRange(target); + }, + content:function(){ + var num=player.countCards('h'); + var targets=game.filterPlayer(current=>{ + return current.countCards('h')<=num&¤t!=target; + }); + player.chooseToDebate(targets).set('callback',function(){ + var result=event.debateResult; + if(result.bool&&result.opinion){ + var opinion=result.opinion; + var target=event.getParent(2).target; + if(opinion=='red') player.discardPlayerCard(target,'he',true); + else target.damage(); + } + }).set('ai',card=>{ + var player=_status.event.player; + var color=(player==_status.event.source||get.damageEffect(_status.event.getParent(2).target,player,player)>0)?'black':'red'; + var val=5-get.value(card); + if(get.color(card)==color) val+=10; + return val; + }).set('aiCard',target=>{ + var color=(target==_status.event.source||get.damageEffect(_status.event.getParent(2).target,target,target)>0)?'black':'red'; + var hs=target.getCards('h',{color:color}); + if(!hs.length) hs=target.getCards('h'); + return {bool:true,cards:[hs.randomGet()]}; + }).set('target',target); + }, + ai:{ + order:8, + expose:0.2, + result:{target:-1}, + } + }, + jsrgfayi:{ + audio:2, + trigger:{global:'chooseToDebateAfter'}, + filter:function(event,player){ + if(!event.targets.contains(player)) return false; + if(event.red.map(i=>i[0]).contains(player)) return event.black.length; + if(event.black.map(i=>i[0]).contains(player)) return event.red.length; + return false; + }, + direct:true, + content:function(){ + 'step 0' + var targets=[]; + if(trigger.red.map(i=>i[0]).contains(player)) targets=trigger.black; + if(trigger.black.map(i=>i[0]).contains(player)) targets=trigger.red; + player.chooseTarget(get.prompt('jsrgfayi'),'对一名与你意见不同的角色造成1点伤害',(card,player,target)=>{ + return _status.event.targets.contains(target); + }).set('targets',targets.map(i=>i[0])).set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgfayi',target); + target.damage(); + } + } + }, + jsrgtushe:{ + audio:'xinfu_tushe', + trigger:{ + player:'useCardToPlayered', + }, + filter:function (event,player){ + if(get.type(event.card)=='equip') return false; + if(event.getParent().triggeredTargets3.length>1) return false; + return event.targets.length>0; + }, + check:function(event,player){ + return !player.countCards('h',{type:'basic'}); + }, + content:function (){ + 'step 0' + player.showHandcards(); + 'step 1' + if(player.countCards('h',{type:'basic'})) event.finish(); + else player.chooseBool('图射:是否摸'+get.cnNumber(trigger.targets.length)+'张牌?').set('ai',()=>1); + 'step 2' + if(result.bool){ + player.draw(trigger.targets.length); + } + }, + ai:{ + presha:true, + pretao:true, + threaten:1.8, + }, + }, + jsrgtongjue:{ + audio:2, + enable:'phaseUse', + usable:1, + zhuSkill:true, + filter:function(event,player){ + return player.hasZhuSkill('jsrgtongjue')&&game.hasPlayer(current=>current!=player&¤t.group=='qun'); + }, + filterCard:true, + selectCard:[1,Infinity], + filterTarget:function(card,player,target){ + return target!=player&&target.group=='qun'; + }, + selectTarget:[1,Infinity], + filterOk:function(){ + return ui.selected.cards.length==ui.selected.targets.length; + }, + check:function(card){ + var player=_status.event.player; + if(player.hasCard(card=>{ + return player.hasValueTarget(card); + },'hs')){ + return 3-player.getUseValue(card); + } + return 3-get.value(card); + }, + multiline:true, + multitarget:true, + delay:false, + discard:false, + lose:false, + content:function(){ + 'step 0' + var list=[]; + for(var i=0;icurrent.getSeatNum()==1); + return event.player==zhu; + }, + locked:false, + group:'jsrgzhenglve_damage', + prompt2:function(event,player){ + var num=Math.min(event.player.getHistory('sourceDamage').length>0?1:2,game.countPlayer(current=>{ + return !current.hasMark('jsrgzhenglve_mark'); + })); + if(num==0) return '你可以摸一张牌'; + return '你可以摸一张牌并令'+get.cnNumber(num)+'名角色获得“猎”标记'; + }, + content:function(){ + 'step 0' + player.draw(); + 'step 1' + var damaged=trigger.player.getHistory('sourceDamage').length>0; + var num=damaged?1:2; + var targets=game.filterPlayer(current=>{ + return !current.hasMark('jsrgzhenglve_mark'); + }); + if(!targets.length) event.finish(); + else if(targets.length<=num) event._result={bool:true,targets:targets}; + else player.chooseTarget('令'+get.cnNumber(num)+'名角色获得“猎”标记',true,num,(card,player,target)=>{ + return !target.hasMark('jsrgzhenglve_mark'); + }).set('ai',target=>{ + var att=get.attitude(_status.event.player,target); + return 100-att; + }); + 'step 2' + if(result.bool){ + var targets=result.targets; + player.line(targets); + targets.forEach(i=>i.addMark('jsrgzhenglve_mark',1)); + } + }, + mod:{ + cardUsableTarget:function(card,player,target){ + if(target.hasMark('jsrgzhenglve_mark')) return true; + }, + targetInRange:function(card,player,target){ + if(target.hasMark('jsrgzhenglve_mark')) return true; + }, + }, + subSkill:{ + damage:{ + audio:'jsrgzhenglve', + trigger:{source:'damageSource'}, + usable:1, + filter:function(event,player){ + return event.player.hasMark('jsrgzhenglve_mark'); + }, + prompt2:function(event,player){ + var cards=event.cards||[]; + return '摸一张牌'+(cards.filterInD().length?'并获得'+get.translation(event.cards.filterInD()):''); + }, + content:function(){ + 'step 0' + player.draw(); + var cards=trigger.cards; + if(cards&&cards.filterInD().length){ + player.gain(cards.filterInD(),'gain2'); + } + } + }, + mark:{ + marktext:'猎', + intro:{ + name:'猎(政略)', + name2:'猎', + markcount:()=>0, + content:'已拥有“猎”标记', + } + } + } + }, + jsrghuilie:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + juexingji:true, + forced:true, + skillAnimation:true, + animationColor:'thunder', + derivation:['jsrgpingrong','feiying'], + filter:function(event,player){ + return game.countPlayer(current=>current.hasMark('jsrgzhenglve_mark'))>2; + }, + content:function(){ + 'step 0' + player.awakenSkill('jsrghuilie'); + player.loseMaxHp(); + 'step 1' + player.addSkillLog('jsrgpingrong'); + player.addSkillLog('feiying'); + } + }, + jsrgpingrong:{ + audio:2, + trigger:{global:'phaseEnd'}, + filter:function(event,player){ + return !player.hasSkill('jsrgpingrong_used')&&game.hasPlayer(current=>current.hasMark('jsrgzhenglve_mark')); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrghuilie'),'移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。',(card,player,target)=>{ + return target.hasMark('jsrgzhenglve_mark'); + }).set('ai',target=>{ + return get.attitude(_status.event.player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgpingrong',target); + player.addTempSkill('jsrgpingrong_used','roundStart'); + target.removeMark('jsrgzhenglve_mark',target.countMark('jsrgzhenglve_mark')); + player.insertPhase(); + player.addSkill('jsrgpingrong_check'); + } + }, + subSkill:{ + used:{charlotte:true}, + check:{ + audio:'jsrgpingrong', + trigger:{player:'phaseAfter'}, + charlotte:true, + forced:true, + filter:function(event,player){ + return event.skill=='jsrgpingrong'&&!player.getHistory('sourceDamage').length; + }, + content:function(){ + player.loseHp(); + } + } + } + }, + //南华老仙 + jsrgshoushu:{ + audio:2, + forced:true, + trigger:{global:'roundStart'}, + filter:function(event,player){ + return !game.hasPlayer(function(current){ + return current.countCards('hejsx','taipingyaoshu'); + })&&!Array.from(ui.cardPile.childNodes).concat(Array.from(ui.discardPile.childNodes)) + .concat(Array.from(ui.ordering.childNodes)).map(i=>i.name).contains('taipingyaoshu'); + }, + direct:true, + group:'jsrgshoushu_destroy', + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgshoushu'),'将【太平要术】置入一名角色的装备区',(card,player,target)=>{ + var card={name:'taipingyaoshu'}; + return target.canEquip(card,true); + }).set('ai',target=>{ + return target.getUseValue({name:'taipingyaoshu'})*get.attitude(_status.event.player,target); + }) + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgshoushu',target); + if(!lib.inpile.contains('taipingyaoshu')){ + lib.inpile.push('taipingyaoshu'); + } + event.card=game.createCard2('taipingyaoshu','heart',3); + } + else event.finish(); + 'step 2' + if(card) target.equip(card); + }, + subSkill:{ + destroy:{ + audio:'jsrgshoushu', + trigger:{ + global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + }, + forced:true, + filter:function(event,player){ + return game.hasPlayer(current=>{ + var evt=event.getl(current); + if(evt&&evt.es) return evt.es.some(i=>i.name=='taipingyaoshu'); + return false; + }); + }, + content:function(){ + var cards=[]; + game.countPlayer(current=>{ + var evt=trigger.getl(current); + if(evt&&evt.es) return cards.addArray(evt.es.filter(i=>i.name=='taipingyaoshu')); + }); + game.cardsGotoSpecial(cards); + game.log(cards,'被销毁了'); + } + } + } + }, + jsrgxundao:{ + audio:2, + trigger:{player:'judge'}, + filter:function(event,player){ + return game.hasPlayer(current=>current.countCards('he')); + }, + direct:true, + content:function(){ + 'step 0' + var prompt2=get.translation(player)+'(你)的'+(trigger.judgestr||'')+'判定为'+ + get.translation(player.judging[0])+','+'是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?'; + player.chooseTarget(get.prompt('jsrgxundao'),prompt2,[1,2],(card,player,target)=>{ + return target.countCards('he'); + }).set('ai',target=>{ + var player=_status.event.player; + if(!_status.event.todiscard) return 0; + if(_status.event.todiscard!='all'){ + if(target==_status.event.todiscard) return 100; + } + return get.effect(target,{name:'guohe_copy2'},player,player)/2; + }).set('todiscard',function(){ + if(trigger.judgestr=='闪电'&&get.damageEffect(player,null,player,'thunder')>=0) return 'all'; + var friends=game.filterPlayer(i=>get.attitude(i,player)>0); + for(var friend of friends){ + var cardsx=friend.getCards('he',card=>trigger.judge(card)>0); + cardsx.sort((a,b)=>{ + return get.value(a)-get.value(b); + }); + if(cardsx.length){ + var card=cardsx[0]; + if(trigger.judge(player.judging[0])>=0){ + if(get.value(card)>4) return false; + } + return get.owner(card); + } + } + return 'all'; + }()) + 'step 1' + if(result.bool){ + var targets=result.targets; + targets.sortBySeat(_status.currentPhase); + event.targets=targets; + player.logSkill('jsrgxundao',targets); + event.cards=[]; + } + else event.finish(); + 'step 2' + var target=targets.shift(); + target.chooseToDiscard('寻道:请弃置一张牌'+(target==player?'':',可能被作为新判定牌'),'he',true).set('ai',target=>{ + var trigger=_status.event.getTrigger(); + var player=_status.event.player; + var judging=_status.event.judging; + var result=trigger.judge(card)-trigger.judge(judging); + var attitude=get.attitude(player,trigger.player); + if(attitude==0||result==0) return 0.1; + if(attitude>0){ + return result+0.01; + } + else{ + return 0.01-result; + } + }); + 'step 3' + if(result.bool){ + event.cards.addArray(result.cards); + } + if(targets.length) event.goto(2); + 'step 4' + var cards=event.cards.filterInD('d'); + if(cards.length){ + player.chooseButton(['寻道:选择一张作为新判定牌',cards],true).set('ai',button=>{ + return trigger.judge(button.link); + }); + } + else event.finish(); + 'step 5' + if(result.bool){ + var card=result.links[0]; + event.card=card; + game.cardsGotoOrdering(card).relatedEvent=trigger; + } + else event.finish(); + 'step 6' + if(player.judging[0].clone){ + game.broadcastAll(function(card,card2,player){ + if(card.clone){ + card.clone.classList.remove('thrownhighlight'); + } + var node=player.$throwordered(card2.copy(),true); + node.classList.add('thrownhighlight'); + ui.arena.classList.add('thrownhighlight'); + },player.judging[0],card,player); + game.addVideo('deletenode',player,get.cardsInfo([player.judging[0].clone])); + } + game.cardsDiscard(player.judging[0]); + player.judging[0]=card; + trigger.orderingCards.add(card); + game.log(player,'的判定牌改为',card); + game.delay(2); + }, + ai:{ + rejudge:true, + tag:{ + rejudge:1, + } + } + }, + jsrglinghua:{ + audio:2, + trigger:{ + player:['phaseZhunbeiBegin','phaseJieshuBegin'], + }, + prompt2:function(event,player){ + var zhunbei=event.name=='phaseZhunbei'; + return '进行目标为你'+(zhunbei?'':'且效果反转')+'的【闪电】判定。若你未因此受到伤害,你可以'+(zhunbei?'令一名角色回复1点体力':'对一名角色造成1点雷电伤害'); + }, + check:function(event,player){ + var e2=player.getEquip(2); + if(e2&&e2.name=='taipingyaoshu') return true; + if(event.name=='phaseZhunbei'&&game.hasPlayer(current=>{ + return get.recoverEffect(current,player,player)>=0; + })) return true; + if(event.name=='phaseJieshu'&&game.hasPlayer(current=>{ + return get.damageEffect(current,player,player,'thunder')>=0; + })&&player.hasSkillTag('rejudge')&&player.hasCard(card=>{ + return lib.card.shandian.judge(card)<0; + },'he')) return true; + return false; + }, + content:function(){ + 'step 0' + var judge=trigger.name=='phaseZhunbei'?lib.card.shandian.judge:function(card){ + if(get.suit(card)!='spade'||get.number(card)<=1||get.number(card)>=10) return -5; + return 1; + } + player.judge(judge,get.translation('shandian')).set('judge2',lib.card.shandian.judge2); + game.delayx(1.5); + 'step 1' + var name='shandian'; + if(event.cancelled&&!event.direct){ + if(lib.card[name].cancel){ + var next=game.createEvent(name+'Cancel'); + next.setContent(lib.card[name].cancel); + next.cards=[]; + next.card=get.autoViewAs({name:name}); + next.player=player; + } + } + else{ + var next=game.createEvent(name); + next.setContent(function(){ + if(result.bool==false){ + player.damage(3,'thunder','nosource'); + } + }); + next._result=result; + next.cards=[]; + next.card=get.autoViewAs({name:name}); + next.player=player; + } + 'step 2' + if(!player.hasHistory('damage',evt=>{ + return evt.card&&evt.card.name=='shandian'&&evt.getParent(2)==event; + })){ + if(trigger.name=='phaseZhunbei'){ + player.chooseTarget('灵化:是否令一名角色回复1点体力?').set('ai',target=>{ + var player=_status.event.player; + return get.recoverEffect(target,player,player); + }); + } + else{ + player.chooseTarget('灵化:是否对一名角色造成1点雷电伤害?').set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player,'thunder'); + }); + } + } + else event.finish(); + 'step 3' + if(result.bool){ + var target=result.targets[0]; + player.line(target); + if(trigger.name=='phaseZhunbei') target.recover(); + else target.damage('thunder'); + } + }, + ai:{ + threaten:2.8 + } + }, + }, + characterReplace:{}, + dynamicTranslate:{ + jsrgshichong:function(player){ + if(player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + }, + }, + translate:{ + //江山如故·起 + jsrg_liuhong:'起刘宏', + jsrg_liuhong_ab:'刘宏', + jsrgchaozheng:'朝争', + jsrgchaozheng_info:'准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。', + jsrgshenchong:'甚宠', + jsrgshenchong_info:'限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。', + jsrgjulian:'聚敛', + jsrgjulian_info:'主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。', + jsrgfeiyang:'飞扬', + jsrgfeiyang_info:'判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。', + jsrgbahu:'跋扈', + jsrgbahu_info:'锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。', + jsrg_hejin:'起何进', + jsrg_hejin_ab:'何进', + jsrgzhaobing:'诏兵', + jsrgzhaobing_info:'结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。', + jsrgzhuhuan:'诛宦', + jsrgzhuhuan_info:'准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。', + jsrgyanhuo:'延祸', + jsrgyanhuo_info:'锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。', + jsrg_sunjian:'起孙坚', + jsrg_sunjian_ab:'孙坚', + jsrgpingtao:'平讨', + jsrgpingtao_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。', + jsrgjuelie:'绝烈', + jsrgjuelie_info:'①当你造成渠道为【杀】的伤害时,若你的手牌数或体力值最小,此伤害+1。②当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌。', + jsrg_huangfusong:'起皇甫嵩', + jsrg_huangfusong_ab:'皇甫嵩', + jsrgguanhuo:'观火', + jsrgguanhuo_info:'①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。', + jsrgjuxia:'居下', + jsrgjuxia_info:'每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。', + jsrg_xushao:'起许劭', + jsrg_xushao_ab:'许劭', + jsrgyingmen:'盈门', + jsrgyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', + jsrgpingjian:'评鉴', + jsrgpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。', + jsrg_dongbai:'起董白', + jsrg_dongbai_ab:'董白', + jsrgshichong:'恃宠', + jsrgshichong_info:'转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。', + jsrglianzhu:'连诛', + jsrglianzhu_info:'出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。', + jsrg_qiaoxuan:'起桥玄', + jsrg_qiaoxuan_ab:'桥玄', + jsrgjuezhi:'绝质', + jsrgjuezhi_info:'①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。', + jsrgjizhao:'急召', + jsrgjizhao_info:'准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。', + jsrg_yangbiao:'起杨彪', + jsrg_yangbiao_ab:'杨彪', + jsrgzhaohan:'昭汉', + jsrgzhaohan_info:'准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。', + jsrgrangjie:'让节', + jsrgrangjie_info:'当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。', + jsrgyizheng:'义争', + jsrgyizheng_info:'出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。', + jsrg_kongrong:'起孔融', + jsrg_kongrong_ab:'孔融', + jsrglirang:'礼让', + jsrglirang_info:'每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。', + jsrgzhengyi:'争义', + jsrgzhengyi_info:'当你每回合首次受到伤害时,本轮因〖礼让〗获得过牌的其他角色可以将此伤害转移给其。', + jsrg_zhujun:'起朱儁', + jsrg_zhujun_ab:'朱儁', + jsrgfendi:'分敌', + jsrgfendi_tag:'分敌', + jsrgfendi_info:'每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你获得这些牌。', + jsrgjuxiang:'拒降', + jsrgjuxiang_info:'当你不于摸牌阶段获得牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。', + jsrg_liubei:'起刘备', + jsrg_liubei_ab:'刘备', + jsrgjishan:'积善', + jsrgjishan_info:'①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。', + jsrgzhenqiao:'振鞘', + jsrgzhenqiao_info:'锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。', + jsrg_wangyun:'起王允', + jsrg_wangyun_ab:'王允', + jsrgshelun:'赦论', + jsrgshelun_info:'出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。', + jsrgfayi:'伐异', + jsrgfayi_info:'当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。', + jsrg_liuyan:'起刘焉', + jsrg_liuyan_ab:'刘焉', + jsrgtushe:'图射', + jsrgtushe_info:'当你使用非装备牌指定目标后,你可以展示所有手牌。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。', + jsrgtongjue:'通绝', + jsrgtongjue_info:'主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。', + jsrg_caocao:'起曹操', + jsrg_caocao_ab:'曹操', + jsrgzhenglve:'政略', + jsrgzhenglve_info:'①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。', + jsrghuilie:'会猎', + jsrghuilie_info:'觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。', + jsrgpingrong:'平戎', + jsrgpingrong_info:'每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。', + jsrg_nanhualaoxian:'起南华老仙', + jsrg_nanhualaoxian_ab:'南华老仙', + jsrgshoushu:'授术', + jsrgshoushu_info:'锁定技。①每轮开始时,若游戏内没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', + jsrgxundao:'寻道', + jsrgxundao_info:'当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。', + jsrglinghua:'灵化', + jsrglinghua_info:'①准备阶段,你可以进行目标角色为你的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以进行目标角色为你且判定效果反转的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。', + sbyingmen:'盈门', + sbyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', + sbpingjian:'评鉴', + sbpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。', + //江山如故·承 + jsrg_sunce:'承孙策', + jsrg_sunce_ab:'孙策', + jsrgduxing:'独行', + jsrgduxing_info:'出牌阶段限一次。你可以视为使用一张可以指定任意名目标角色的【决斗】,且所有目标角色的手牌均视为【杀】直到此牌结算结束。', + jsrgzhiheng:'猘横', + jsrgzhiheng_info:'锁定技。当你因执行牌的效果对目标角色造成伤害时,若其于此回合响应过你使用过的牌,此伤害+1。', + jsrgzhasi:'诈死', + jsrgzhasi_info:'限定技。当你受到伤害值不小于你的体力值的伤害时,你可以防止此伤害,然后失去〖猘横〗并获得〖制衡〗。然后你不计入距离和座次计算直到你对其他角色使用牌后或当你受到伤害后。', + jsrgbashi:'霸世', + jsrgbashi_info:'主公技。当你需要打出【杀】或【闪】时,你可以令其他吴势力角色选择是否打出一张【杀】或【闪】。若有角色响应,则视为你打出了一张【杀】或【闪】。', + jsrg_xuyou:'承许攸', + jsrg_xuyou_ab:'许攸', + jsrglipan:'离叛', + jsrglipan_info:'回合结束时,你可以变更势力,然后摸X张牌并执行一个额外的出牌阶段。此阶段结束时,所有与你势力相同的角色依次可以将一张牌当【决斗】对你使用(X为与你势力相同的其他角色数)。', + jsrgqingxi:'轻袭', + jsrgqingxi_info:'群势力技。出牌阶段每名角色限一次。你可以选择一名手牌数小于你的角色,你将手牌数弃置至与其相同,然后视为对其使用一张刺【杀】。', + jsrgjinmie:'烬灭', + jsrgjinmie_info:'魏势力技。出牌阶段限一次。你可以选择一名手牌数大于你的角色,你视为对其使用一张火【杀】。当此牌造成伤害后,你将其手牌数弃置至与你相同。', + jsrg_lvbu:'承吕布', + jsrg_lvbu_ab:'吕布', + jsrgwuchang:'无常', + jsrgwuchang_info:'锁定技。①当你获得其他角色的牌后,你变更势力为与其相同。②当你使用【杀】或【决斗】对与你势力相同的目标角色造成伤害时,此伤害+1,然后变更势力为群。', + jsrgqingjiao:'轻狡', + jsrgqingjiao_info:'群势力技。出牌阶段各限一次。你可以将一张牌当【推心置腹】/【趁火打劫】对一名手牌数大于/小于你的角色使用。', + jsrgchengxu:'乘虚', + jsrgchengxu_info:'蜀势力技。与你势力相同的其他角色不能响应你使用的牌。', + jsrg_zhanghe:'承张郃', + jsrg_zhanghe_ab:'张郃', + jsrgqiongtu:'穷途', + jsrgqiongtu_info:'群势力技。每回合限一次。你可以将一张非基本牌置于武将牌上视为使用一张【无懈可击】。若此牌生效,你摸一张牌,否则你变更势力为魏并获得所有“穷途”牌。', + jsrgxianzhu:'先著', + jsrgxianzhu_info:'魏势力技。你可以将一张普通锦囊牌当无次数限制的【杀】使用。当此牌对唯一目标造成伤害后,你视为对该角色使用一张此普通锦囊牌。', + jsrg_zoushi:'承邹氏', + jsrg_zoushi_ab:'邹氏', + jsrgguyin:'孤吟', + jsrgguyin_info:'准备阶段,你可以翻面,且令所有其他男性角色依次选择是否翻面。然后你和所有背面朝上的角色轮流各摸一张牌直到你本次以此法获得X张牌(X为场上存活角色与死亡角色中男性角色数)。', + jsrgzhangdeng:'帐灯', + jsrgzhangdeng_info:'①当一名武将牌背面朝上的角色需要使用【酒】时,若你的武将牌背面朝上,其可以视为使用之。②当一名角色于一回合第二次发动〖帐灯①〗时,你将武将牌翻面至正面朝上。', + jsrg_guanyu:'承关羽', + jsrg_guanyu_ab:'关羽', + jsrgguanjue:'冠绝', + jsrgguanjue_info:'锁定技。当你使用或打出有花色的牌时,你令所有其他角色于此回合内不能使用或打出该花色的牌。', + jsrgnianen:'念恩', + jsrgnianen_info:'你可以将一张牌当任意基本牌使用或打出,然后若此牌不为红色或你以此法使用或打出的牌不为普通【杀】,则直到此回合结束,该技能失效且你视为拥有〖马术〗。', + jsrg_chendeng:'承陈登', + jsrg_chendeng_ab:'陈登', + jsrglunshi:'论势', + jsrglunshi_info:'出牌阶段限一次。你可以令一名角色摸等同于其攻击范围内角色数的牌(至多摸至五张),然后其弃置等同于攻击范围内含有其的角色数的牌。', + jsrgguitu:'诡图', + jsrgguitu_info:'准备阶段,你可以交换场上的两张武器牌,然后攻击范围以此法减少的角色回复1点体力。', + jsrg_zhenji:'承甄宓', + jsrg_zhenji_ab:'甄宓', + jsrgjixiang:'济乡', + jsrgjixiang_info:'回合内每种牌名限一次。当一名其他角色需要使用或打出一张基本牌时,你可以弃置一张牌令其视为使用或打出之,然后你摸一张牌并令〖称贤〗于此阶段可发动次数上限+1。', + jsrgchengxian:'称贤', + jsrgchengxian_info:'出牌阶段限两次。你可以将一张手牌当一张本回合未以此法使用过的普通锦囊牌使用(此转化牌须与以此法转化的手牌的合法目标数相同)。', + jsrg_zhangliao:'承张辽', + jsrg_zhangliao_ab:'张辽', + jsrgzhengbing:'整兵', + jsrgzhengbing_info:'群势力技。出牌阶段限三次。你可以重铸一张牌,若此牌为:【杀】,你本回合手牌上限+2;【闪】,你摸一张牌;【桃】,你变更势力为魏。', + jsrgtuwei:'突围', + jsrgtuwei_info:'魏势力技。出牌阶段开始时,你可以获得攻击范围内任意名角色各一张牌。然后此回合结束时,这些角色中未于本回合受到过伤害的角色依次获得你的一张牌。', + jsrg_xugong:'承许贡', + jsrg_xugong_ab:'许贡', + jsrgbiaozhao:'表召', + jsrgbiaozhao_info:'准备阶段,你可以选择两名其他角色A和B。直到你的下回合开始时或你死亡后,A对B使用牌无次数和距离限制,且B对你使用的牌造成的伤害+1。', + jsrgyechou:'业仇', + jsrgyechou_info:'当你死亡时,你可以令一名其他角色获得如下效果:当其受到伤害值不小于其体力值的伤害时,其令此伤害翻倍。', + jsrg_chunyuqiong:'承淳于琼', + jsrg_chunyuqiong_ab:'淳于琼', + jsrgcangchu:'仓储', + jsrgcangchu_info:'一名角色的结束阶段,你可以令至多X名角色各摸一张牌,若X大于存活角色数,则改为各摸两张牌(X为你于此回合获得过的牌数)。', + jsrgshishou:'失守', + jsrgshishou_info:'锁定技。①当你使用【酒】时,你摸三张牌,然后你本回合不能再使用牌。②当你受到火焰伤害后,你令〖仓储〗失效直到你的下回合结束后。', + + jiangshanrugu_qi:'江山如故·起', + jiangshanrugu_cheng:'江山如故·承', + }, + }; +}); diff --git a/character/mobile.js b/character/mobile.js index f0aa3dc29..0710cc01b 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -5867,9 +5867,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(_status.event.goon) return -1; var num=_status.event.maxNum; if(ui.selected.cards.length>=num-1){ - var val=get.value(player.getCards('he',function(cardx){ + var cards=player.getCards('he',function(cardx){ return cardx!=card&&!ui.selected.cards.contains(cardx); - })); + }); + var val=0; + for(var cardx of cards) val+=get.value(cardx); if(val>=14) return 0; } return get.value(card); @@ -13157,7 +13159,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ baosanniang:['xin_baosanniang','re_baosanniang','baosanniang'], heqi:['re_heqi','heqi'], weiwenzhugezhi:['weiwenzhugezhi','re_weiwenzhugezhi'], - xugong:['xugong','re_xugong'], + xugong:['xugong','re_xugong','jsrg_xugong'], liuzan:['re_liuzan','liuzan'], sufei:['yj_sufei','sp_sufei','xf_sufei'], jiakui:['jiakui','old_jiakui'], @@ -13332,7 +13334,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rezhennan:'镇南', rezhennan_info:'当你成为其他角色使用的牌的目标后,若此牌的目标数大于该角色的体力值,则你可以弃置一张牌并对其造成1点伤害。', - hujinding:'胡金定', + hujinding:'手杀胡金定', huaizi:'怀子', huaizi_info:'锁定技,你的手牌上限为你的体力上限。', renshi:'仁释', @@ -13465,7 +13467,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_dongzhuo:'手杀董卓', rejiuchi:'酒池', rejiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。锁定技,当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的【崩坏】失效直到回合结束。', - furong:'傅肜', + furong:'手杀傅肜', xuewei:'血卫', xuewei_info:'准备阶段,你可以选择一名其他角色(仅自己可见)。若如此做,直到你的下回合开始前,当其第一次受到伤害时,你防止此伤害,改为由你受到等量的伤害并对伤害来源造成等量同属性的伤害。', liechi:'烈斥', @@ -13512,7 +13514,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shanli_info:'觉醒技,准备阶段,若你已发动过〖败移〗且对至少两名角色发动过〖景略〗,则你减1点体力上限并选择一名角色。系统随机选择三个不为〖忘隙(仲村由理)〗的主公技,然后你选择其中一个技能,令其获得之。其将交互表情中的【拖鞋】和【酒杯】替换为【枷锁】和【玉玺】。', re_lingtong:'手杀凌统', re_liubiao:'手杀刘表', - hucheer:'胡车儿', + hucheer:'手杀胡车儿', daoji:'盗戟', daoji_info:'出牌阶段限一次,你可以弃置一张非基本牌并选择一名装备区里有牌的其他角色,你获得其装备区中的一张牌并使用之。若你以此法获得的牌是武器牌,则你使用此牌后对其造成1点伤害。', xin_hansui:'手杀韩遂', @@ -13595,7 +13597,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinshenxing_info:'出牌阶段限X次(X为你的体力值),你可以弃置两张牌,然后摸一张牌。若这两张牌颜色不同,则改为摸两张牌。', xinbingyi:'秉壹', xinbingyi_info:'结束阶段,你可展示所有手牌。若这些牌的颜色或类型均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数)。', - qiaozhou:'谯周', + qiaozhou:'手杀谯周', zhiming:'知命', zhiming_info:'准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。', xingbu:'星卜', @@ -13744,7 +13746,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_zhuzhi:'手杀朱治', sbanguo:'安国', sbanguo_info:'①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得X点护甲(X为你以此法失去的体力值或减少的体力上限)。', - wangjun:'王濬', + wangjun:'手杀王濬', zhujian:'筑舰', zhujian_info:'出牌阶段限一次。你可以令至少两名装备区里有牌的角色各摸一张牌。', duansuo:'断索', diff --git a/character/offline.js b/character/offline.js index e97962f43..071d8a546 100644 --- a/character/offline.js +++ b/character/offline.js @@ -9,7 +9,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ offline_sticker:['sp_gongsunzan','sp_simazhao','sp_wangyuanji','sp_xinxianying','sp_liuxie'], offline_luanwu:["ns_lijue","ns_zhangji","ns_fanchou"], offline_yongjian:["ns_chendao","yj_caoang","yj_caocao",'yj_liru','yj_caohong','yj_zhangfei','yongjian_ganning','yj_dongzhuo','yj_xuyou','yj_jiaxu','yj_zhenji'], - offline_jiangshanruguqi:['jsrg_liuhong','jsrg_hejin','jsrg_sunjian','jsrg_huangfusong','jsrg_xushao','jsrg_dongbai','jsrg_qiaoxuan','jsrg_yangbiao','jsrg_kongrong','jsrg_zhujun','jsrg_liubei','jsrg_wangyun','jsrg_liuyan','jsrg_caocao','jsrg_nanhualaoxian'], offline_piracyE:['shen_jiaxu','pe_wangyun','pe_zhonghui','pe_sunchen','pe_mengda','pe_wenqin','ns_caoanmin','jiangfei','chendong','jiangqing','kongrong','jiling','tianfeng','mateng'], offline_piracyS:['ns_jiaxu','longyufei','ps_guanyu','ps1059_guojia','ps2070_guojia','ps2063_zhaoyun','ps2067_zhaoyun','ps1062_zhouyu','ps2080_zhouyu','ps_caozhi','ps_jin_simayi','ps_caopi','ps_simayi','ps2068_simayi','ps_machao','ps_zhugeliang','ps2066_zhugeliang','ps_jiaxu','ps_lvbu','ps_shen_machao','jsp_liubei'], offline_piracyK:['pk_sp_duyu'], @@ -23,21 +22,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ vtb_xiaotao:['female','qun',4,['vtbtaoyan','vtbyanli']], vtb_xiaole:['female','qun',4,['vtbleyu','vtbyuanli']], vtb_xiaojiu:['female','qun',4,['vtbmeiniang','vtbyaoli']], - jsrg_liuhong:['male','qun',4,['jsrgchaozheng','jsrgshenchong','jsrgjulian'],['zhu']], - jsrg_hejin:['male','qun',4,['jsrgzhaobing','jsrgzhuhuan','jsrgyanhuo']], - jsrg_sunjian:['male','qun',4,['jsrgpingtao','jsrgjuelie']], - jsrg_huangfusong:['male','qun',4,['jsrgguanhuo','jsrgjuxia']], - jsrg_xushao:['male','qun',3,['sbyingmen','sbpingjian']], - jsrg_dongbai:['female','qun',3,['jsrgshichong','jsrglianzhu']], - jsrg_qiaoxuan:['male','qun',3,['jsrgjuezhi','jsrgjizhao']], - jsrg_yangbiao:['male','qun','3/4',['jsrgzhaohan','jsrgrangjie','jsrgyizheng']], - jsrg_kongrong:['male','qun',3,['jsrglirang','jsrgzhengyi']], - jsrg_zhujun:['male','qun',4,['jsrgfendi','jsrgjuxiang']], - jsrg_liubei:['male','qun',4,['jsrgjishan','jsrgzhenqiao']], - jsrg_wangyun:['male','qun',3,['jsrgshelun','jsrgfayi'],['clan:太原王氏']], - jsrg_liuyan:['male','qun',3,['xinfu_limu','jsrgtushe','jsrgtongjue'],['zhu']], - jsrg_caocao:['male','qun',4,['jsrgzhenglve','jsrghuilie']], - jsrg_nanhualaoxian:['male','qun',3,['jsrgshoushu','jsrgxundao','jsrglinghua']], ps_shen_machao:['male','shen',4,['psshouli','pshengwu'],['qun']], mateng:['male','qun',4,['mashu','xiongyi']], tianfeng:['male','qun',3,['sijian','gzsuishi']], @@ -109,7 +93,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ longyufei:'《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。', pk_sp_duyu:'杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。', ps_shen_machao:'字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。', - qiaoxuan:'桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。', xiaosha:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为三国杀新手菜鸡,误打误撞参加了三国杀组织的《三国之星》选秀大赛,没想到一路靠着颜值和风风火火的爽快性格过关斩将吸粉无数,获得了冠军,成为官方签约的形象代言人。
    小杀现于B站还存在对应账号,但早已荒废。', xiaoshan:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀同系不同班的同学,由于本身性格比较安静,所以和风风火火的小杀有些不对盘。知道小杀也玩三国杀后,外表高冷、内心傲娇的她偷偷也去玩了游戏,立志要在游戏里碾压她。
    小闪对应B站账号已销号。', xiaotao:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀的亲妹妹,陪姐姐去拍摄代言宣传照的时候,被导演看中,觉得三国美貌姐妹花是非常好的噱头,于是一并签下。正所谓“三国姐妹花,永远不分家!”。
    小桃对应B站账号已销号。', @@ -161,9 +144,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterFilter:{ - jsrg_xushao:function(mode){ - return mode!='guozhan'; - }, }, skill:{ //天书乱斗虚拟偶像线下化 @@ -599,2251 +579,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, - //江山如故·起 - sbyingmen:{ - forbid:['guozhan'], - trigger:{ - global:'phaseBefore', - player:'enterGame', - }, - forced:true, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; - }, - content:function(){ - if(!_status.characterlist) lib.skill.pingjian.initList(); - var characters=_status.characterlist.randomRemove(4); - lib.skill.sbyingmen.addVisitors(characters,player); - game.delayx(); - }, - group:'sbyingmen_reload', - subSkill:{ - reload:{ - trigger:{player:'phaseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.getStorage('sbyingmen').length<4; - }, - content:function(){ - if(!_status.characterlist) lib.skill.pingjian.initList(); - var characters=_status.characterlist.randomRemove(4-player.getStorage('sbyingmen').length); - lib.skill.sbyingmen.addVisitors(characters,player); - game.delayx(); - }, - }, - }, - getSkills:function(characters,player){ - var skills=[]; - for(var name of characters){ - if(Array.isArray(lib.character[name])){ - for(var skill of lib.character[name][3]){ - var list=get.skillCategoriesOf(skill,player); - list.remove('锁定技'); - if(list.length>0) continue; - var info=get.info(skill); - if(info&&(!info.unique||info.gainable)) skills.add(skill); - } - } - } - return skills; - }, - addVisitors:function(characters,player){ - player.addSkillBlocker('sbyingmen'); - game.log(player,'将','#y'+get.translation(characters),'加入了','#g“访客”') - lib.skill.rehuashen.drawCharacter(player,characters); - player.markAuto('sbyingmen',characters) - var storage=player.getStorage('sbyingmen'); - var skills=lib.skill.sbyingmen.getSkills(storage,player); - player.addInvisibleSkill(skills); - }, - removeVisitors:function(characters,player){ - var skills=lib.skill.sbyingmen.getSkills(characters,player); - var characters2=player.getStorage('sbyingmen').slice(0); - characters2.removeArray(characters); - skills.removeArray(lib.skill.sbyingmen.getSkills(characters2,player)); - player.unmarkAuto('sbyingmen',characters); - _status.characterlist.addArray(characters); - player.removeInvisibleSkill(skills); - }, - onremove:function(player,skill){ - lib.skill.sbyingmen.removeVisitors(player.getSkills('sbyingmen'),player); - player.removeSkillBlocker('sbyingmen'); - }, - skillBlocker:function(skill,player){ - if(!player.invisibleSkills.contains(skill)||skill=='sbpingjian'||skill=='sbpingjian') return false; - return !player.hasSkill('sbpingjian'); - }, - marktext:'客', - intro:{ - name:'访客', - mark:function(dialog,storage,player){ - if(!storage||!storage.length) return '当前没有“访客”'; - dialog.addSmall([storage,'character']); - var skills=lib.skill.sbyingmen.getSkills(storage,player); - if(skills.length) dialog.addText('
  • 当前可用技能:'+get.translation(skills),false); - }, - }, - }, - sbpingjian:{ - trigger:{player:['useSkill','logSkillBegin']}, - forced:true, - filter:function(event,player){ - var skill=event.sourceSkill||event.skill; - return player.invisibleSkills.contains(skill)&&lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player).contains(skill); - }, - content:function(){ - 'step 0' - var visitors=player.getStorage('sbyingmen').slice(0); - var drawers=visitors.filter(function(name){ - return Array.isArray(lib.character[name])&&lib.character[name][3].contains(trigger.sourceSkill); - }); - event.drawers=drawers; - if(visitors.length==1) event._result={bool:true,links:visitors}; - else{ - var dialog=['评鉴:请选择移去一张“访客”']; - if(drawers.length) dialog.push('
    如果移去'+get.translation(drawers)+',则你摸一张牌
    '); - dialog.push([visitors,'character']); - player.chooseButton(dialog,true); - } - 'step 1' - if(result.bool){ - lib.skill.sbyingmen.removeVisitors(result.links,player); - game.log(player,'移去了','#y'+get.translation(result.links[0])); - if(event.drawers.contains(result.links[0])){ - player.addTempSkill('sbpingjian_draw'); - player.storage.sbpingjian_draw.push(trigger.skill); - } - } - }, - group:'sbpingjian_trigger', - subSkill:{ - draw:{ - charlotte:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; - }, - onremove:true, - trigger:{player:['useSkillAfter','logSkill']}, - forced:true, - popup:false, - filter:function(event,player){ - return player.getStorage('sbpingjian_draw').contains(event.skill); - }, - content:function(){ - player.storage.sbpingjian_draw.remove(trigger.skill); - player.draw(); - if(!player.storage.sbpingjian_draw.length) player.removeSkill('sbpingjian_draw'); - }, - }, - trigger:{ - trigger:{player:'triggerInvisible'}, - forced:true, - forceDie:true, - popup:false, - charlotte:true, - priority:10, - filter:function(event,player){ - if(event.revealed) return false; - var info=get.info(event.skill); - if(info.charlotte) return false; - var skills=lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player); - game.expandSkills(skills); - return skills.contains(event.skill); - }, - content:function(){ - "step 0" - if(get.info(trigger.skill).silent){ - event.finish(); - } - else{ - var info=get.info(trigger.skill); - var event=trigger,trigger=event._trigger; - var str; - var check=info.check; - if(info.prompt) str=info.prompt; - else{ - if(typeof info.logTarget=='string'){ - str=get.prompt(event.skill,trigger[info.logTarget],player); - } - else if(typeof info.logTarget=='function'){ - var logTarget=info.logTarget(trigger,player); - if(get.itemtype(logTarget).indexOf('player')==0) str=get.prompt(event.skill,logTarget,player); - } - else{ - str=get.prompt(event.skill,null,player); - } - } - if(typeof str=='function'){str=str(trigger,player)} - var next=player.chooseBool('评鉴:'+str); - next.set('yes',!info.check||info.check(trigger,player)); - next.set('hsskill',event.skill); - next.set('forceDie',true); - next.set('ai',function(){ - return _status.event.yes; - }); - if(typeof info.prompt2=='function'){ - next.set('prompt2',info.prompt2(trigger,player)); - } - else if(typeof info.prompt2=='string'){ - next.set('prompt2',info.prompt2); - } - else if(info.prompt2!=false){ - if(lib.dynamicTranslate[event.skill]) next.set('prompt2',lib.dynamicTranslate[event.skill](player,event.skill)); - else if(lib.translate[event.skill+'_info']) next.set('prompt2',lib.translate[event.skill+'_info']); - } - if(trigger.skillwarn){ - if(next.prompt2){ - next.set('prompt2',''+trigger.skillwarn+'。'+next.prompt2); - } - else{ - next.set('prompt2',trigger.skillwarn); - } - } - } - "step 1" - if(result.bool){ - trigger.revealed=true; - } - else{ - trigger.untrigger(); - trigger.cancelled=true; - } - } - }, - }, - }, - jsrgchaozheng:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - logTarget:function(event,player){ - return game.filterPlayer(i=>i!=player); - }, - prompt:'是否发动【朝争】?', - content:function(){ - player.chooseToDebate(game.filterPlayer(i=>i!=player)).set('callback',lib.skill.jsrgchaozheng.callback); - }, - callback:function(){ - var result=event.debateResult; - if(result.bool&&result.opinion){ - var opinion=result.opinion,targets=result.red.map(i=>i[0]); - targets.sortBySeat(); - targets.forEach(i=>i[opinion=='red'?'recover':'loseHp']()); - if(targets.length==0||result.black.length==0) player.draw(result.targets.length); - } - } - }, - jsrgshenchong:{ - audio:2, - enable:'phaseUse', - limited:true, - filterTarget:lib.filter.notMe, - skillAnimation:true, - animationColor:'soil', - content:function(){ - 'step 0' - player.awakenSkill('jsrgshenchong'); - target.addSkillLog('jsrgfeiyang'); - target.addSkillLog('jsrgbahu'); - 'step 1' - player.addSkill('jsrgshenchong_die'); - player.markAuto('jsrgshenchong_die',[target]); - }, - ai:{ - order:1, - result:{target:1} - }, - subSkill:{ - die:{ - audio:'jsrgshenchong', - trigger:{player:'die'}, - charlotte:true, - forced:true, - forceDie:true, - filter:function(event,player){ - return player.getStorage('jsrgshenchong_die').length; - }, - content:function(){ - var targets=player.getStorage('jsrgshenchong_die'); - player.line(targets); - targets.sortBySeat().forEach(current=>{ - current.clearSkills(true); - current.chooseToDiscard(current.countCards('h'),'h',true); - }); - } - } - } - }, - jsrgfeiyang:{ - trigger:{player:'phaseJudgeBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('j')&&player.countCards('h')>1; - }, - content:function(){ - 'step 0' - player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ - return 6-get.value(card); - }); - 'step 1' - if(result.bool){ - player.discardPlayerCard(player,'j',true); - } - }, - }, - jsrgbahu:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - player.draw(); - }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; - }, - }, - }, - jsrgjulian:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasZhuSkill('jsrgjulian')&&lib.skill.jsrgjulian.logTarget(null,player).length; - }, - prompt:'是否发动【聚敛】?', - prompt2:'你可以获得其他所有群势力角色的各一张牌', - logTarget:function(event,player){ - return game.filterPlayer(current=>{ - return current.group=='qun'&¤t.countGainableCards(player,'h')>0&¤t!=player; - }) - }, - content:function(){ - game.filterPlayer(current=>{ - return current.group=='qun'&¤t!=player; - }).sortBySeat().forEach(i=>{ - player.gainPlayerCard(i,'h',true); - }); - }, - group:'jsrgjulian_draw', - zhuSkill:true, - subSkill:{ - draw:{ - audio:'jsrgjulian', - trigger:{global:'gainAfter'}, - filter:function(event,player){ - var source=event.player; - if(source==player||source.group!='qun') return false; - var evt=event.getParent('phaseDraw'); - return (!evt||evt.player!=source)&&event.getParent().name=='draw'&&event.getParent(2).name!='jsrgjulian_draw'&&player.hasZhuSkill('jsrgjulian',event.player); - }, - direct:true, - usable:2, - content:function(){ - 'step 0' - var source=trigger.player; - event.source=source; - source.chooseBool('是否响应'+get.translation(player)+'的【聚敛】摸一张牌?'); - 'step 1' - if(result.bool){ - source.logSkill('jsrgjulian_draw',player); - source.draw(); - } - else player.storage.counttrigger.jsrgjulian_draw--; - } - }, - give:{ - charlotte:true, - onremove:true - } - } - }, - //何进 - jsrgzhaobing:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'jsrgzhaobing')) return false; - } - return true; - }, - content:function(){ - 'step 0' - var cards=player.getCards('h'); - var num=cards.length; - var prompt2='弃置所有手牌,令至多'+get.cnNumber(num)+'名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力'; - player.chooseTarget(get.prompt('jsrgzhaobing'),prompt2,[1,num],lib.filter.notMe).set('ai',target=>{ - if(!_status.event.goon) return 0; - return 2-get.attitude(_status.event.player,target); - }).set('goon',num/2{ - return 2-get.attitude(player,current)>0; - })); - 'step 1' - if(result.bool){ - player.logSkill('jsrgzhaobing',result.targets); - event.targets=result.targets; - event.targets.sortBySeat(); - player.chooseToDiscard(true,'h',player.countCards('h')); - } - else event.finish(); - 'step 2' - var target=targets.shift(); - event.target=target; - target.chooseCard('诏兵:交给'+get.translation(player)+'一张【杀】,或失去1点体力',(card)=>{ - return get.name(card)=='sha'; - }).set('ai',card=>{ - if(_status.event.goon) return 0; - return 6-get.value(card); - }).set('goon',get.effect(target,{name:'losehp'},target,target)>=0); - 'step 3' - if(result.bool) target.give(result.cards,player,true); - else target.loseHp(); - if(targets.length) event.goto(2); - }, - ai:{ - expose:0.2 - } - }, - jsrgzhuhuan:{ - audio:'mouzhu', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - var hs=player.getCards('h','sha'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'jsrgzhuhuan')) return false; - } - return true; - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgzhuhuan'),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgzhuhuan',target); - var hs=player.getCards('h','sha'); - event.num=hs.length; - player.discard(hs); - } - else event.finish(); - 'step 2' - target.chooseToDiscard(get.translation(player)+'对你发动了【诛宦】','弃置'+get.cnNumber(num)+'张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸'+get.cnNumber(num)+'张牌').set('ai',card=>{ - if(_status.event.goon) return 0; - return 5.5-get.value(card); - }).set('goon',target.hp<=2||get.attitude(target,player)>=0||player.isHealthy()); - 'step 3' - if(result.bool){ - target.loseHp(); - } - else{ - player.draw(num); - player.recover(); - } - }, - ai:{ - expose:0.2 - } - }, - jsrgyanhuo:{ - inherit:'spyanhuo', - forced:true, - }, - //孙坚 - jsrgpingtao:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - var att=get.attitude(target,player); - target.chooseCard(get.translation(player)+'对你发动了【平讨】','交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】','he').set('ai',card=>{ - if(_status.event.give){ - if(card.name=='sha'||card.name=='tao'||card.name=='jiu') return 0; - return 8-get.value(card); - } - if(_status.event.att<0&&card.name=='sha') return -1; - return 4-get.value(card); - }).set('give',(att>=0||target.hp==1&&target.countCards('hs','shan')<=1)&&get.effect(target,{name:'sha'},player,target)<0).set('att',att); - 'step 1' - if(result.bool){ - target.give(result.cards,player); - player.addTempSkill('jsrgpingtao_sha'); - player.addMark('jsrgpingtao_sha',1,false); - } - else if(player.canUse('sha',target,false)){ - player.useCard({name:'sha',isCard:true},target,false); - } - }, - ai:{ - expose:0.15, - order:5, - result:{target:-1} - }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - marktext:'讨', - intro:{ - content:'本回合使用【杀】的次数上限+#', - }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('jsrgpingtao_sha'); - }, - } - } - } - }, - jsrgjuelie:{ - audio:2, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.getParent().type=='card'&&(player.isMinHandcard()||player.isMinHp()); - }, - forced:true, - locked:false, - group:'jsrgjuelie_discard', - content:function(){ - trigger.num++; - }, - shaRelated:true, - ai:{ - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.name||arg.name!='sha') return false; - if(!arg.target) return false; - var card=arg.target.getEquip(2); - return card&&get.value(card)>0&&player.hasCard(cardx=>{ - return lib.filter.cardDiscardable(cardx,player,'jsrgjuelie_discard')&&get.value(cardx)<5; - }); - }, - }, - subSkill:{ - discard:{ - audio:'jsrgjuelie', - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return player.countCards('he')&&event.card.name=='sha'; - }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌',[1,Infinity],'he').set('ai',card=>{ - if(ui.selected.cards.length>=_status.event.max) return 0; - if(_status.event.goon) return 4.5-get.value(card); - return 0; - }).set('max',trigger.target.countDiscardableCards(player,'he')).set('goon',get.attitude(player,trigger.target)<0).set('logSkill',['jsrgjuelie_discard',trigger.target]); - 'step 1' - if(result.bool){ - var num=result.cards.length; - if(trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard('平讨:弃置'+get.translation(trigger.target)+get.cnNumber(num)+'张牌',num,'he',trigger.target,true); - } - } - } - } - }, - //皇甫嵩 - jsrgguanhuo:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.card.storage&&event.card.storage.jsrgguanhuo&&!game.hasPlayer2(current=>{ - return current.hasHistory('damage',evt=>evt.card==event.card); - }); - }, - forced:true, - locked:false, - group:'jsrgguanhuo_viewas', - content:function(){ - 'step 0' - var count=player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length; - if(count==1){ - player.addTempSkill('jsrgguanhuo_ex','phaseUseAfter'); - player.addMark('jsrgguanhuo_ex',1,false); - trigger.targets.forEach(i=>i.removeSkill('huogong2')); - } - else{ - player.removeSkill('jsrgguanhuo'); - game.log(player,'失去了技能','#g【观火】'); - } - }, - ai:{ - effect:{ - player:function(card,player){ - if(_status.event.getParent().skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length==1) return 'zeroplayertarget'; - if(_status.event.type=='phase'&&_status.event.skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length>1&&player.countCards('h')<=3) return [0,0]; - } - } - }, - subSkill:{ - viewas:{ - audio:'jsrgguanhuo', - enable:'phaseUse', - viewAs:{ - name:'huogong', - isCard:true, - storage:{ - jsrgguanhuo:true - } - }, - filterCard:()=>false, - selectCard:-1, - prompt:'视为使用一张【火攻】', - ai:{ - order:function(item,player){ - return get.order({name:'huogong'})+0.01; - }, - } - }, - ex:{ - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return event.card&&event.card.name=='huogong'&&event.getParent().type=='card'; - }, - forced:true, - charlotte:true, - onremove:true, - intro:{content:'当你造成渠道为【火攻】的伤害时,此伤害+#'}, - content:function(){ - trigger.num+=player.countMark('jsrgguanhuo_ex'); - } - } - } - }, - jsrgjuxia:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - usable:1, - countSkill:function(player){ - return player.getSkills(null,false,false).filter(function(skill){ - var info=get.info(skill); - if(!info||info.charlotte) return false; - if(info.zhuSkill) return player.hasZhuSkill(skill); - return true; - }).length; - }, - filter:function(event,player){ - return event.player!=player&&lib.skill.jsrgjuxia.countSkill(event.player)>lib.skill.jsrgjuxia.countSkill(player); - }, - direct:true, - content:function(){ - 'step 0' - var goon=get.effect(player,trigger.card,trigger.player,trigger.player)<1; - if(goon&&!event.isMine()&&!event.isOnline()) game.delayx(); - trigger.player.chooseBool('是否对'+get.translation(player)+'发动【居下】?','令'+get.translation(trigger.card)+'对其无效,然后其摸两张牌').set('ai',()=>{ - return _status.event.goon; - }).set('goon',goon); - 'step 1' - if(result.bool){ - trigger.player.logSkill('jsrgjuxia',player); - trigger.excluded.add(player); - player.draw(2); - } - else player.storage.counttrigger.jsrgjuxia--; - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(lib.skill.jsrgjuxia.countSkill(target)>=lib.skill.jsrgjuxia.countSkill(player)) return; - if(card&&(card.cards||card.isCard)&&get.attitude(target,player)>0&&(!target.storage.counttrigger||!target.storage.counttrigger.jsrgjuxia)) return [0,0.5,0,0.5]; - }, - }, - } - }, - //许劭 - jsrgyingmen:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:['enterGame','phaseBegin'], - }, - forced:true, - filter:function(event,player,name){ - if(player.getStorage('jsrgyingmen').length>=4) return false; - if(name=='phaseBefore') return game.phaseNumber==0; - return event.name!='phase'||event.player==player; - }, - update:function(player){ - var id=player.playerid; - var characters=player.getStorage('jsrgyingmen'); - var skillName='jsrgpingjian_'+id; - var skillsx=[],skillsx2=[]; - var map={}; - var skillsy=lib.skill[skillName]?lib.skill[skillName].group:[]; - for(var name of characters){ - var skills=lib.character[name][3].slice(); - skills=skills.filter(skill=>{ - var list=get.skillCategoriesOf(skill,player); - list.removeArray(['锁定技','Charlotte']); - if(list.length) return false; - var info=get.info(skill); - return info&&(!info.unique||info.gainable); - }); - game.expandSkills(skills); - for(var i=0;i{ - return lib.skill.jsrgyingmen.bannedList.contains(skill); - })) continue; - list.push(name); - _status.characterlist.remove(name); - if(list.length>=4-num) break; - } - if(list.length){ - player.markAuto('jsrgyingmen',list); - if(player.hasSkill('jsrgpingjian',null,false,false)) lib.skill.jsrgyingmen.update(player); - game.log(player,'将','#g'+get.translation(list),'置为','#y访客'); - game.broadcastAll(function(player,list){ - var cards=[]; - for(var i=0;i{ - return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; - })) return true; - } - return false; - }, - content:function(){ - 'step 0' - var current; - var skill=trigger.skill,name=trigger.event?trigger.event.name:''; - var visitors=player.getStorage('jsrgyingmen'); - for(var visitor of visitors){ - var skills=lib.character[visitor][3].slice(); - game.expandSkills(skills); - var info=get.info(skill); - if(info&&info.charlotte) continue; - if(skills.some(skillx=>{ - return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; - })){ - current=visitor; - break; - } - } - event.current=current; - player.chooseButton(['###评鉴:移去一名访客###
    若移去的访客为'+get.translation(current)+',则你摸一张牌
    ',[player.getStorage('jsrgyingmen'),'character']],true).set('ai',button=>{ - if(button.link==_status.event.toremove) return 1; - return Math.random(); - }).set('toremove',function(){ - var list=player.getStorage('jsrgyingmen'); - var rand=Math.random(); - if(rand<0.33) return list[0]; - if(rand<0.66) return current; - return list.randomGet(); - }()); - 'step 1' - if(result.bool){ - var visitor=result.links[0]; - game.log(player,'从','#y访客','中移去了','#g'+get.translation(visitor)); - player.popup(visitor); - player.unmarkAuto('jsrgyingmen',[visitor]); - _status.characterlist.add(visitor); - if(visitor==event.current) player.draw(); - lib.skill.jsrgyingmen.update(player); - } - }, - subSkill:{ - blocker:{ - init:function(player,skill){ - player.addSkillBlocker(skill); - }, - onremove:function(player,skill){ - player.removeSkillBlocker(skill); - }, - charlotte:true, - locked:true, - skillBlocker:function(skill,player){ - if(skill!='jsrgpingjian_'+player.playerid) return false; - if(player._jsrgpingjian_blockerChecking) return; - player._jsrgpingjian_blockerChecking=true; - var own=player.hasSkill('jsrgpingjian'); - delete player._jsrgpingjian_blockerChecking; - return !own; - } - }, - } - }, - //董白 - jsrgshichong:{ - audio:2, - zhuanhuanji:true, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.target!=player&&event.targets.length==1&&event.target.isIn()&&event.target.countCards('h'); - }, - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - var str='转换技。当你使用牌指定其他角色为唯一目标后,'; - if(storage) return str+'目标角色可以交给你一张手牌。'; - return str+'你可以获得目标角色一张手牌。'; - }, - }, - content:function(){ - 'step 0' - if(!player.storage.jsrgshichong){ - player.chooseBool(get.prompt('jsrgshichong',trigger.target),'你可以获得该角色的一张手牌').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.attitude(player,trigger.target)<=0); - } - else{ - trigger.target.chooseCard('是否发动'+get.translation(player)+'的【恃宠】?','你可以选择一张手牌,并交给该角色').set('ai',card=>{ - if(_status.event.goon) return 5-get.value(card); - return 0-get.value(card); - }).set('goon',get.attitude(trigger.target,player)>2); - } - 'step 1' - if(result.bool){ - if(!player.storage.jsrgshichong){ - player.logSkill('jsrgshichong',trigger.target); - player.gainPlayerCard(trigger.target,'h',true); - } - else{ - trigger.target.logSkill('jsrgshichong',player); - trigger.target.give(result.cards,player); - } - player.changeZhuanhuanji('jsrgshichong'); - } - } - }, - jsrglianzhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:{color:'black'}, - position:'h', - filterTarget:lib.filter.notMe, - lose:false, - discard:false, - delay:false, - content:function(){ - 'step 0' - player.showCards(cards,get.translation(player)+'发动了【连诛】'); - 'step 1' - player.give(cards,target); - 'step 2' - event.targets=game.filterPlayer(current=>{ - return current.group==target.group&¤t!=player; - }).sortBySeat(); - game.delayx(); - 'step 3' - var target=targets.shift(); - if(player.canUse('guohe',target)){ - player.useCard({name:'guohe',isCard:true},target); - } - if(targets.length) event.redo(); - }, - ai:{ - order:4, - result:{ - target:function(player,target){ - var targets=game.filterPlayer(current=>{ - return current.group==target.group&¤t!=player; - }); - var eff=targets.reduce((p,c)=>{ - return p+get.effect(c,{name:'guohe'},player,player); - }) - if(ui.selected.cards.length) eff+=get.value(ui.selected.cards[0],target); - return eff; - } - } - } - }, - //桥玄 - jsrgjuezhi:{ - audio:2, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - if(_status.currentPhase!=player||player.hasSkill('jsrgjuezhi_used',null,null,false)) return false; - return event.card&&event.getParent().type=='card'&&lib.skill.jsrgjuezhi.getNum(event.player,player)>0; - }, - forced:true, - locked:false, - getNum:function(target,player){ - return target.countCards(card=>{ - var subtype=get.subtypes(card); - for(var i of subtype){ - if(player.hasDisabledSlot(i)) return true; - } - return false; - }); - }, - group:'jsrgjuezhi_disable', - content:function(){ - player.addTempSkill('jsrgjuezhi_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); - trigger.num+=lib.skill.jsrgjuezhi.getNum(trigger.player,player); - }, - subSkill:{ - disable:{ - audio:'jsrgjuezhi', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], - }, - direct:true, - filter:function(event,player){ - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; - }, - content:function(){ - 'step 0' - event.cards=trigger.getl(player).es; - 'step 1' - var card=cards.shift(),subtypes=get.subtypes(card).filter(slot=>player.hasEnabledSlot(slot)); - event.subtypes=subtypes; - if(subtypes.length>0){ - player.chooseBool(get.prompt('jsrgjuezhi_disable'),'废除你的'+get.translation(subtypes)+'栏').set('ai',()=>1); - } - else event._result={bool:false}; - 'step 2' - if(result.bool){ - player.logSkill('jsrgjuezhi_disable'); - player.disableEquip(event.subtypes); - } - if(cards.length>0) event.goto(1); - }, - }, - used:{charlotte:true} - } - }, - jsrgjizhao:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgjizhao')).set('ai',target=>{ - var player=_status.event.player; - if(player.countCards('j')) return player==target?10:0.1; - return 6-get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgjizhao',target); - target.chooseToUse({ - filterCard:function(card,player,event){ - if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; - return lib.filter.filterCard.apply(this,arguments); - }, - prompt:'急召:使用一张手牌,否则'+get.translation(player)+'可以移动你区域里的一张牌', - addCount:false, - goon:target!=player||!player.countCards('j'), - ai1:function(card){ - if(_status.event.goon) return get.order(card); - return 0; - } - }); - } - 'step 2' - if(result.bool){event.finish();return;} - var targets=game.filterPlayer(current=>{ - if(current==target) return false; - var hs=target.getCards('h'); - if(hs.length) return true; - var js=target.getCards('j'); - for(var i=0;i0) return att; - return 0; - } - return -att*att2; - }); - next.set('targetprompt','移动目标'); - next.set('prompt','急召:是否移动'+get.translation(target)+'的一张牌?'); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target2=result.targets[0]; - event.targets=[target,target2]; - player.line2(event.targets,'green'); - } - else{ - event.finish(); - } - 'step 4' - game.delay(); - 'step 5' - if(targets.length==2){ - player.choosePlayerCard('hej',true,function(button){ - var player=_status.event.player; - var targets0=_status.event.targets0; - var targets1=_status.event.targets1; - if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ - if(get.position(button.link)=='j') return 12; - if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; - return 0; - } - else{ - if(get.position(button.link)=='j') return -10; - if(get.position(button.link)=='h') return 10; - return get.value(button.link)*get.effect(targets1,button.link,player,targets1); - } - },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ - var targets1=_status.event.targets1; - if(get.position(button.link)=='h'){ - return true; - } - else if(get.position(button.link)=='j'){ - return targets1.canAddJudge(button.link); - } - else{ - return targets1.canEquip(button.link); - } - }); - } - else{ - event.finish(); - } - 'step 6' - if(result.bool&&result.links.length){ - var link=result.links[0]; - if(get.position(link)=='h'){ - event.targets[1].gain(link); - } - else if(get.position(link)=='e'){ - event.targets[1].equip(link); - } - else if(link.viewAs){ - event.targets[1].addJudge({name:link.viewAs},[link]); - } - else{ - event.targets[1].addJudge(link); - } - event.targets[0].$give(link,event.targets[1],false); - game.log(event.targets[0],'的',get.position(link)=='h'?'一张手牌':link,'被移动给了',event.targets[1]); - game.delay(); - } - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='delay'&¤t<0){ - if(target.countCards('j')) return; - return 'zerotarget'; - } - }, - }, - } - }, - //杨彪 - jsrgzhaohan:{ - audio:'zhaohan', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - if(game.shuffleNumber==0) return player.isDamaged(); - return true; - }, - content:function(){ - player[game.shuffleNumber>0?'loseHp':'recover'](); - } - }, - jsrgrangjie:{ - audio:'rangjie', - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return player.canMoveCard(); - }, - check:function(event,player){ - return player.canMoveCard(true); - }, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - event.num--; - if(player.canMoveCard()) player.moveCard(true); - 'step 2' - if(result.bool){ - var card=result.card; - var suit=get.suit(card,false); - var cards=Array.from(ui.discardPile.childNodes); - var gains=[]; - var history=game.getGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose') return evt.position==ui.discardPile; - return evt.name=='cardsDiscard'; - }); - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - var cards2=evt.cards.filter(card=>{ - return cards.contains(card)&&get.suit(card,false)==suit; - }); - if(cards2.length){ - gains.addArray(cards2); - cards.removeArray(cards2); - } - if(!cards.length) break; - } - if(gains.length){ - player.chooseButton(['让节:是否获得一张'+get.translation(suit)+'牌?',gains]).set('ai',get.buttonValue); - } - else event._result={bool:false}; - } - 'step 3' - if(result.bool){ - player.gain(result.links,'gain2'); - } - 'step 4' - if(event.num>0&&player.hasSkill('jsrgrangjie')){ - player.chooseBool(get.prompt2('jsrgrangjie')).set('ai',()=>_status.event.bool).set('bool',lib.skill.jsrgrangjie.check(trigger,player)); - } - else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('jsrgrangjie'); - event.goto(1); - } - }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target._jsrgrangjie_aiChecking) return; - target._jsrgrangjie_aiChecking=true; - var moveCard=target.canMoveCard(true); - delete target._jsrgrangjie_aiChecking; - if(!moveCard||!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.5; - } - else{ - num=0.3; - } - } - if(target.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; - } - }, - }, - }, - }, - jsrgyizheng:{ - audio:'yizheng', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h')&&player.canCompare(current); - }); - }, - filterTarget:function(card,player,current){ - return current.countCards('h')>player.countCards('h')&&player.canCompare(current); - }, - content:function(){ - 'step 0' - player.chooseToCompare(target); - 'step 1' - if(result.bool){ - target.skip('phaseDraw'); - target.addTempSkill('yizheng2',{player:'phaseDrawSkipped'}); - event.finish(); - } - else{ - target.chooseControl('1','2','cancel').set('prompt','是否对'+get.translation(player)+'造成至多2点伤害?').set('ai',()=>{ - return _status.event.choice; - }).set('choice',get.damageEffect(player,target,target)>0?(get.attitude(target,player)>0?0:1):'cancel2'); - } - 'step 2' - if(result.control!='cancel2'){ - var num=result.index+1; - target.line(player); - player.damage(target,num); - } - }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(target.skipList.contains('phaseDraw')||target.hasSkill('pingkou')) return 0; - var hs=player.getCards('h').sort(function(a,b){ - return b.number-a.number; - }); - var ts=target.getCards('h').sort(function(a,b){ - return b.number-a.number; - }); - if(!hs.length||!ts.length) return 0; - if(hs[0].number>ts[0].number) return -1; - return 0; - }, - }, - }, - }, - //孔融 - jsrglirang:{ - audio:'splirang', - trigger:{global:'phaseDrawBegin'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&!player.hasSkill('jsrglirang_used')&&player.countCards('he')>1; - }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt('jsrglirang',trigger.player),'你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。',2,'he').set('ai',card=>{ - if(!_status.event.give) return 0; - var player=_status.event.player,target=_status.event.target; - return target.getUseValue(card)-player.getUseValue(card)+0.5; - }).set('give',get.attitude(player,trigger.player)>0).set('target',trigger.player); - 'step 1' - if(result.bool){ - player.logSkill('jsrglirang',trigger.player); - var cards=result.cards; - player.give(cards,trigger.player); - player.addTempSkill('jsrglirang_used','roundStart'); - player.addTempSkill('jsrglirang_given'); - player.markAuto('jsrglirang_used',[trigger.player]); - } - }, - subSkill:{ - used:{ - charlotte:true, - onremove:true, - intro:{content:'本轮〖礼让〗目标:$'}, - }, - given:{ - audio:'splirang', - trigger:{global:'phaseDiscardEnd'}, - filter:function(event,player){ - return event.player.hasHistory('lose',evt=>{ - return evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.cards2.filterInD('d').length>0; - }); - }, - charlotte:true, - prompt2:function(event,player){ - var cards=[]; - event.player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2.filterInD('d')); - }); - return '获得'+get.translation(cards); - }, - content:function(){ - var cards=[]; - trigger.player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2.filterInD('d')); - }); - player.gain(cards,'gain2'); - } - } - } - }, - jsrgzhengyi:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - var list=player.getStorage('jsrglirang_used'); - if(!list.length) return false; - return !player.getHistory('damage').length&&list[0].isIn(); - }, - direct:true, - content:function(){ - 'step 0' - var target=player.getStorage('jsrglirang_used')[0]; - event.target=target; - target.chooseBool('是否对'+get.translation(player)+'发动【争义】?','将此'+(trigger.source?'来源为'+get.translation(trigger.source):'无来源')+'的'+trigger.num+'点伤害转移给你').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.damageEffect(player,trigger.source,target)>get.damageEffect(target,trigger.source,target)); - 'step 1' - if(result.bool){ - target.logSkill('jsrgzhengyi',player); - trigger.cancel(); - target.damage(trigger.source,trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); - } - } - }, - //朱儁 - jsrgfendi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.targets.length==1&&event.card.name=='sha'&&event.targets[0].countCards('h')>0; - }, - usable:1, - logTarget:'target', - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - player.choosePlayerCard(target,'h',true,[1,Infinity],'分敌:展示'+get.translation(target)+'的任意张手牌').set('ai',button=>{ - if(_status.event.all) return 1; - if(ui.selected.buttons.length) return 0; - return Math.random(); - }).set('all',!target.mayHaveShan()&&Math.random()<0.75).set('forceAuto',true); - 'step 1' - if(result.bool){ - var cards=result.cards; - target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【分敌】'); - target.addGaintag(cards,'jsrgfendi_tag'); - target.addTempSkill('jsrgfendi_blocker'); - player.addTempSkill('jsrgfendi_gain'); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.jsrgfendi=true; - player.storage.jsrgfendi_gain=target; - } - else player.storage.counttrigger.jsrgfendi--; - }, - subSkill:{ - blocker:{ - trigger:{ - player:['damageBefore','damageCancelled','damageZero'], - target:['shaMiss','useCardToExcluded','useCardToEnd'], - global:['useCardEnd'], - }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - player.removeSkill('jsrgfendi_blocker'); - }, - mod:{ - cardEnabled:function(card,player){ - if(card.cards){ - for(var i of card.cards){ - if(!i.hasGaintag('jsrgfendi_tag')) return false; - } - } - else if(get.itemtype(card)=='card'){ - if(!card.hasGaintag('jsrgfendi_tag')) return false; - } - }, - cardRespondable:function(card,player){ - return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); - }, - cardSavable:function(card,player){ - return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); - }, - }, - }, - gain:{ - trigger:{global:'damageSource'}, - charlotte:true, - forced:true, - direct:true, - onremove:true, - filter:function(event,player){ - var target=player.storage.jsrgfendi_gain; - return event.card&&event.card.storage&&event.card.storage.jsrgfendi&&target&&target.isIn()&&target.hasCard(card=>{ - return card.hasGaintag('jsrgfendi_tag'); - },'h'); - }, - content:function(){ - player.logSkill('jsrgfendi_gain',player.storage.jsrgfendi_gain); - player.gain(player.storage.jsrgfendi_gain.getCards('h',card=>{ - return card.hasGaintag('jsrgfendi_tag'); - }),'give'); - } - } - } - }, - jsrgjuxiang:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', - }, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - if(evt&&evt.name=='phaseDraw') return false; - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.contains(i)); - if(!cards.length) return false; - for(var card of cards){ - if(!lib.filter.cardDiscardable(card,player,'jsrgjuxiang')) return false; - } - return true; - }, - check:function(event,player){ - var target=_status.currentPhase; - if(!target||get.attitude(player,target)<=0) return false; - var evt=event.getParent('phaseDiscard'),evt2=event.getParent('phaseJieshu'); - if(evt&&evt.name=='phaseDiscard'||evt2&&evt.name=='phaseJieshu') return false; - if(target.getCardUsable({name:'sha'})>=target.countCards('hs','sha')) return false; - if(!target.hasValueTarget({name:'sha'})) return false; - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.contains(i)); - var val=0; - for(var i of cards) val+=get.value(i); - if(val<10) return true; - return false; - }, - prompt2:function(event,player){ - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.contains(i)); - var target=_status.currentPhase; - var str='弃置'+get.translation(cards); - if(target&&target.isIn()){ - var list=[]; - for(var card of cards){ - list.add(get.suit(card,player)); - } - var num=list.length; - str+=',然后令'+get.translation(target)+'于此回合额定的出牌阶段内使用【杀】的次数上限+'+num; - } - return str; - }, - content:function(){ - 'step 0' - var hs=player.getCards('h'); - var cards=trigger.getg(player).filter(i=>hs.contains(i)); - var list=[]; - for(var card of cards){ - list.add(get.suit(card,player)); - } - event.num=list.length; - player.discard(cards); - 'step 1' - var target=_status.currentPhase; - if(target&&target.isIn()){ - target.addTempSkill('jsrgjuxiang_sha'); - target.addMark('jsrgjuxiang_sha',num,false); - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'&&!evt.skill){ - evt.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); - evt.player.addMark('jsrgjuxiang_buff',num,false); - } - } - }, - subSkill:{ - sha:{ - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return !event.skill; - }, - silent:true, - charlotte:true, - forced:true, - onremove:true, - content:function(){ - trigger.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); - trigger.player.addMark('jsrgjuxiang_buff',player.countMark('jsrgjuxiang_sha'),false); - } - }, - buff:{ - charlotte:true, - intro:{content:'使用【杀】的次数上限+#'}, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('jsrgjuxiang_buff'); - }, - } - } - } - }, - //刘备 - jsrgjishan:{ - audio:2, - trigger:{global:'damageBegin4'}, - usable:1, - filter:function(event,player){ - return player.hp>0; - }, - logTarget:'player', - onremove:true, - prompt2:'失去1点体力并防止此伤害,然后你与其各摸一张牌', - check:function(event,player){ - return get.damageEffect(event.player,event.source,player,event.nature)*Math.sqrt(event.num)<=get.effect(player,{name:'losehp'},player,player); - }, - group:'jsrgjishan_recover', - content:function(){ - 'step 0' - trigger.cancel(); - player.loseHp(); - player.markAuto('jsrgjishan',[trigger.player]); - 'step 1' - if(player.isIn()&&trigger.player.isIn()){ - var targets=[player,trigger.player]; - targets.sortBySeat(_status.currentPhase); - targets[0].draw('nodelay'); - targets[1].draw(); - } - }, - intro:{content:'已帮助$抵挡过伤害'}, - ai:{expose:0.2}, - subSkill:{ - recover:{ - audio:'jsrgjishan', - trigger:{source:'damageSource'}, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current.isMinHp()&&player.getStorage('jsrgjishan').contains(current); - }); - }, - usable:1, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgjishan_recover'),'令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力',(card,player,target)=>{ - return target.isMinHp()&&player.getStorage('jsrgjishan').contains(target); - }).set('ai',target=>{ - return get.recoverEffect(target,_status.event.player,_status.event.player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgjishan_recover',target); - target.recover(); - } - else player.storage.counttrigger.jsrgjishan_recover--; - } - } - } - }, - jsrgzhenqiao:{ - audio:2, - trigger:{player:'useCardToTargeted'}, - forced:true, - shaRelated:true, - filter:function(event,player){ - return event.isFirstTarget&&event.card.name=='sha'&&player.hasEmptySlot(1); - }, - content:function(){ - // trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); - // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); - trigger.getParent().effectCount++; - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player._jsrgzhenqiao_aiChecking) return; - if(target==player&&get.subtype(card)=='equip1'&&!player.getEquip(1)){ - player._jsrgzhenqiao_aiChecking=true; - var eff=get.effect(target,card,player,player); - delete player._jsrgzhenqiao_aiChecking; - if(eff<3) return 'zerotarget'; - } - } - } - }, - mod:{ - attackRange:function(player,num){ - return num+1; - }, - } - }, - //王允 - jsrgshelun:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(current=>player.inRange(current)); - }, - filterTarget:function(card,player,target){ - return player.inRange(target); - }, - content:function(){ - var num=player.countCards('h'); - var targets=game.filterPlayer(current=>{ - return current.countCards('h')<=num&¤t!=target; - }); - player.chooseToDebate(targets).set('callback',function(){ - var result=event.debateResult; - if(result.bool&&result.opinion){ - var opinion=result.opinion; - var target=event.getParent(2).target; - if(opinion=='red') player.discardPlayerCard(target,'he',true); - else target.damage(); - } - }).set('ai',card=>{ - var player=_status.event.player; - var color=(player==_status.event.source||get.damageEffect(_status.event.getParent(2).target,player,player)>0)?'black':'red'; - var val=5-get.value(card); - if(get.color(card)==color) val+=10; - return val; - }).set('aiCard',target=>{ - var color=(target==_status.event.source||get.damageEffect(_status.event.getParent(2).target,target,target)>0)?'black':'red'; - var hs=target.getCards('h',{color:color}); - if(!hs.length) hs=target.getCards('h'); - return {bool:true,cards:[hs.randomGet()]}; - }).set('target',target); - }, - ai:{ - order:8, - expose:0.2, - result:{target:-1}, - } - }, - jsrgfayi:{ - audio:2, - trigger:{global:'chooseToDebateAfter'}, - filter:function(event,player){ - if(!event.targets.contains(player)) return false; - if(event.red.map(i=>i[0]).contains(player)) return event.black.length; - if(event.black.map(i=>i[0]).contains(player)) return event.red.length; - return false; - }, - direct:true, - content:function(){ - 'step 0' - var targets=[]; - if(trigger.red.map(i=>i[0]).contains(player)) targets=trigger.black; - if(trigger.black.map(i=>i[0]).contains(player)) targets=trigger.red; - player.chooseTarget(get.prompt('jsrgfayi'),'对一名与你意见不同的角色造成1点伤害',(card,player,target)=>{ - return _status.event.targets.contains(target); - }).set('targets',targets.map(i=>i[0])).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgfayi',target); - target.damage(); - } - } - }, - jsrgtushe:{ - audio:'xinfu_tushe', - trigger:{ - player:'useCardToPlayered', - }, - filter:function (event,player){ - if(get.type(event.card)=='equip') return false; - if(event.getParent().triggeredTargets3.length>1) return false; - return event.targets.length>0; - }, - check:function(event,player){ - return !player.countCards('h',{type:'basic'}); - }, - content:function (){ - 'step 0' - player.showHandcards(); - 'step 1' - if(player.countCards('h',{type:'basic'})) event.finish(); - else player.chooseBool('图射:是否摸'+get.cnNumber(trigger.targets.length)+'张牌?').set('ai',()=>1); - 'step 2' - if(result.bool){ - player.draw(trigger.targets.length); - } - }, - ai:{ - presha:true, - pretao:true, - threaten:1.8, - }, - }, - jsrgtongjue:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuSkill:true, - filter:function(event,player){ - return player.hasZhuSkill('jsrgtongjue')&&game.hasPlayer(current=>current!=player&¤t.group=='qun'); - }, - filterCard:true, - selectCard:[1,Infinity], - filterTarget:function(card,player,target){ - return target!=player&&target.group=='qun'; - }, - selectTarget:[1,Infinity], - filterOk:function(){ - return ui.selected.cards.length==ui.selected.targets.length; - }, - check:function(card){ - var player=_status.event.player; - if(player.hasCard(card=>{ - return player.hasValueTarget(card); - },'hs')){ - return 3-player.getUseValue(card); - } - return 3-get.value(card); - }, - multiline:true, - multitarget:true, - delay:false, - discard:false, - lose:false, - content:function(){ - 'step 0' - var list=[]; - for(var i=0;icurrent.getSeatNum()==1); - return event.player==zhu; - }, - locked:false, - group:'jsrgzhenglve_damage', - prompt2:function(event,player){ - var num=Math.min(event.player.getHistory('sourceDamage').length>0?1:2,game.countPlayer(current=>{ - return !current.hasMark('jsrgzhenglve_mark'); - })); - if(num==0) return '你可以摸一张牌'; - return '你可以摸一张牌并令'+get.cnNumber(num)+'名角色获得“猎”标记'; - }, - content:function(){ - 'step 0' - player.draw(); - 'step 1' - var damaged=trigger.player.getHistory('sourceDamage').length>0; - var num=damaged?1:2; - var targets=game.filterPlayer(current=>{ - return !current.hasMark('jsrgzhenglve_mark'); - }); - if(!targets.length) event.finish(); - else if(targets.length<=num) event._result={bool:true,targets:targets}; - else player.chooseTarget('令'+get.cnNumber(num)+'名角色获得“猎”标记',true,num,(card,player,target)=>{ - return !target.hasMark('jsrgzhenglve_mark'); - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - return 100-att; - }); - 'step 2' - if(result.bool){ - var targets=result.targets; - player.line(targets); - targets.forEach(i=>i.addMark('jsrgzhenglve_mark',1)); - } - }, - mod:{ - cardUsableTarget:function(card,player,target){ - if(target.hasMark('jsrgzhenglve_mark')) return true; - }, - targetInRange:function(card,player,target){ - if(target.hasMark('jsrgzhenglve_mark')) return true; - }, - }, - subSkill:{ - damage:{ - audio:'jsrgzhenglve', - trigger:{source:'damageSource'}, - usable:1, - filter:function(event,player){ - return event.player.hasMark('jsrgzhenglve_mark'); - }, - prompt2:function(event,player){ - var cards=event.cards||[]; - return '摸一张牌'+(cards.filterInD().length?'并获得'+get.translation(event.cards.filterInD()):''); - }, - content:function(){ - 'step 0' - player.draw(); - var cards=trigger.cards; - if(cards&&cards.filterInD().length){ - player.gain(cards.filterInD(),'gain2'); - } - } - }, - mark:{ - marktext:'猎', - intro:{ - name:'猎(政略)', - name2:'猎', - markcount:()=>0, - content:'已拥有“猎”标记', - } - } - } - }, - jsrghuilie:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'thunder', - derivation:['jsrgpingrong','feiying'], - filter:function(event,player){ - return game.countPlayer(current=>current.hasMark('jsrgzhenglve_mark'))>2; - }, - content:function(){ - 'step 0' - player.awakenSkill('jsrghuilie'); - player.loseMaxHp(); - 'step 1' - player.addSkillLog('jsrgpingrong'); - player.addSkillLog('feiying'); - } - }, - jsrgpingrong:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return !player.hasSkill('jsrgpingrong_used')&&game.hasPlayer(current=>current.hasMark('jsrgzhenglve_mark')); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrghuilie'),'移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。',(card,player,target)=>{ - return target.hasMark('jsrgzhenglve_mark'); - }).set('ai',target=>{ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgpingrong',target); - player.addTempSkill('jsrgpingrong_used','roundStart'); - target.removeMark('jsrgzhenglve_mark',target.countMark('jsrgzhenglve_mark')); - player.insertPhase(); - player.addSkill('jsrgpingrong_check'); - } - }, - subSkill:{ - used:{charlotte:true}, - check:{ - audio:'jsrgpingrong', - trigger:{player:'phaseAfter'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return event.skill=='jsrgpingrong'&&!player.getHistory('sourceDamage').length; - }, - content:function(){ - player.loseHp(); - } - } - } - }, - //南华老仙 - jsrgshoushu:{ - audio:2, - forced:true, - trigger:{global:'roundStart'}, - filter:function(event,player){ - return !game.hasPlayer(function(current){ - return current.countCards('hejsx','taipingyaoshu'); - })&&!Array.from(ui.cardPile.childNodes).concat(Array.from(ui.discardPile.childNodes)) - .concat(Array.from(ui.ordering.childNodes)).map(i=>i.name).contains('taipingyaoshu'); - }, - direct:true, - group:'jsrgshoushu_destroy', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgshoushu'),'将【太平要术】置入一名角色的装备区',(card,player,target)=>{ - var card={name:'taipingyaoshu'}; - return target.canEquip(card,true); - }).set('ai',target=>{ - return target.getUseValue({name:'taipingyaoshu'})*get.attitude(_status.event.player,target); - }) - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgshoushu',target); - if(!lib.inpile.contains('taipingyaoshu')){ - lib.inpile.push('taipingyaoshu'); - } - event.card=game.createCard2('taipingyaoshu','heart',3); - } - else event.finish(); - 'step 2' - if(card) target.equip(card); - }, - subSkill:{ - destroy:{ - audio:'jsrgshoushu', - trigger:{ - global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], - }, - forced:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - var evt=event.getl(current); - if(evt&&evt.es) return evt.es.some(i=>i.name=='taipingyaoshu'); - return false; - }); - }, - content:function(){ - var cards=[]; - game.countPlayer(current=>{ - var evt=trigger.getl(current); - if(evt&&evt.es) return cards.addArray(evt.es.filter(i=>i.name=='taipingyaoshu')); - }); - game.cardsGotoSpecial(cards); - game.log(cards,'被销毁了'); - } - } - } - }, - jsrgxundao:{ - audio:2, - trigger:{player:'judge'}, - filter:function(event,player){ - return game.hasPlayer(current=>current.countCards('he')); - }, - direct:true, - content:function(){ - 'step 0' - var prompt2=get.translation(player)+'(你)的'+(trigger.judgestr||'')+'判定为'+ - get.translation(player.judging[0])+','+'是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?'; - player.chooseTarget(get.prompt('jsrgxundao'),prompt2,[1,2],(card,player,target)=>{ - return target.countCards('he'); - }).set('ai',target=>{ - var player=_status.event.player; - if(!_status.event.todiscard) return 0; - if(_status.event.todiscard!='all'){ - if(target==_status.event.todiscard) return 100; - } - return get.effect(target,{name:'guohe_copy2'},player,player)/2; - }).set('todiscard',function(){ - if(trigger.judgestr=='闪电'&&get.damageEffect(player,null,player,'thunder')>=0) return 'all'; - var friends=game.filterPlayer(i=>get.attitude(i,player)>0); - for(var friend of friends){ - var cardsx=friend.getCards('he',card=>trigger.judge(card)>0); - cardsx.sort((a,b)=>{ - return get.value(a)-get.value(b); - }); - if(cardsx.length){ - var card=cardsx[0]; - if(trigger.judge(player.judging[0])>=0){ - if(get.value(card)>4) return false; - } - return get.owner(card); - } - } - return 'all'; - }()) - 'step 1' - if(result.bool){ - var targets=result.targets; - targets.sortBySeat(_status.currentPhase); - event.targets=targets; - player.logSkill('jsrgxundao',targets); - event.cards=[]; - } - else event.finish(); - 'step 2' - var target=targets.shift(); - target.chooseToDiscard('寻道:请弃置一张牌'+(target==player?'':',可能被作为新判定牌'),'he',true).set('ai',target=>{ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0.1; - if(attitude>0){ - return result+0.01; - } - else{ - return 0.01-result; - } - }); - 'step 3' - if(result.bool){ - event.cards.addArray(result.cards); - } - if(targets.length) event.goto(2); - 'step 4' - var cards=event.cards.filterInD('d'); - if(cards.length){ - player.chooseButton(['寻道:选择一张作为新判定牌',cards],true).set('ai',button=>{ - return trigger.judge(button.link); - }); - } - else event.finish(); - 'step 5' - if(result.bool){ - var card=result.links[0]; - event.card=card; - game.cardsGotoOrdering(card).relatedEvent=trigger; - } - else event.finish(); - 'step 6' - if(player.judging[0].clone){ - game.broadcastAll(function(card,card2,player){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); - } - var node=player.$throwordered(card2.copy(),true); - node.classList.add('thrownhighlight'); - ui.arena.classList.add('thrownhighlight'); - },player.judging[0],card,player); - game.addVideo('deletenode',player,get.cardsInfo([player.judging[0].clone])); - } - game.cardsDiscard(player.judging[0]); - player.judging[0]=card; - trigger.orderingCards.add(card); - game.log(player,'的判定牌改为',card); - game.delay(2); - }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } - }, - jsrglinghua:{ - audio:2, - trigger:{ - player:['phaseZhunbeiBegin','phaseJieshuBegin'], - }, - prompt2:function(event,player){ - var zhunbei=event.name=='phaseZhunbei'; - return '进行目标为你'+(zhunbei?'':'且效果反转')+'的【闪电】判定。若你未因此受到伤害,你可以'+(zhunbei?'令一名角色回复1点体力':'对一名角色造成1点雷电伤害'); - }, - check:function(event,player){ - var e2=player.getEquip(2); - if(e2&&e2.name=='taipingyaoshu') return true; - if(event.name=='phaseZhunbei'&&game.hasPlayer(current=>{ - return get.recoverEffect(current,player,player)>=0; - })) return true; - if(event.name=='phaseJieshu'&&game.hasPlayer(current=>{ - return get.damageEffect(current,player,player,'thunder')>=0; - })&&player.hasSkillTag('rejudge')&&player.hasCard(card=>{ - return lib.card.shandian.judge(card)<0; - },'he')) return true; - return false; - }, - content:function(){ - 'step 0' - var judge=trigger.name=='phaseZhunbei'?lib.card.shandian.judge:function(card){ - if(get.suit(card)!='spade'||get.number(card)<=1||get.number(card)>=10) return -5; - return 1; - } - player.judge(judge,get.translation('shandian')).set('judge2',lib.card.shandian.judge2); - game.delayx(1.5); - 'step 1' - var name='shandian'; - if(event.cancelled&&!event.direct){ - if(lib.card[name].cancel){ - var next=game.createEvent(name+'Cancel'); - next.setContent(lib.card[name].cancel); - next.cards=[]; - next.card=get.autoViewAs({name:name}); - next.player=player; - } - } - else{ - var next=game.createEvent(name); - next.setContent(function(){ - if(result.bool==false){ - player.damage(3,'thunder','nosource'); - } - }); - next._result=result; - next.cards=[]; - next.card=get.autoViewAs({name:name}); - next.player=player; - } - 'step 2' - if(!player.hasHistory('damage',evt=>{ - return evt.card&&evt.card.name=='shandian'&&evt.getParent(2)==event; - })){ - if(trigger.name=='phaseZhunbei'){ - player.chooseTarget('灵化:是否令一名角色回复1点体力?').set('ai',target=>{ - var player=_status.event.player; - return get.recoverEffect(target,player,player); - }); - } - else{ - player.chooseTarget('灵化:是否对一名角色造成1点雷电伤害?').set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player,'thunder'); - }); - } - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target); - if(trigger.name=='phaseZhunbei') target.recover(); - else target.damage('thunder'); - } - }, - ai:{ - threaten:2.8 - } - }, //官盗S特015神马超 psshouli:{ audio:'shouli', @@ -8539,10 +6274,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, characterReplace:{}, dynamicTranslate:{ - jsrgshichong:function(player){ - if(player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; - return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; - }, }, translate:{ sp_gongsunzan:'SP公孙瓒', @@ -8762,7 +6493,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zyshilu_info:'①一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。', zyxiongnve:'凶虐', zyxiongnve_info:'①出牌阶段开始时,你可以将一张“戮”置入武将牌堆并选择一项直到回合结束:1.当你造成伤害时,此伤害+1;2.当你对其他角色造成伤害时,获得其一张牌;3.你使用牌无次数限制。②出牌阶段结束时,你可以将两张“戮”置入武将牌堆,然后当你于下回合开始前受到其他角色造成的伤害时,此伤害-1。', - pe_wenqin:'文钦', + pe_wenqin:'战役篇文钦', + pe_wenqin_ab:'文钦', gzjinfa:'矜伐', gzjinfa_info:'出牌阶段限一次。你可以弃置一张牌,令一名其他角色选择一项:1.令你获得其一张牌;2.交给你一张装备牌,若此牌花色为♠,其视为对你使用一张【杀】。', zyshangyi:'尚义', @@ -8861,116 +6593,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pkmiewu:'灭吴', pkmiewu2:'灭吴', pkmiewu_info:'每回合限一次。你可移去1枚“武库”,视为使用或打出任意一张基本牌或普通锦囊牌,然后摸一张牌。', - //江山如故·起 - jsrg_liuhong:'起刘宏', - jsrg_liuhong_ab:'刘宏', - jsrgchaozheng:'朝争', - jsrgchaozheng_info:'准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。', - jsrgshenchong:'甚宠', - jsrgshenchong_info:'限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。', - jsrgjulian:'聚敛', - jsrgjulian_info:'主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。', - jsrgfeiyang:'飞扬', - jsrgfeiyang_info:'判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。', - jsrgbahu:'跋扈', - jsrgbahu_info:'锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。', - jsrg_hejin:'起何进', - jsrg_hejin_ab:'何进', - jsrgzhaobing:'诏兵', - jsrgzhaobing_info:'结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。', - jsrgzhuhuan:'诛宦', - jsrgzhuhuan_info:'准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。', - jsrgyanhuo:'延祸', - jsrgyanhuo_info:'锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。', - jsrg_sunjian:'起孙坚', - jsrg_sunjian_ab:'孙坚', - jsrgpingtao:'平讨', - jsrgpingtao_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。', - jsrgjuelie:'绝烈', - jsrgjuelie_info:'①当你造成渠道为【杀】的伤害时,若你的手牌数或体力值最小,此伤害+1。②当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌。', - jsrg_huangfusong:'起皇甫嵩', - jsrg_huangfusong_ab:'皇甫嵩', - jsrgguanhuo:'观火', - jsrgguanhuo_info:'①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。', - jsrgjuxia:'居下', - jsrgjuxia_info:'每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。', - jsrg_xushao:'起许劭', - jsrg_xushao_ab:'许劭', - jsrgyingmen:'盈门', - jsrgyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', - jsrgpingjian:'评鉴', - jsrgpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。', - jsrg_dongbai:'起董白', - jsrg_dongbai_ab:'董白', - jsrgshichong:'恃宠', - jsrgshichong_info:'转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。', - jsrglianzhu:'连诛', - jsrglianzhu_info:'出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。', - jsrg_qiaoxuan:'起桥玄', - jsrg_qiaoxuan_ab:'桥玄', - jsrgjuezhi:'绝质', - jsrgjuezhi_info:'①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。', - jsrgjizhao:'急召', - jsrgjizhao_info:'准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。', - jsrg_yangbiao:'起杨彪', - jsrg_yangbiao_ab:'杨彪', - jsrgzhaohan:'昭汉', - jsrgzhaohan_info:'准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。', - jsrgrangjie:'让节', - jsrgrangjie_info:'当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。', - jsrgyizheng:'义争', - jsrgyizheng_info:'出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。', - jsrg_kongrong:'起孔融', - jsrg_kongrong_ab:'孔融', - jsrglirang:'礼让', - jsrglirang_info:'每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。', - jsrgzhengyi:'争义', - jsrgzhengyi_info:'当你每回合首次受到伤害时,本轮因〖礼让〗获得过牌的其他角色可以将此伤害转移给其。', - jsrg_zhujun:'起朱儁', - jsrg_zhujun_ab:'朱儁', - jsrgfendi:'分敌', - jsrgfendi_tag:'分敌', - jsrgfendi_info:'每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你获得这些牌。', - jsrgjuxiang:'拒降', - jsrgjuxiang_info:'当你不于摸牌阶段获得牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。', - jsrg_liubei:'起刘备', - jsrg_liubei_ab:'刘备', - jsrgjishan:'积善', - jsrgjishan_info:'①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。', - jsrgzhenqiao:'振鞘', - jsrgzhenqiao_info:'锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。', - jsrg_wangyun:'起王允', - jsrg_wangyun_ab:'王允', - jsrgshelun:'赦论', - jsrgshelun_info:'出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。', - jsrgfayi:'伐异', - jsrgfayi_info:'当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。', - jsrg_liuyan:'起刘焉', - jsrg_liuyan_ab:'刘焉', - jsrgtushe:'图射', - jsrgtushe_info:'当你使用非装备牌指定目标后,你可以展示所有手牌。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。', - jsrgtongjue:'通绝', - jsrgtongjue_info:'主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。', - jsrg_caocao:'起曹操', - jsrg_caocao_ab:'曹操', - jsrgzhenglve:'政略', - jsrgzhenglve_info:'①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。', - jsrghuilie:'会猎', - jsrghuilie_info:'觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。', - jsrgpingrong:'平戎', - jsrgpingrong_info:'每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。', - jsrg_nanhualaoxian:'起南华老仙', - jsrg_nanhualaoxian_ab:'南华老仙', - jsrgshoushu:'授术', - jsrgshoushu_info:'锁定技。①每轮开始时,若游戏内没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', - jsrgxundao:'寻道', - jsrgxundao_info:'当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。', - jsrglinghua:'灵化', - jsrglinghua_info:'①准备阶段,你可以进行目标角色为你的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以进行目标角色为你且判定效果反转的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。', - sbyingmen:'盈门', - sbyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', - sbpingjian:'评鉴', - sbpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。', + //天书乱斗虚拟偶像 vtb_xiaosha:'小杀', vtbguisha:'瑰杀', vtbguisha_info:'当其他角色使用【杀】时,你可以弃置一张牌令此【杀】不计入次数,且此【杀】对目标角色造成的伤害+1。', @@ -9001,7 +6624,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ offline_sticker:'桌游志·贴纸', offline_luanwu:'文和乱武', offline_yongjian:'用间篇', - offline_jiangshanruguqi:'江山如故·起', offline_feihongyingxue:'飞鸿映雪', offline_piracyE:'官盗E系列·战役篇', offline_piracyS:'官盗S系列', diff --git a/character/old.js b/character/old.js index 150478ec7..2ae282792 100755 --- a/character/old.js +++ b/character/old.js @@ -953,7 +953,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_zhugezhan:"旧诸葛瞻", zhangliang:'SP张梁', yuji:'旧于吉', - old_zhangfei:'十周年张飞', + old_zhangfei:'新杀张飞', old_zhangfei_ab:'张飞', old_huatuo:'OL华佗', jsp_caoren:'☆SP曹仁', @@ -966,9 +966,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_caochong:'旧曹冲', old_guanqiujian:'旧毌丘俭', old_huangfusong:'旧皇甫嵩', - ol_liuyu:'OL刘虞', + ol_liuyu:'旧刘虞', old_wangyun:'旧王允', - old_zhaoyun:'十周年赵云', + old_zhaoyun:'新杀赵云', old_zhaoyun_ab:'赵云', ol_huaxiong:'旧华雄', diff --git a/character/rank.js b/character/rank.js index d74424ff4..276fb0fa6 100644 --- a/character/rank.js +++ b/character/rank.js @@ -303,6 +303,12 @@ window.noname_character_rank={ 'shichangshi', 'ol_wenqin', 'clan_zhonghui', + 'jsrg_chunyuqiong', + 'jsrg_guanyu', + 'dc_caocao', + 'dc_liubei', + 'dc_sunquan', + 'yuechen', 'key_misuzu', 'key_sunohara', 'key_umi', @@ -587,6 +593,9 @@ window.noname_character_rank={ 'yanghong', 'dc_sunhanhua', 'shen_dianwei', + 'zhoubuyi', + 'jsrg_sunce', + 're_caorui', ], bp:[ 'chess_diaochan', @@ -932,6 +941,10 @@ window.noname_character_rank={ 'ol_mengda', 'dc_wuban', 're_caochong', + 'jsrg_lvbu', + 'jsrg_xuyou', + 'jsrg_zhangliao', + 'jsrg_zhenji', ], b:[ 'diy_feishi', @@ -1221,7 +1234,6 @@ window.noname_character_rank={ 'vtb_xiaoshan', 'vtb_xiaotao', 'zhangchu', - 'dc_duyu', 'chentai', 'clan_zhongyan', 'sb_zhurong', @@ -1229,6 +1241,9 @@ window.noname_character_rank={ 'xizheng', 'dc_duyu', 'clan_wanghun', + 'jsrg_chendeng', + 'jsrg_zhanghe', + 'jsrg_zoushi', ], bm:[ 'diy_xizhenxihong', @@ -1418,6 +1433,7 @@ window.noname_character_rank={ 'qianzhao', 'vtb_xiaosha', 'huanfan', + 'jsrg_xugong', ], c:[ 'xiahoudun', diff --git a/character/refresh.js b/character/refresh.js index 9f5ea86c8..b82103a08 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -13,13 +13,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refresh_yijiang2:['re_madai','re_wangyi','xin_handang','xin_zhonghui','re_liaohua','re_chengpu','re_caozhang','dc_bulianshi','xin_liubiao','re_xunyou','re_guanzhang'], refresh_yijiang3:['re_jianyong','re_guohuai','re_zhuran','re_panzhangmazhong','xin_yufan','dc_liru','re_manchong','re_fuhuanghou','re_guanping','re_liufeng','re_caochong'], refresh_yijiang4:['re_sunluban','re_wuyi','re_hanhaoshihuan','re_caozhen','re_zhoucang','dc_chenqun','re_caifuren','re_guyong','re_jushou','re_zhuhuan','re_zhangsong'], - refresh_yijiang5:['re_zhangyi','re_quancong','re_caoxiu','re_sunxiu','re_gongsunyuan','re_guotufengji','re_xiahoushi','re_liuchen','re_zhuzhi'], + refresh_yijiang5:['re_zhangyi','re_quancong','re_caoxiu','re_sunxiu','re_gongsunyuan','re_guotufengji','re_xiahoushi','re_liuchen','re_zhuzhi','re_caorui'], refresh_yijiang6:['re_guohuanghou','re_sundeng'], refresh_xinghuo:['re_duji','dc_gongsunzan','re_sp_taishici','re_caiyong','re_mazhong','re_wenpin','re_jsp_huangyueying'], }, }, connect:true, character:{ + re_caorui:['male','wei',3,['huituo','mingjian','rexingshuai'],['unseen','zhu']], re_caochong:['male','wei',3,['rechengxiang','renxin']], ol_zhangzhang:['male','wu',3,['olzhijian','olguzheng']], re_jsp_huangyueying:['female','qun',3,['rejiqiao','relinglong']], @@ -162,6 +163,95 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_guohuai:['xiahouyuan','zhanghe'], }, skill:{ + //堪比界曹冲的界曹叡 + rexingshuai:{ + audio:2, + skillAnimation:true, + animationColor:'thunder', + trigger:{player:'dying'}, + zhuSkill:true, + filter:function(event,player){ + if(player.hp>0) return false; + if(!player.hasZhuSkill('rexingshuai')) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wei'; + }); + }, + init:function(player){ + if(player.hasZhuSkill('rexingshuai')){ + player.markSkill('rexingshuai'); + player.storage.rexingshuai=false; + } + }, + intro:{ + content:'limited', + }, + limited:true, + mark:false, + content:function(){ + 'step 0' + player.awakenSkill('rexingshuai'); + var targets=game.filterPlayer(); + targets.sortBySeat(_status.currentPhase); + targets.remove(player); + event.targets=targets; + event.damages=[]; + player.addSkill('rexingshuai_restore'); + 'step 1' + if(event.targets.length){ + var current=event.targets.shift(); + if(current.group=='wei'){ + current.chooseBool('是否令'+get.translation(player)+'回复一点体力?').set('ai',function(){ + return get.attitude(_status.event.player,_status.event.target)>2; + }).set('target',player); + event.current=current; + } + else{ + event.redo(); + } + } + else{ + event.goto(3); + } + 'step 2' + if(result.bool){ + event.damages.push(event.current); + event.current.line(player,'green'); + game.log(event.current,'令',player,'回复一点体力'); + player.recover(); + } + if(event.targets.length){ + event.goto(1); + } + 'step 3' + if(event.damages.length){ + var next=game.createEvent('rexingshuai_next'); + event.next.remove(next); + trigger.after.push(next); + next.targets=event.damages; + next.setContent(function(){ + targets.shift().damage(); + if(targets.length) event.redo(); + }); + } + }, + subSkill:{ + restore:{ + trigger:{ + global:'dieAfter', + }, + charlotte:true, + forced:true, + filter:function(event,player){ + return event.source&&event.source.isIn()&&event.source.hasSkill('mingjian2'); + }, + content:function(){ + player.restoreSkill('rexingshuai'); + game.log(player,'重置了','#g【兴衰】'); + } + }, + } + }, //不想突破可以不突破的界曹冲 rechengxiang:{ audio:2, @@ -2136,7 +2226,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //界荀彧 oljieming:{ audio:2, - trigger:{player:['damageEnd','dieAfter']}, + trigger:{player:['damageEnd','die']}, direct:true, forceDie:true, filter:function(event,player){ @@ -14571,7 +14661,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shizhan_info:'出牌阶段限两次,你可以选择一名其他角色。该角色视为对你使用一张【决斗】。', ol_xunyu:'界荀彧', oljieming:'节命', - oljieming_info:'当你受到1点伤害后或死亡后,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。', + oljieming_info:'当你受到1点伤害后或死亡时,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。', re_liufeng:'界刘封', rexiansi:'陷嗣', rexiansi2:'陷嗣', @@ -14664,6 +14754,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_caochong:'界曹冲', rechengxiang:'称象', rechengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。若你获得的牌点数之和为13,你复原武将牌。', + re_caorui:'界曹叡', + rexingshuai:'兴衰', + rexingshuai_info:'主公技,限定技。当你进入濒死状态时,你可令其他魏势力角色依次选择是否令你回复1点体力。然后这些角色依次受到1点伤害。有〖明鉴〗效果的角色于其回合内杀死角色后,你重置〖兴衰〗。', refresh_standard:'界限突破·标', refresh_feng:'界限突破·风', diff --git a/character/sb.js b/character/sb.js index 523e7ff1c..c50977cb8 100644 --- a/character/sb.js +++ b/character/sb.js @@ -707,7 +707,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseJieshuBegin'}, forced:true, content:function(){ - player.draw(Math.min(5,game.countPlayer(current=>{ + player.draw(Math.min(5,game.countPlayer2(current=>{ return current.getHistory('damage').length>0; })+1)); } @@ -4608,7 +4608,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sblijian:'离间', sblijian_info:'出牌阶段限一次。你可以选择至少两名其他角色并弃置X张牌(X为你选择的角色数-1)。然后每名你选择的角色依次视为对这些角色中与其逆时针座次最近的另一名角色使用一张【决斗】。', sbbiyue:'闭月', - sbbiyue_info:'锁定技。结束阶段,你摸Y张牌(Y为本回合受到过伤害的角色数+1且至多为5)。', + sbbiyue_info:'锁定技。结束阶段,你摸Y张牌(Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为5)。', sb_pangtong:'谋庞统', sblianhuan:'连环', sblianhuan_info:'①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。', diff --git a/character/shenhua.js b/character/shenhua.js index 48fe50a6f..da831624d 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -7686,14 +7686,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiaxu:['re_jiaxu','jiaxu','ns_jiaxu','ps_jiaxu'], dongzhuo:['ol_dongzhuo','sp_dongzhuo','re_dongzhuo','dongzhuo','yj_dongzhuo'], dengai:['re_dengai','ol_dengai','dengai'], - sp_ol_zhanghe:['sp_ol_zhanghe','yj_zhanghe','sp_zhanghe'], + sp_ol_zhanghe:['sp_ol_zhanghe','yj_zhanghe','sp_zhanghe','jsrg_zhanghe'], jiangwei:['ol_jiangwei','re_jiangwei','jiangwei'], liushan:['ol_liushan','re_liushan','liushan'], sunce:['re_sunben','re_sunce','sunce'], zhangzhang:['ol_zhangzhang','re_zhangzhang','zhangzhang'], zuoci:['re_zuoci','zuoci'], caiwenji:['ol_caiwenji','re_caiwenji','caiwenji'], - xuyou:['sp_xuyou','xuyou','yj_xuyou'], + xuyou:['sp_xuyou','xuyou','jsrg_xuyou','yj_xuyou'], guanqiujian:['guanqiujian','tw_guanqiujian','re_guanqiujian','old_guanqiujian'], chendao:['chendao','old_chendao','ns_chendao'], zhugezhan:['zhugezhan','old_zhugezhan'], @@ -7717,7 +7717,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "zhugezhan":"诸葛瞻", "lukang":"陆抗", "haozhao":"郝昭", - "yl_yuanshu":"袁术", + "yl_yuanshu":"雷袁术", + yl_yuanshu_ab:"袁术", "zhangxiu":"张绣", "chendao":"陈到", "guanqiujian":"毌丘俭", @@ -8026,7 +8027,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ weiyan:'旧魏延', xiaoqiao:'旧小乔', zhoutai:'界周泰', - zhangjiao:'张角', + zhangjiao:'旧张角', //yuji:'于吉', shensu:'神速', shensu1:'神速', diff --git a/character/shiji.js b/character/shiji.js index 89478594d..17f0102f4 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -6482,7 +6482,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mingfa_info:'①结束阶段,你可展示一张牌并记录为“明伐”。②出牌阶段开始时,若“明伐”牌在你的手牌区或装备区,则你可以使用“明伐”牌与一名其他角色拼点。若你赢:你获得对方一张牌并从牌堆中获得一张点数等于“明伐”牌牌面点数-1的牌。若你没赢:你本回合不能使用牌指定其他角色为目标。③你的拼点牌亮出后,你令此牌的点数+2。', rongbei:'戎备', rongbei_info:'限定技。出牌阶段,你可选择一名有空装备栏的角色。系统为该角色的每个空装备栏选择一张装备牌,然后该角色使用之。', - db_wenyang:'文鸯', + db_wenyang:'手杀文鸯', dbquedi:'却敌', dbquedi_info:'每回合限一次。当你使用【杀】或【决斗】指定唯一目标后,你可选择:①获得目标角色的一张手牌。②弃置一张基本牌,并令此牌的伤害值基数+1。③背水:减1点体力上限,然后依次执行上述所有选项。', dbzhuifeng:'椎锋', @@ -6570,7 +6570,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zjjuxiang_info:'限定技。一名其他角色脱离濒死状态时,你可以对其造成1点伤害,然后摸X张牌(X为其体力上限且至多为5)。', houfeng:'厚俸', houfeng_info:'每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。', - liuba:'刘巴', + liuba:'手杀刘巴', duanbi:'锻币', duanbi_info:'出牌阶段限一次。若场上所有角色的手牌数之和大于角色数之和的二倍,则你可以令所有其他角色各弃置X张手牌(X为该角色手牌数的一半且向下取整且至多为3)。然后你可选择一名角色,令其随机获得三张以此法被弃置的牌。', tongduo:'统度', diff --git a/character/sp.js b/character/sp.js index c9336bdc7..73c531d10 100755 --- a/character/sp.js +++ b/character/sp.js @@ -4181,7 +4181,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'huanshi', trigger:{global:'judge'}, filter:function(event,player){ - return player.countCards('he')>0; + return player.countCards('h')>0; }, logTarget:'player', prompt2:function(event,player){ @@ -10591,20 +10591,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', usable:1, - viewAs:{name:'shunshou'}, + viewAs:{ + name:'shunshou', + storage:{spweiwu:true}, + }, filterCard:{color:'red'}, position:'hes', check:function(card){ return 7-get.value(card); }, - filterTarget:function(card,player,target){ - if(target.countCards('h')0&&game.hasPlayer(function(current){ - return current.countCards('h')>=player.countCards('h')&&player.canUse('shunshou',current); - }); + mod:{ + targetInRange:function(card){ + if(card.storage&&card.storage.spweiwu) return true; + }, }, }, tuogu:{ @@ -23030,7 +23029,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_caiwenji:'SP蔡琰', zhugeguo:'诸葛果', lingcao:'凌操', - sunru:'孙茹', + sunru:'手杀孙茹', lingju:'灵雎', lifeng:'李丰', jsp_guanyu:'SP关羽', @@ -23073,8 +23072,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ caoying:"曹婴", simahui:"司马徽", baosanniang:"OL鲍三娘", - pangdegong:"庞德公", - zhaotongzhaoguang:"赵统赵广", + pangdegong:"手杀庞德公", + zhaotongzhaoguang:"手杀赵统赵广", majun:"马钧", simazhao:"司马昭", wangyuanji:"王元姬", @@ -23646,7 +23645,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spniluan:'逆乱', spniluan_info:'出牌阶段,你可以将一张黑色牌当做【杀】使用。此【杀】使用结算完成后,若你未因此【杀】造成过伤害,则你令此【杀】不计入使用次数。', spweiwu:'违忤', - spweiwu_info:'出牌阶段限一次,你可以将一张红色牌当做【顺手牵羊】对手牌数不小于你的角色使用。', + spweiwu_info:'出牌阶段限一次,你可以将一张红色牌当无距离限制的【顺手牵羊】使用。', spmouzhu:'谋诛', spmouzhu_backup:'谋诛', spmouzhu_info:'出牌阶段限一次,你可以选择任意名“距离为1”或“体力值等于你”的其他角色,这些角色依次进行以下结算:交给你一张手牌,然后若其手牌数小于你,则其视为对你使用一张【杀】或【决斗】。', @@ -23680,7 +23679,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ chengshang:'承赏', chengshang_info:'当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗获得过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。', chengshang_info_guozhan:'当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗获得过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。', - panshu:'潘淑', + panshu:'OL潘淑', weiyi:'威仪', weiyi_info:'每名角色限一次。当有角色受到伤害后,你可选择:①若其体力值不小于你,则其失去1点体力。②若其体力值不大于你且其已受伤,则其回复1点体力。', jinzhi:'锦织', @@ -23693,7 +23692,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wangong:'挽弓', wangong2:'挽弓', wangong_info:'锁定技,当你使用基本牌时,你获得如下效果:当你使用下一张牌时,若此牌为【杀】,则此牌无次数和距离限制且伤害+1。', - huangchengyan:'黄承彦', + huangchengyan:'OL黄承彦', guanxu:'观虚', guanxu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶5张牌中的一张交换。若如此做,你弃置其手牌中3张花色相同的牌。', yashi:'雅士', @@ -23795,7 +23794,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spmanwang_info:'出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。', sppanqin:'叛侵', sppanqin_info:'出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项。', - tengfanglan:'滕芳兰', + tengfanglan:'OL滕芳兰', luochong:'落宠', luochong_info:'准备阶段开始时/当你于一回合内首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):⒈令一名角色回复1点体力。⒉令一名角色失去1点体力。⒊令一名角色弃置两张牌。⒋令一名角色摸两张牌。', aichen:'哀尘', @@ -23894,7 +23893,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xindiaodu:"调度", xindiaodu_info:"①每回合限一次,与你势力相同的角色使用装备牌时,其可以摸一张牌。②出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。", olhuanshi:'缓释', - olhuanshi_info:'一名角色的判定牌生效前,你可以令其观看你的牌并选择其中的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。', + olhuanshi_info:'一名角色的判定牌生效前,你可以令其观看你的手牌并选择你的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。', olhongyuan:'弘援', olhongyuan_info:'每阶段限一次。当你一次性获得至少两张牌以后,你可以将至多两张牌交给等量名角色。', olmingzhe:'明哲', @@ -23902,7 +23901,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ahuinan:'阿会喃', jueman:'蟨蛮', jueman_info:'锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均不为你,你视为使用本回合被使用的第三张基本牌;有且仅有其中之一为你,你摸一张牌。', - ol_liuba:'刘巴', + ol_liuba:'OL刘巴', oltongduo:'统度', oltongduo_info:'准备阶段,你可以令一名角色交给你一张手牌,然后出牌阶段结束时,你将此牌置于牌堆顶。', olzhubi:'铸币', diff --git a/character/sp2.js b/character/sp2.js index b359a4783..55591f96f 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,7 +4,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ - dc_wangjun:['male','qun',4,['dcmianyao','dcchangqu']], dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']], dc_mengda:['male','wei',4,['dclibang','dcwujie']], dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji'],['unseen']], @@ -108,238 +107,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'], sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'], sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'], - sp_decade:['caobuxing','re_maliang','xin_baosanniang','dc_wangjun'], + sp_decade:['caobuxing','re_maliang','xin_baosanniang'], } }, skill:{ - //新服灭霸 - dcmianyao:{ - audio:2, - trigger:{ - player:'phaseDrawEnd', - }, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; - }, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('dcmianyao'),'展示点数最小的一张牌并随机插入牌堆中,然后于回合结束时摸此牌点数张牌。',function(card,player){ - var num=get.number(card,player); - return !player.hasCard(card2=>{ - return card!=card2&&get.number(card2,player){ - var player=_status.event.player; - var value=player.getUseValue(card,null,true); - if(value>5&&get.number(card)<=2) return 0; - return 1+1/Math.max(0.1,value); - }); - 'step 1' - if(result.bool){ - player.logSkill('dcmianyao'); - var card=result.cards[0]; - event.card=card; - player.showCards([card],get.translation(player)+'发动了【免徭】'); - } - else event.finish(); - 'step 2' - player.$throw(1,1000); - player.lose(card,ui.cardPile).insert_index=function(){ - return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; - } - player.addTempSkill('dcmianyao_draw'); - var num=get.number(card); - if(num>0) player.addMark('dcmianyao_draw',num,false); - }, - subSkill:{ - draw:{ - trigger:{ - player:'phaseEnd', - }, - filter:function(event,player){ - return player.hasMark('dcmianyao_draw'); - }, - forced:true, - charlotte:true, - onremove:true, - content:function(){ - player.draw(player.countMark('dcmianyao_draw')); - }, - } - } - }, - dcchangqu:{ - audio:2, - enable:'phaseUse', - usable:1, - selectTarget:function(){ - return [1,game.countPlayer()-1]; - }, - complexSelect:true, - complexTarget:true, - multitarget:true, - multiline:true, - filterTarget:function(card,player,target){ - if(player==target) return false; - var next=player.getNext(),prev=player.getPrevious(); - var selected=ui.selected.targets; - if(!selected.contains(next)&&!selected.contains(prev)) return (target==next||target==prev); - for(var i of selected){ - if(i.getNext()==target||i.getPrevious()==target) return true; - } - return false; - }, - contentBefore:function(){ - event.getParent()._dcchangqu_targets=targets.slice(); - }, - content:function(){ - 'step 0' - event.targets=event.getParent()._dcchangqu_targets; - var current=targets[0]; - current.addMark('dcchangqu_warship'); - current.addMark('dcchangqu_warshipx',1,false); - event.num=0; - game.delayx(); - 'step 1' - var target=targets.shift(); - event.target=target; - var num=Math.max(1,event.num); - var nextPlayer=targets.find(i=>{ - return i.isIn(); - }); - if(target.hasMark('dcchangqu_warshipx')){ - var prompt2='是否交给'+get.translation(player)+get.cnNumber(num)+'张手牌?'+(nextPlayer?'若如此做,将“战舰”移动给'+get.translation(nextPlayer)+',':',')+'否则你下次受到的属性伤害值+'+num; - target.chooseCard(get.translation(player)+'对你发动了【长驱】',prompt2).set('ai',card=>{ - if(_status.event.att>0) return 6-get.value(card); - if(_status.event.take) return -get.value(card); - return 5-get.value(card); - }).set('att',get.attitude(target,player)).set('take',function(){ - var base=num; - var getEffect=function(target,player,num){ - var natures=['fire','thunder','ice']; - return natures.map(nature=>{ - return get.damageEffect(target,target,player,nature)*Math.sqrt(num)/Math.min(1.5,1+target.countCards('h')); - }).reduce((sum,eff)=>{ - return sum+eff; - },0)/natures.length; - } - var eff=getEffect(player,player,base); - return targets.some((current,ind)=>{ - var num=base+ind+1; - var effx=getEffect(current,player,num); - return effx{ - return i.isIn(); - }); - if(nextPlayer){ - target.line(nextPlayer); - nextPlayer.addMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); - nextPlayer.addMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); - event.goto(1); - game.delayx(); - } - target.removeMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); - target.removeMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); - 'step 4' - var targets=game.players.slice().concat(game.dead); - targets.forEach(i=>{ - delete i.storage.dcchangqu_warshipx; - }); - }, - ai:{ - order:10, - expose:0.05, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - var targets=game.filterPlayer(i=>i!=player); - targets.sortBySeat(player); - var targets2=targets.reverse(); - var sum=0; - var maxSum=-Infinity,maxIndex=-1; - var maxSum2=-Infinity,maxIndex2=-1; - for(var i=0;imaxSum){ - maxSum=sum; - maxIndex=i; - } - } - var sum=0; - for(var i=0;imaxSum2){ - maxSum2=sum; - maxIndex2=i; - } - } - if(maxSummaxIndex) return -100*get.sgnAttitude(player,target); - if(target==targets[ui.selected.targets.length]) return get.sgnAttitude(player,target); - return 0; - } - }, - }, - subSkill:{ - warship:{ - marktext:'舰', - intro:{ - name:'战舰', - name2:'战舰', - content:'这里停了&艘战舰!不过啥用没有。', - } - }, - add:{ - trigger:{ - player:'damageBegin3', - }, - filter:function(event,player){ - return event.nature&&player.hasMark('dcchangqu_add'); - }, - forced:true, - onremove:true, - charlotte:true, - content:function(){ - 'step 0' - trigger.num+=player.countMark('dcchangqu_add'); - player.removeSkill('dcchangqu_add'); - }, - marktext:'驱', - intro:{ - content:'下次受到的属性伤害+#', - } - }, - } - }, //魏关羽 dcdanji:{ audio:'danji', @@ -1036,14 +807,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCardToPlayered'}, usable:1, filter:function(event,player){ - return player.countCards('e')>0&&event.card.name=='sha'&&event.getParent().triggeredTargets3.length==event.targets.length; + return event.card.name=='sha'&&event.getParent().triggeredTargets3.length==event.targets.length; }, check:function(event,player){ return event.targets.some(target=>get.effect(target,event.card,player,player)<=0); }, content:function(){ 'step 0' - var num=player.countCards('e'); + var num=player.countCards('e')+1; event.num=num; player.draw(num); 'step 1' @@ -1072,7 +843,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var eff=get.effect(targetx,{name:'sha'},player,player); delete _status._dctingxian_aiChecking; if(eff<0) return true; - }).length=3){ str+=';始终跳过弃牌阶段'; } - if(num>=4){ + if(num==0||num>=4){ str+=';造成的伤害+1'; } return str; @@ -9624,7 +9398,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xinfu_xingzhao2":{ audio:true, trigger:{ - player:"phaseDiscardBefore", + player:['phaseJudgeBefore','phaseDiscardBefore'], }, forced:true, filter:function(event,player){ @@ -9635,7 +9409,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ trigger.cancel(); - game.log(player,'跳过了弃牌阶段'); + game.log(player,'跳过了'+(trigger.name=='phaseJudge'?'判定':'弃牌')+'阶段'); }, }, xinfu_xingzhao3:{ @@ -9648,7 +9422,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=game.countPlayer(function(current){ return current.isDamaged(); }); - return num>=4; + return num==0||num>=4; }, content:function(){ trigger.num++; @@ -10046,6 +9820,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsp_guanyu:['dc_jsp_guanyu','jsp_guanyu'], mushun:['mushun','sp_mushun'], wangjun:['dc_wangjun','wangjun'], + zoushi:['re_zoushi','jsrg_zoushi'], }, translate:{ lijue:"李傕", @@ -10059,8 +9834,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangqiying:"张琪瑛", sp_liuqi:'刘琦', xf_tangzi:"唐咨", - xf_huangquan:"黄权", - xf_sufei:"苏飞", + xf_huangquan:"OL黄权", + xf_sufei:"OL苏飞", "xinfu_langxi":"狼袭", "xinfu_langxi_info":"准备阶段,你可以对一名体力小于或等于你的其他角色造成0~2点随机伤害。", "xinfu_yisuan":"亦算", @@ -10102,7 +9877,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xz_xunxun":"恂恂", "xz_xunxun_info":"摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", "xinfu_xingzhao":"兴棹", - "xinfu_xingzhao_info":"锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,弃牌阶段开始时,你跳过此阶段。若X≥4,当你造成伤害时,此伤害+1。(X为场上已受伤的角色数)", + "xinfu_xingzhao_info":"锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段。若X=0或X≥4,当你造成伤害时,此伤害+1(X为场上已受伤的角色数)。", "xinfu_xingzhao2":"兴棹", "xinfu_xingzhao2_info":"", xinfu_xingzhao3:'兴棹', @@ -10515,13 +10290,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczuojian_info:'出牌阶段结束时,若你于此阶段使用过的牌数不小于体力值,你可以选择一项:1.令装备区牌数多于你的角色各摸一张牌;2.弃置装备区牌数少于你的角色各一张手牌。', sunlang:'孙狼', dctingxian:'铤险', - dctingxian_info:'每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数)。', + dctingxian_info:'每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。', dcbenshi:'奔矢', dcbenshi_info:'锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。', sunhuan:'孙桓', dcniji:'逆击', dcniji_info:'①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,若你于本回合获得的“逆击”数不小于你的体力值,你可以使用一张“逆击”。你弃置所有“逆击”。', - //dc_fuwan:'十周年伏完', + //dc_fuwan:'新杀伏完', //dc_fuwan_ab:'伏完', dcmoukui:'谋溃', dcmoukui_info:'当你使用【杀】指定第一个目标后,你可以选择任意项:1.摸一张牌;2.弃置其中一个目标角色一张牌。若你均选择,当此【杀】被无效后或被抵消后,该角色弃置你一张牌。', @@ -10547,11 +10322,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcdanji_info:'觉醒技。准备阶段,若你的手牌数大于体力值,你减1点体力上限,将体力回复至体力上限,然后获得〖马术〗和〖怒嗔〗。', dcnuchen:'怒嗔', dcnuchen_info:'出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。', - dc_wangjun:'王濬', - dcmianyao:'免徭', - dcmianyao_info:'摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。', - dcchangqu:'长驱', - dcchangqu_info:'出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", diff --git a/character/standard.js b/character/standard.js index 073d1a8e4..f63932fd3 100755 --- a/character/standard.js +++ b/character/standard.js @@ -2471,17 +2471,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterReplace:{ - caocao:['re_caocao','caocao'], + caocao:['re_caocao','caocao','dc_caocao'], guojia:['re_guojia','guojia','ps1059_guojia','ps2070_guojia'], simayi:['re_simayi','simayi','ps_simayi','ps2068_simayi'], jin_simayi:['jin_simayi','junk_simayi','ps_jin_simayi'], zhenji:['re_zhenji','yj_zhenji','zhenji'], xuzhu:['re_xuzhu','xuzhu'], zhangliao:['re_zhangliao','zhangliao'], - sp_zhangliao:['sp_zhangliao','yj_zhangliao'], + sp_zhangliao:['sp_zhangliao','yj_zhangliao','jsrg_zhangliao'], xiahoudun:['re_xiahoudun','xin_xiahoudun','xiahoudun'], - liubei:['re_liubei','liubei','junk_liubei'], - guanyu:['re_guanyu','guanyu','ps_guanyu'], + liubei:['re_liubei','liubei','dc_liubei','junk_liubei'], + guanyu:['re_guanyu','guanyu','jsrg_guanyu','ps_guanyu'], zhangfei:['re_zhangfei','tw_zhangfei','xin_zhangfei','old_zhangfei','zhangfei','yj_zhangfei'], zhaoyun:['re_zhaoyun','old_zhaoyun','zhaoyun','ps2063_zhaoyun','ps2067_zhaoyun'], sp_zhaoyun:['sp_zhaoyun','jsp_zhaoyun'], @@ -2489,7 +2489,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_machao:['sp_machao','old_machao'], zhugeliang:['re_zhugeliang','zhugeliang','ps2066_zhugeliang','ps_zhugeliang'], huangyueying:['re_huangyueying','huangyueying','junk_huangyueying'], - sunquan:['re_sunquan','sunquan'], + sunquan:['re_sunquan','sunquan','dc_sunquan'], zhouyu:['re_zhouyu','zhouyu','ps1062_zhouyu','ps2080_zhouyu'], luxun:['re_luxun','luxun'], lvmeng:['re_lvmeng','lvmeng'], @@ -2498,7 +2498,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sunshangxiang:['re_sunshangxiang','sunshangxiang'], ganning:['re_ganning','ganning','yongjian_ganning'], yj_ganning:['yj_ganning','sp_ganning'], - lvbu:['re_lvbu','lvbu','ps_lvbu'], + lvbu:['re_lvbu','lvbu','jsrg_lvbu','ps_lvbu'], diaochan:['re_diaochan','diaochan'], huatuo:['re_huatuo','old_huatuo','huatuo'], huaxiong:['re_huaxiong','old_huaxiong','huaxiong','ol_huaxiong'], diff --git a/character/tw.js b/character/tw.js index 81540bc54..5c80548ca 100644 --- a/character/tw.js +++ b/character/tw.js @@ -13562,7 +13562,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twhanyu_info:'锁定技。游戏开始时,你获得牌堆中的基本牌,锦囊牌,装备牌各一张。', twhengjiang:'横江', twhengjiang_info:'出牌阶段限一次,当你使用基本牌或普通锦囊牌指定唯一目标后,你可将此牌的目标改为攻击范围内的所有合法目标,然后你于此牌结算结束后摸X张牌(X为因响应此牌而使用或打出过牌的角色数)。', - tw_huojun:'霍峻', + tw_huojun:'TW霍峻', twsidai:'伺怠', twsidai_info:'限定技。出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用(无距离和次数限制)。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限;包含【酒】,则当目标角色受到此牌的伤害时,此伤害×2。', twjieyu:'竭御', @@ -13867,7 +13867,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twluanchou_info:'出牌阶段限一次。你可以令两名角色获得〖共患〗直到你下次发动此技能。', twgonghuan:'共患', twgonghuan_info:'每回合限一次。当其他角色受到伤害时,若其拥有〖共患〗且其体力值不大于你,你可以将此伤害转移给你(不触发〖共患〗)。', - tw_qiaorui:'桥蕤', + tw_qiaorui:'TW桥蕤', wangxing:'妄行', twxiawei:'狭威', twxiawei_info:'①游戏开始时,你将牌堆中的两张基本牌置于武将牌上,称为“威”。②回合开始时,你将所有“威”置入弃牌堆。③你可以将“威”如手牌般使用或打出。④妄行:准备阶段,你可以将牌堆顶的X+1张牌置于武将牌上,称为“威”。', diff --git a/character/xianding.js b/character/xianding.js index 9d59bb67f..5c078f9e2 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -5,6 +5,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, character:{ sunlingluan:['female','wu',3,['dclingyue','dcpandi']], + dc_wangjun:['male','qun',4,['dctongye','dcchangqu']], + zhoubuyi:['male','wei',3,['dcshiji','dcsilun']], dc_duyu:['male','wei',4,['dcjianguo','dcdyqingshi']], ganfurenmifuren:['female','shu',3,['dcchanjuan','dcxunbie']], dc_ganfuren:['female','shu',3,['dcshushen','dcshenzhi']], @@ -72,7 +74,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, characterSort:{ xianding:{ - sp2_huben:['wangshuang','wenyang','re_liuzan','dc_huangzu','wulan','leitong','chentai','dc_duyu'], + sp2_huben:['wangshuang','wenyang','re_liuzan','dc_huangzu','wulan','leitong','chentai','dc_duyu','dc_wangjun'], sp2_shengun:["puyuan","guanlu","gexuan",'wufan','re_zhangbao','dukui','zhaozhi','zhujianping','dc_zhouxuān','zerong'], sp2_bizhe:['dc_luotong','dc_wangchang','chengbing','dc_yangbiao','ruanji'], sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu','sunyu','ganfurenmifuren','dc_ganfuren','dc_mifuren'], @@ -81,7 +83,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_yinyu:['zhouyi','luyi','sunlingluan'], sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao'], sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'], - sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun'], + sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi'], sp2_gaoshan:['wanglang','liuhui'], sp2_wumiao:['wu_zhugeliang'], } @@ -243,6 +245,505 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + //新服灭霸 + dctongye:{ + audio:2, + trigger:{ + global:['phaseBefore','dieAfter'], + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + if(game.countGroup()>4) return false; + if(event.name=='die') return true; + return event.name!='phase'||game.phaseNumber==0; + }, + content:function(){ + player.addSkill('dctongye_buff'); + var num=game.countGroup(); + if(num<=4){ + player.addMark('dctongye_handcard',3,false); + game.log(player,'手牌上限','#y+3'); + } + if(num<=3){ + player.addMark('dctongye_range',3,false); + game.log(player,'攻击范围','#y+3'); + } + if(num<=2){ + player.addMark('dctongye_sha',3,false); + game.log(player,'使用杀的次数上限','#y+3'); + } + if(num<=1){ + player.addMark('dctongye_draw',3,false); + game.log(player,'摸牌阶段额定摸牌数','#y+3'); + } + }, + subSkill:{ + buff:{ + audio:'dctongye', + trigger:{player:'phaseDrawBegin2'}, + forced:true, + filter:function(event,player){ + if(!player.hasMark('dctongye_draw')) return false; + return !event.numFixed; + }, + content:function(){ + trigger.num+=player.countMark('dctongye_draw'); + }, + charlotte:true, + onremove:['dctongye_handcard','dctongye_range','dctongye_sha','dctongye_draw'], + mark:true, + marktext:'统', + intro:{ + content:function(storage,player){ + var str=''; + var hand=player.countMark('dctongye_handcard'),range=player.countMark('dctongye_range'),sha=player.countMark('dctongye_sha'),draw=player.countMark('dctongye_draw'); + if(hand>0){ + str+='
  • 手牌上限+'+hand+';'; + } + if(range>0){ + str+='
  • 攻击范围+'+range+';'; + } + if(sha>0){ + str+='
  • 使用【杀】的次数上限+'+sha+';' + } + if(draw>0){ + str+='
  • 摸牌阶段额定摸牌数+'+draw+'。'; + } + str=str.slice(0,-1)+'。'; + return str; + } + }, + mod:{ + maxHandcard:function(player,num){ + return num+player.countMark('dctongye_handcard'); + }, + attackRange:function(player,num){ + return num+player.countMark('dctongye_range'); + }, + cardUsable:function(card,player,num){ + if(card.name=='sha'){ + return num+player.countMark('dctongye_sha'); + } + }, + }, + ai:{ + threaten:2.6, + }, + }, + }, + }, + dcmianyao:{ + audio:2, + trigger:{ + player:'phaseDrawEnd', + }, + direct:true, + filter:function(event,player){ + return player.countCards('h')>0; + }, + content:function(){ + 'step 0' + player.chooseCard('h',get.prompt('dcmianyao'),'展示点数最小的一张牌并随机插入牌堆中,然后于回合结束时摸此牌点数张牌。',function(card,player){ + var num=get.number(card,player); + return !player.hasCard(card2=>{ + return card!=card2&&get.number(card2,player){ + var player=_status.event.player; + var value=player.getUseValue(card,null,true); + if(value>5&&get.number(card)<=2) return 0; + return 1+1/Math.max(0.1,value); + }); + 'step 1' + if(result.bool){ + player.logSkill('dcmianyao'); + var card=result.cards[0]; + event.card=card; + player.showCards([card],get.translation(player)+'发动了【免徭】'); + } + else event.finish(); + 'step 2' + player.$throw(1,1000); + player.lose(card,ui.cardPile).insert_index=function(){ + return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; + } + player.addTempSkill('dcmianyao_draw'); + var num=get.number(card); + if(num>0) player.addMark('dcmianyao_draw',num,false); + }, + subSkill:{ + draw:{ + trigger:{ + player:'phaseEnd', + }, + filter:function(event,player){ + return player.hasMark('dcmianyao_draw'); + }, + forced:true, + charlotte:true, + onremove:true, + content:function(){ + player.draw(player.countMark('dcmianyao_draw')); + }, + } + } + }, + dcchangqu:{ + audio:2, + enable:'phaseUse', + usable:1, + selectTarget:function(){ + return [1,game.countPlayer()-1]; + }, + complexSelect:true, + complexTarget:true, + multitarget:true, + multiline:true, + filterTarget:function(card,player,target){ + if(player==target) return false; + var next=player.getNext(),prev=player.getPrevious(); + var selected=ui.selected.targets; + if(!selected.contains(next)&&!selected.contains(prev)) return (target==next||target==prev); + for(var i of selected){ + if(i.getNext()==target||i.getPrevious()==target) return true; + } + return false; + }, + contentBefore:function(){ + event.getParent()._dcchangqu_targets=targets.slice(); + }, + content:function(){ + 'step 0' + event.targets=event.getParent()._dcchangqu_targets; + var current=targets[0]; + current.addMark('dcchangqu_warship'); + current.addMark('dcchangqu_warshipx',1,false); + event.num=0; + game.delayx(); + 'step 1' + var target=targets.shift(); + event.target=target; + var num=Math.max(1,event.num); + var nextPlayer=targets.find(i=>{ + return i.isIn(); + }); + if(target.hasMark('dcchangqu_warshipx')){ + var prompt2='是否交给'+get.translation(player)+get.cnNumber(num)+'张手牌?'+(nextPlayer?'若如此做,将“战舰”移动给'+get.translation(nextPlayer)+',':',')+'否则你下次受到的属性伤害值+'+num; + target.chooseCard(get.translation(player)+'对你发动了【长驱】',prompt2).set('ai',card=>{ + if(_status.event.att>0) return 6-get.value(card); + if(_status.event.take) return -get.value(card); + return 5-get.value(card); + }).set('att',get.attitude(target,player)).set('take',function(){ + var base=num; + var getEffect=function(target,player,num){ + var natures=['fire','thunder','ice']; + return natures.map(nature=>{ + return get.damageEffect(target,target,player,nature)*Math.sqrt(num)/Math.min(1.5,1+target.countCards('h')); + }).reduce((sum,eff)=>{ + return sum+eff; + },0)/natures.length; + } + var eff=getEffect(player,player,base); + return targets.some((current,ind)=>{ + var num=base+ind+1; + var effx=getEffect(current,player,num); + return effx{ + return i.isIn(); + }); + if(nextPlayer){ + target.line(nextPlayer); + nextPlayer.addMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); + nextPlayer.addMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); + event.goto(1); + game.delayx(); + } + target.removeMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); + target.removeMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); + 'step 4' + var targets=game.players.slice().concat(game.dead); + targets.forEach(i=>{ + delete i.storage.dcchangqu_warshipx; + }); + }, + ai:{ + order:10, + expose:0.05, + result:{ + target:function(player,target){ + var att=get.attitude(player,target); + var targets=game.filterPlayer(i=>i!=player); + targets.sortBySeat(player); + var targets2=targets.reverse(); + var sum=0; + var maxSum=-Infinity,maxIndex=-1; + var maxSum2=-Infinity,maxIndex2=-1; + for(var i=0;imaxSum){ + maxSum=sum; + maxIndex=i; + } + } + var sum=0; + for(var i=0;imaxSum2){ + maxSum2=sum; + maxIndex2=i; + } + } + if(maxSummaxIndex) return -100*get.sgnAttitude(player,target); + if(target==targets[ui.selected.targets.length]) return get.sgnAttitude(player,target); + return 0; + } + }, + }, + subSkill:{ + warship:{ + marktext:'舰', + intro:{ + name:'战舰', + name2:'战舰', + content:'这里停了&艘战舰!不过啥用没有。', + } + }, + add:{ + trigger:{ + player:'damageBegin3', + }, + filter:function(event,player){ + return event.nature&&player.hasMark('dcchangqu_add'); + }, + forced:true, + onremove:true, + charlotte:true, + content:function(){ + 'step 0' + trigger.num+=player.countMark('dcchangqu_add'); + player.removeSkill('dcchangqu_add'); + }, + marktext:'驱', + intro:{ + content:'下次受到的属性伤害+#', + } + }, + } + }, + //周不疑 + dcshiji:{ + audio:2, + trigger:{ + global:'phaseJieshuBegin', + }, + filter:function(event,player){ + return event.player.isIn()&&!event.player.getHistory('sourceDamage').length; + }, + direct:true, + content:function(){ + 'step 0' + trigger.player.addTempSkill('dcshiji_forbidself'); + var list=[]; + for(var name of lib.inpile){ + var type=get.type(name); + if(type!='trick') continue; + if(player.getStorage('dcshiji_used').contains(name)) continue; + var card={ + name:name, + storage:{dcshiji:true}, + }; + if(trigger.player.hasUseTarget(card)){ + list.push([type,'',name]); + } + } + if(list.length){ + player.chooseButton([get.prompt('dcshiji',trigger.player),[list,'vcard']]).set('ai',button=>{ + if(_status.event.tochoose) return _status.event.getTrigger().player.getUseValue({name:button.link[2]}); + return 0; + }).set('tochoose',get.attitude(player,trigger.player)>0&&trigger.player.hasCard(card=>{ + return get.value(card)<7; + },'hes')); + } + else event.finish(); + 'step 1' + if(result.bool){ + var card={ + name:result.links[0][2], + storage:{dcshiji:true}, + }; + var str=get.translation(card); + player.logSkill('dcshiji',trigger.player); + player.addTempSkill('dcshiji_used','roundStart'); + player.markAuto('dcshiji_used',[card.name]); + player.popup(str); + game.log(player,'声明了','#y'+str); + game.broadcastAll(function(card){ + lib.skill.dcshiji_backup.viewAs=card; + lib.skill.dcshiji_backup.prompt='十计:是否将一张牌当做'+get.translation(card)+'使用?'; + },card); + var next=trigger.player.chooseToUse(); + next.set('openskilldialog','十计:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('norestore',true); + next.set('addCount',false); + next.set('_backupevent','dcshiji_backup'); + next.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + next.backup('dcshiji_backup'); + } + }, + subSkill:{ + backup:{ + filterCard:function(card){ + return get.itemtype(card)=='card'; + }, + position:'hes', + selectCard:1, + check:(card)=>7-get.value(card), + popname:true, + }, + used:{ + charlotte:true, + onremove:true, + mark:true, + marktext:'计', + intro:{ + content:'本轮已声明过$', + }, + }, + forbidself:{ + charlotte:true, + mod:{ + targetEnabled:function(card,player,target){ + if(player==target&&card.storage&&card.storage.dcshiji) return false; + }, + }, + } + } + }, + dcsilun:{ + audio:2, + trigger:{ + player:['phaseZhunbeiBegin','damageEnd'], + }, + frequent:true, + content:function(){ + 'step 0' + player.draw(4); + event.count=0; + event.equipCount={}; + game.countPlayer(current=>{ + event.equipCount[current.playerid]=current.countCards('e'); + },true); + 'step 1' + if(!player.countCards('he')) event.goto(5); + else player.chooseCard('四论:选择一张牌('+(event.count+1)+'/'+'4)','然后选择将此牌置于场上或牌堆的两端',true,'he').set('ai',card=>{ + var player=_status.event.player; + if(['equip','delay'].contains(get.type(card))&&player.hasValueTarget(card)) return 50; + return 50-get.value(card); + }); + 'step 2' + if(result.bool){ + var card=result.cards[0]; + event.card=card; + event.count++; + var choices=['牌堆顶','牌堆底']; + var type=get.type(card); + if(type=='equip'&&game.hasPlayer(current=>{ + return current.canEquip(card); + })||type=='delay'&&game.hasPlayer(current=>{ + return !current.storage._disableJudge&&!current.hasJudge(card.name); + })) choices.unshift('场上'); + player.chooseControl(choices).set('prompt','请选择要将'+get.translation(card)+'置于的位置').set('ai',()=>{ + return _status.event.choice; + }).set('choice',function(){ + if(['equip','delay'].contains(get.type(card))&&player.hasValueTarget(card)&&choices.contains('场上')) return '场上'; + var val=get.value(card); + var next=_status.currentPhase; + if(trigger.name=='damage') next=next.getNext(); + if(get.attitude(player,next)>0&&val>=6||get.attitude(player,next)<0&&val<=4.5) return '牌堆顶'; + return '牌堆底'; + }()); + } + 'step 3' + if(result.control=='场上'){ + var type=get.type(card); + player.chooseTarget('将'+get.translation(card)+'置于一名角色的场上',true,(card,player,target)=>{ + return _status.event.targets.contains(target); + }).set('targets',game.filterPlayer(current=>{ + if(type=='equip') return current.canEquip(card); + if(type=='delay') return !current.storage._disableJudge&&!current.hasJudge(card.name); + return false; + })).set('ai',target=>{ + var player=_status.event.player; + var card=_status.event.card; + return get.attitude(player,target)*(get.type(card)=='equip'?get.value(card,target):get.effect(target,{ + name:card.viewAs||card.name, + cards:[card], + },target,target)); + }).set('card',card); + } + else{ + player.$throw(card,1000); + var next=player.lose(card,ui.cardPile); + if(result.control=='牌堆顶') next.insert_card=true; + game.log(player,'将',card,'置于了','#y'+result.control); + } + 'step 4' + if(result.bool&&result.targets&&result.targets.length){ + var target=result.targets[0]; + player.line(target); + player.$give(card,target,false); + if(get.type(card)=='equip'){ + target.equip(card); + } + else{ + target.addJudge(card); + } + } + if(event.count<4) event.goto(1); + 'step 5' + game.countPlayer(current=>{ + var count=current.countCards('e'); + var prevCount=event.equipCount[current.playerid]||0; + if(count!=prevCount){ + current.link(false); + current.turnOver(false); + } + }); + } + }, //杜预 dcjianguo:{ audio:2, @@ -10669,6 +11170,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ruanji:'阮籍(公元210年~263年),字嗣宗,陈留尉氏(今河南省开封市)人,三国时期魏国诗人、竹林七贤之一。阮瑀之子,门荫入仕,累迁步兵校尉,世称阮步兵。崇奉老庄之学,政治上则采取谨慎避祸的态度。景元四年(公元263年),阮籍去世,享年五十三岁。作为“正始之音”的代表,著有《咏怀八十二首》、《大人先生传》等,其著作收录在《阮籍集》中。', ganfurenmifuren:'甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
    糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。', sunlingluan:'孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。', + zhoubuyi:'周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。', }, characterTitle:{ // wulan:'#b对决限定武将', @@ -10833,7 +11335,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dushi_info:'锁定技,你处于濒死状态时,其他角色不能对你使用【桃】。你死亡时,你选择一名其他角色获得〖毒逝〗。', yuwei:'余威', yuwei_info:'主公技,锁定技,其他群雄角色的回合内,你将〖诗怨〗改为“每回合每项限两次”。', - re_xinxianying:'辛宪英', + re_xinxianying:'新杀辛宪英', rezhongjian:'忠鉴', rezhongjian2:'忠鉴', rezhongjian_info:'出牌阶段限一次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。', @@ -11055,7 +11557,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcwumei_info:'每轮限一次。回合开始时,你可以令一名角色记录场上所有角色的体力值并进行一个额外的回合,并将你的回合移至该回合后进行。该角色以此法进行的回合的结束阶段,将场上所有角色的体力值改为记录内的对应数值。', dczhanmeng:'占梦', dczhanmeng_info:'当你使用牌时,你可以选择本回合未选择过的一项:1.上一回合内,若没有同名牌被使用过,你获得一张非伤害牌;2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌;3.令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害。', - dc_wangyun:'十周年王允', + dc_wangyun:'新杀王允', dc_wangyun_ab:'王允', dclianji:'连计', dclianji_info:'出牌阶段限一次。你可以弃置一张手牌并选择一名其他角色,其随机使用牌堆中的一张武器牌,然后其选择一项:1.对另一名其他角色使用一张【杀】,并将武器牌交给其中一个目标;2.令你视为对其使用一张【杀】,并将武器牌交给你。', @@ -11172,6 +11674,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dclingyue_info:'锁定技。一名角色于一轮内首次造成伤害后,你摸一张牌。若此时是该角色回合外,则改为摸X张牌(X为本回合全场造成的伤害值)。', dcpandi:'盻睇', dcpandi_info:'出牌阶段,你可以选择一名本回合内未造成过伤害的角色。你本阶段内使用的下一张牌改为以该角色为基准判断使用目标合法性,且使用者改为该角色。', + zhoubuyi:'周不疑', + dcshiji:'十计', + dcshiji_info:'一名角色的结束阶段,若其本回合未造成过伤害,你可以声明一种本轮未以此法声明过的普通锦囊牌,然后其可以将一张牌当你声明的牌使用(其不是此牌的合法目标)。', + dcsilun:'四论', + dcsilun_info:'准备阶段或当你受到伤害后,你可以摸四张牌,然后将四张牌依次置于场上或牌堆两端(对所有角色可见)。装备区牌数因此变化的角色复原其武将牌。', + dc_wangjun:'王濬', + dcmianyao:'免徭', + dcmianyao_info:'摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。', + dcchangqu:'长驱', + dcchangqu_info:'出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。', + dctongye:'统业', + dctongye_info:'锁定技。游戏开始时或一名角色死亡后,若场上势力数:不大于4,你的手牌上限+3;不大于3,你的攻击范围+3;不大于2,你使用【杀】的次数上限+3;不大于1,你摸牌阶段额定摸牌数+3。', sp2_yinyu:'隐山之玉', sp2_huben:'百战虎贲', diff --git a/character/yijiang.js b/character/yijiang.js index c74980822..fd8a98932 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -8804,6 +8804,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, mingjian:{ + audio:2, + audioname:['re_caorui'], enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ @@ -8916,6 +8918,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, huituo:{ audio:2, + audioname:['re_caorui'], trigger:{player:'damageEnd'}, direct:true, content:function(){ @@ -13587,13 +13590,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xunyou:['re_xunyou','xunyou'], xuezong:['tw_xuezong','xuezong'], huanghao:['huanghao','dc_huanghao','old_huanghao'], - caorui:['caorui','old_caorui'], + caorui:['re_caorui','caorui','old_caorui'], sunziliufang:['dc_sunziliufang','sunziliufang'], liyan:['liyan','old_liyan'], zhangsong:['re_zhangsong','zhangsong'], }, translate:{ - old_huaxiong:'华雄', + old_huaxiong:'将华雄', + old_huaxiong_ab:'华雄', yufan:'虞翻', xushu:'旧徐庶', caozhi:'曹植', @@ -13653,7 +13657,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_yujin:'节钺于禁', xin_liru:'李儒', guohuanghou:'郭皇后', - liuyu:'刘虞', + liuyu:'OL刘虞', sundeng:'孙登', liyan:'李严', sunziliufang:'孙资刘放', diff --git a/character/yingbian.js b/character/yingbian.js index 03a13a88e..c9660b7be 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -3615,7 +3615,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xijue_xiaoguo:'骁果', xijue_xiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。', xijue_xiaoguo_info_guozhan:'其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。', - duyu:'杜预', + duyu:'OL杜预', sanchen:'三陈', sanchen_info:'出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。', sanchen_info_guozhan:'出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。', @@ -3754,7 +3754,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qimei_info:'准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。', ybzhuiji:'追姬', ybzhuiji_info:'出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。', - jin_yanghu:'羊祜', + jin_yanghu:'OL羊祜', huaiyuan:'怀远', huaiyuanx:'绥', huaiyuan_info:'①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。', diff --git a/game/config.js b/game/config.js index 4e6d978b5..7294dc11a 100644 --- a/game/config.js +++ b/game/config.js @@ -20,7 +20,7 @@ window.config={ zhinang_tricks:['guohe','wuxie','wuzhong','dongzhuxianji'], connect_zhinang_tricks:['guohe','wuxie','wuzhong','dongzhuxianji'], all:{ - sgscharacters:['standard','shenhua','xinghuoliaoyuan','refresh','yijiang','sp','sp2','xianding','huicui','extra','old','mobile','shiji','tw','yingbian','offline','sb','clan','collab'], + sgscharacters:['standard','shenhua','xinghuoliaoyuan','refresh','yijiang','sp','sp2','xianding','huicui','extra','old','mobile','shiji','tw','yingbian','offline','jsrg','sb','clan','collab'], sgscards:['standard','extra','sp','guozhan','zhulu','yingbian','yongjian'], sgsmodes:['identity','guozhan','versus','doudizhu','single','brawl','connect'], stockmode:['identity','guozhan','versus','boss','doudizhu','single','chess','stone','connect','brawl','tafang'], @@ -133,7 +133,7 @@ window.config={ sort:'type_sort', cards:['standard','extra'], - characters:['standard','shenhua','sp','sp2','yijiang','refresh','xinghuoliaoyuan','mobile','extra','yingbian','sb','tw','offline','clan','collab','xianding','huicui','shiji'], + characters:['standard','shenhua','sp','sp2','yijiang','refresh','xinghuoliaoyuan','mobile','extra','yingbian','sb','tw','offline','clan','collab','xianding','huicui','shiji','jsrg'], connect_characters:['diy'], connect_cards:['huanlekapai','guozhan','sp','zhulu','yingbian','yongjian'], plays:[], diff --git a/game/game.js b/game/game.js index 17ee62fca..f4031f8c8 100644 --- a/game/game.js +++ b/game/game.js @@ -38765,7 +38765,7 @@ } intro.innerHTML=get.translation(rarity); } - if((button.link=='xushu'||button.link=='xin_xushu')&&button.node&&button.node.name&&button.node.group){ + if((button.link=='xushu'||button.link=='xin_xushu'||button.link=='jsrg_guanyu')&&button.node&&button.node.name&&button.node.group){ if(button.classList.contains('newstyle')){ button.node.name.dataset.nature='watermm'; button.node.group.dataset.nature='water'; @@ -52943,7 +52943,7 @@ return false; }, double:function(name,array){ - if(!lib.character[name]||!lib.character[name][4]||name.indexOf('gz_')!=0&&name.indexOf('db_')!=0) return false; + if(!lib.character[name]||!lib.character[name][4]||name.indexOf('gz_')!=0&&name.indexOf('db_')!=0&&name.indexOf('jsrg_')!=0) return false; for(var i of lib.character[name][4]){ if(i.indexOf('doublegroup:')==0){ if(!array) return true; @@ -54341,6 +54341,9 @@ else if(str2.indexOf('手杀')==0){ str2=str2.slice(2); } + else if(str2.indexOf('新杀')==0){ + str2=str2.slice(2); + } else if(str2.indexOf('界')==0&&lib.characterPack.refresh&&lib.characterPack.refresh[str]){ str2=str2.slice(1); } @@ -54374,6 +54377,9 @@ else if(str2.indexOf('手杀')==0){ str2=str2.slice(2); } + else if(str2.indexOf('新杀')==0){ + str2=str2.slice(2); + } return str2; }, slimName:function(str){ @@ -54398,6 +54404,9 @@ else if(str2.indexOf('手杀')==0){ str2=str2.slice(2); } + else if(str2.indexOf('新杀')==0){ + str2=str2.slice(2); + } return get.verticalStr(str2,true); }, time:function(){ diff --git a/game/package.js b/game/package.js index 1fc6467fe..959fd63c8 100644 --- a/game/package.js +++ b/game/package.js @@ -18,6 +18,7 @@ window.noname_package={ tw:'外服武将', collab:'联动卡', offline:'线下武将', + jsrg:'江山如故', old:'怀旧', diy:'DIY', ddd:'3D精选', diff --git a/image/character/dc_caocao.jpg b/image/character/dc_caocao.jpg new file mode 100644 index 000000000..028abb235 Binary files /dev/null and b/image/character/dc_caocao.jpg differ diff --git a/image/character/dc_liubei.jpg b/image/character/dc_liubei.jpg new file mode 100644 index 000000000..ffa854739 Binary files /dev/null and b/image/character/dc_liubei.jpg differ diff --git a/image/character/dc_sunquan.jpg b/image/character/dc_sunquan.jpg new file mode 100644 index 000000000..aefd1bb05 Binary files /dev/null and b/image/character/dc_sunquan.jpg differ diff --git a/image/character/dc_wangjun.jpg b/image/character/dc_wangjun.jpg index c03b7580a..c3e6a517b 100644 Binary files a/image/character/dc_wangjun.jpg and b/image/character/dc_wangjun.jpg differ diff --git a/image/character/jsrg_chendeng.jpg b/image/character/jsrg_chendeng.jpg new file mode 100644 index 000000000..ee824b632 Binary files /dev/null and b/image/character/jsrg_chendeng.jpg differ diff --git a/image/character/jsrg_chunyuqiong.jpg b/image/character/jsrg_chunyuqiong.jpg new file mode 100644 index 000000000..d497a3774 Binary files /dev/null and b/image/character/jsrg_chunyuqiong.jpg differ diff --git a/image/character/jsrg_guanyu.jpg b/image/character/jsrg_guanyu.jpg new file mode 100644 index 000000000..7d6198a46 Binary files /dev/null and b/image/character/jsrg_guanyu.jpg differ diff --git a/image/character/jsrg_lvbu.jpg b/image/character/jsrg_lvbu.jpg new file mode 100644 index 000000000..f4f0a1268 Binary files /dev/null and b/image/character/jsrg_lvbu.jpg differ diff --git a/image/character/jsrg_sunce.jpg b/image/character/jsrg_sunce.jpg new file mode 100644 index 000000000..6e88a4742 Binary files /dev/null and b/image/character/jsrg_sunce.jpg differ diff --git a/image/character/jsrg_xugong.jpg b/image/character/jsrg_xugong.jpg new file mode 100644 index 000000000..ec5335338 Binary files /dev/null and b/image/character/jsrg_xugong.jpg differ diff --git a/image/character/jsrg_xuyou.jpg b/image/character/jsrg_xuyou.jpg new file mode 100644 index 000000000..33e0ac497 Binary files /dev/null and b/image/character/jsrg_xuyou.jpg differ diff --git a/image/character/jsrg_zhanghe.jpg b/image/character/jsrg_zhanghe.jpg new file mode 100644 index 000000000..9922b1c95 Binary files /dev/null and b/image/character/jsrg_zhanghe.jpg differ diff --git a/image/character/jsrg_zhangliao.jpg b/image/character/jsrg_zhangliao.jpg new file mode 100644 index 000000000..e5aca1767 Binary files /dev/null and b/image/character/jsrg_zhangliao.jpg differ diff --git a/image/character/jsrg_zhenji.jpg b/image/character/jsrg_zhenji.jpg new file mode 100644 index 000000000..6b7c498c9 Binary files /dev/null and b/image/character/jsrg_zhenji.jpg differ diff --git a/image/character/jsrg_zoushi.jpg b/image/character/jsrg_zoushi.jpg new file mode 100644 index 000000000..6552f7a7d Binary files /dev/null and b/image/character/jsrg_zoushi.jpg differ diff --git a/image/character/zhoubuyi.jpg b/image/character/zhoubuyi.jpg new file mode 100644 index 000000000..233cb2a85 Binary files /dev/null and b/image/character/zhoubuyi.jpg differ