diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 95a5fd24e..17e760257 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,5 +1,6 @@ 1.5.7 -对决模式改进 屏蔽强将选项 卡牌、卡背、体力条样式 -新武将(张鲁、士燮、马云騄、兀突骨、sp蔡文姬) +徐盛、步练师修改 +新武将(5个SP武将、补全一将成名) +安卓精简版(去掉配音、DIY武将及卡牌) diff --git a/audio/die/yanliangwenchou.mp3 b/audio/die/yanwen.mp3 similarity index 100% rename from audio/die/yanliangwenchou.mp3 rename to audio/die/yanwen.mp3 diff --git a/audio/die/jvshou.mp3 b/audio/die/yj_jushou.mp3 similarity index 100% rename from audio/die/jvshou.mp3 rename to audio/die/yj_jushou.mp3 diff --git a/audio/skill/xinpojun1.mp3 b/audio/skill/xinpojun1.mp3 new file mode 100644 index 000000000..a69c1a411 Binary files /dev/null and b/audio/skill/xinpojun1.mp3 differ diff --git a/audio/skill/xinpojun2.mp3 b/audio/skill/xinpojun2.mp3 new file mode 100644 index 000000000..6ba348b54 Binary files /dev/null and b/audio/skill/xinpojun2.mp3 differ diff --git a/card/hearth.js b/card/hearth.js index 53db6fde5..53ed4d568 100644 --- a/card/hearth.js +++ b/card/hearth.js @@ -534,7 +534,7 @@ card.hearth={ }, ai:{ order:4, - value:[6,3], + value:[8,3], useful:[6,3], result:{ target:function(player,target){ @@ -543,7 +543,7 @@ card.hearth={ var num=target.maxHp-target.hp; if(num<1) return 0; if(num==1) return 1; - if(target.hp==2) return 2.5; + if(target.hp==1) return 2.5; return 2; } } diff --git a/card/standard.js b/card/standard.js index 43802839e..4587324de 100755 --- a/card/standard.js +++ b/card/standard.js @@ -95,6 +95,7 @@ card.standard={ } else{ event.trigger('shaMiss'); + event.responded=result; } "step 2" if(result.bool==false&&!event.unhurt){ @@ -1122,7 +1123,7 @@ card.standard={ player.removeSkill('jiu'); event.jiu=true; } - player.chooseToUse('是否发动青龙偃月刀?',{name:'sha'},trigger.target,-1); + player.chooseToUse('是否发动青龙偃月刀?',{name:'sha'},trigger.target,-1).logSkill='qinglong'; "step 1" if(result.bool){ player.logSkill('qinglong'); @@ -1154,9 +1155,11 @@ card.standard={ }, content:function(){ "step 0" - player.chooseToDiscard('是否发动贯石斧?',2,'he',function(card){ + var next=player.chooseToDiscard('是否发动贯石斧?',2,'he',function(card){ return player.get('e',{subtype:'equip1'}).contains(card)==false; - }).ai= + }); + next.logSkill='guanshi_skill'; + next.ai= function(card){ if(ai.get.attitude(player,trigger.target)<0){ if(player.skills.contains('jiu')|| @@ -1170,7 +1173,6 @@ card.standard={ }; "step 1" if(result.bool){ - player.logSkill('guanshi_skill'); trigger.untrigger(); trigger.trigger('shaHit'); trigger._result.bool=false; @@ -1218,6 +1220,7 @@ card.standard={ bagua_skill:{ trigger:{player:'chooseToRespondBegin'}, filter:function(event,player){ + if(event.responded) return false; if(!event.filterCard({name:'shan'})) return false; if(event.parent.player.num('s','unequip')) return false; return true; diff --git a/character/fire.js b/character/fire.js index d051e7f1e..cea7b51e1 100755 --- a/character/fire.js +++ b/character/fire.js @@ -183,7 +183,7 @@ character.fire={ event.finish(); } "step 2" - if(result.bool){ + if(result.bool&&result.targets&&result.targets.length){ result.targets[0].damage(target); } }, diff --git a/character/gujian.js b/character/gujian.js index 9ff7d98c6..93c6cb7a2 100755 --- a/character/gujian.js +++ b/character/gujian.js @@ -60,7 +60,9 @@ character.gujian={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('是否弃置一张黑色牌使伤害+1?',{color:'black'}).ai=function(card){ + var next=player.chooseToDiscard('是否弃置一张黑色牌使伤害+1?',{color:'black'}); + next.logSkill='zhongji'; + next.ai=function(card){ if(ai.get.attitude(player,trigger.player)<0){ return 7-ai.get.value(card); } @@ -68,7 +70,6 @@ character.gujian={ } "step 1" if(result.bool){ - player.logSkill('zhongji'); trigger.num++; } }, @@ -120,12 +121,13 @@ character.gujian={ }, content:function(){ "step 0" - player.chooseToDiscard('是否发动【戏蝶】?',[1,Math.min(3,player.num('h')-player.hp)]).ai=function(card){ + var next=player.chooseToDiscard('是否发动【戏蝶】?',[1,Math.min(3,player.num('h')-player.hp)]); + next.ai=function(card){ return 6-ai.get.value(card); } + next.logSkill='xidie'; "step 1" if(result.bool){ - player.logSkill('xidie'); player.storage.xidie=result.cards.length; } }, @@ -380,7 +382,9 @@ character.gujian={ priority:-5, content:function(){ "step 0" - player.chooseToDiscard('是否对'+get.translation(trigger.player)+'发动【晴岚】?','he').ai=function(card){ + var next=player.chooseToDiscard('是否对'+get.translation(trigger.player)+'发动【晴岚】?','he'); + next.logSkill='qinglan'; + next.ai=function(card){ if(trigger.num>1||!trigger.source){ if(ai.get.attitude(player,trigger.player)>0){ return 9-ai.get.value(card); @@ -403,7 +407,6 @@ character.gujian={ } "step 1" if(result.bool){ - player.logSkill('qinglan'); trigger.untrigger(); trigger.finish(); if(trigger.source){ @@ -644,15 +647,16 @@ character.gujian={ for(var i=0;i0; + }, + content:function(){ + player.discard(player.get('he')); + player.removeSkill('mengjing_mengye'); + }, + mark:'image', + intro:{ + content:'回合结束阶段,弃置所有牌' + } + }, zhanhou:{ init:function(player){ player.forcemin=true; @@ -778,11 +808,11 @@ character.hearth={ player:1 } }, - mod:{ - globalFrom:function(from,to,distance){ - return distance-from.hujia; - } - }, + // mod:{ + // globalFrom:function(from,to,distance){ + // return distance-from.hujia; + // } + // }, }, shijie:{ trigger:{player:'phaseEnd'}, @@ -1311,15 +1341,16 @@ character.hearth={ var val=ai.get.value(trigger.card); var suit=get.suit(trigger.card); var eff=ai.get.effect(trigger.target,trigger.card,trigger.player,player); - player.chooseToDiscard('是否对'+get.translation(trigger.player)+'使用的'+get.translation(trigger.card)+'发动【闷棍】?',function(card){ + var next=player.chooseToDiscard('是否对'+get.translation(trigger.player)+'使用的'+get.translation(trigger.card)+'发动【闷棍】?',function(card){ return get.suit(card)==suit; - }).ai=function(card){ + }); + next.logSkill=['mengun',trigger.player]; + next.ai=function(card){ if(eff>=0) return 0; return Math.min(8,1+val)-ai.get.value(card); } "step 1" if(result.bool){ - player.logSkill('mengun',trigger.player); game.log(get.translation(trigger.player)+'收回了'+get.translation(trigger.cards)); trigger.untrigger(); trigger.finish(); @@ -1385,10 +1416,11 @@ character.hearth={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('是否发动【激活】?').ai=ai.get.unuseful2; + var next=player.chooseToDiscard('是否发动【激活】?'); + next.ai=ai.get.unuseful2; + next.logSkill='jihuo'; "step 1" if(result.bool){ - player.logSkill('jihuo'); player.storage.jihuo=true; } else{ @@ -1941,6 +1973,146 @@ character.hearth={ }, }, card:{ + mengjing_feicuiyoulong:{ + type:'mengjing', + image:'card/mengjing_feicuiyoulong', + color:'white', + opacity:1, + textShadow:'black 0 0 2px', + enable:true, + filterTarget:true, + content:function(){ + target.damage(2); + }, + ai:{ + order:5, + result:{ + target:-2 + }, + tag:{ + damage:2 + }, + useful:5, + value:10, + } + }, + mengjing_suxing:{ + type:'mengjing', + image:'card/mengjing_suxing', + color:'white', + opacity:1, + textShadow:'black 0 0 2px', + enable:true, + filterTarget:function(card,player,target){ + return player!=target; + }, + selectTarget:-1, + content:function(){ + target.loseHp(); + var he=target.get('he'); + if(he.length){ + target.discard(he.randomGets(2)); + } + }, + ai:{ + result:{ + target:-1, + }, + order:6, + useful:5, + value:10, + } + }, + mengjing_mengye:{ + type:'mengjing', + image:'card/mengjing_mengye', + color:'white', + opacity:1, + textShadow:'black 0 0 2px', + enable:true, + filterTarget:true, + content:function(){ + target.draw(); + target.addSkill('mengjing_mengye'); + }, + ai:{ + order:1, + useful:5, + value:10, + result:{ + target:function(player,target){ + if(target.skills.contains('mengjing_mengye')) return 0.5; + return -target.num('he'); + } + } + } + }, + mengjing_mengjing:{ + type:'mengjing', + image:'card/mengjing_mengjing', + color:'white', + opacity:1, + textShadow:'black 0 0 2px', + enable:true, + filterTarget:function(card,player,target){ + return !target.num('j','lebu')||target.num('e')>0; + }, + content:function(){ + 'step 0' + var es=target.get('e'); + if(es.length){ + target.gain(es,'gain2'); + } + 'step 1' + if(!target.num('j','lebu')){ + target.addJudge(game.createCard('lebu')); + } + }, + ai:{ + order:2, + useful:5, + value:10, + result:{ + target:function(player,target){ + var num=target.hp-target.num('he')-2; + if(num>-1) return -1; + if(target.hp<3) num--; + if(target.hp<2) num--; + if(target.hp<1) num--; + return num; + } + } + } + }, + mengjing_huanxiaojiemei:{ + type:'mengjing', + image:'card/mengjing_huanxiaojiemei', + color:'white', + opacity:1, + textShadow:'black 0 0 2px', + enable:true, + filterTarget:function(card,player,target){ + return target.hpplayer.hp; - player.chooseToDiscard('是否发动巧变路过弃牌阶段?').ai=function(card){ + var next=player.chooseToDiscard('是否发动巧变路过弃牌阶段?'); + next.logSkill='qiaobian'; + next.ai=function(card){ if(discard){ return 100-ai.get.useful(card); } @@ -431,7 +434,6 @@ character.mountain={ }; "step 1" if(result.bool){ - player.logSkill('qiaobian'); trigger.untrigger(); trigger.finish(); } @@ -795,10 +797,11 @@ character.mountain={ }, content:function(){ "step 0" - player.chooseToDiscard('he','是否发动悲歌?').ai=ai.get.unuseful2; + var next=player.chooseToDiscard('he','是否发动悲歌?'); + next.ai=ai.get.unuseful2; + next.logSkill='beige'; "step 1" if(result.bool){ - player.logSkill('beige'); trigger.player.judge(); } else{ diff --git a/character/rank.js b/character/rank.js index d7c315669..7272b0a61 100644 --- a/character/rank.js +++ b/character/rank.js @@ -52,6 +52,7 @@ window.characterRank={ 'hs_malygos', ], a:[ + 'hs_ysera', 'yxs_diaochan', 'swd_wangsiyue', 'swd_lanyin', @@ -87,7 +88,7 @@ window.characterRank={ 'zhoutai', ], am:[ - 'hs_xuefashi', + 'sp_caiwenji', 'manchong', 'swd_linyue', 'swd_fuyan', @@ -141,9 +142,12 @@ window.characterRank={ 'hs_siwangzhiyi', 'jg_huangyueying', 'hs_bilanyoulong', + 'zhanglu', ], bp:[ + 'shixie', 'yxs_mozi', + 'hs_xuefashi', 'xiahoushi', 'zhangsong', 'zhuhuan', @@ -170,6 +174,7 @@ window.characterRank={ 'jiangwei', 'liubei', 'mateng', + 'wutugu', 'swd_chunyuheng', 'hetaihou', 'hs_alleria', @@ -206,6 +211,7 @@ window.characterRank={ 'guyong', 'diy_xuhuang', 'sunquan', + 'hs_jgarrosh', ], b:[ 'pal_linyueru', @@ -231,7 +237,6 @@ window.characterRank={ 'sp_sunshangxiang', 're_lidian', 'jiangqing', - 'hs_jgarrosh', 'hs_lrexxar', 'mifuren', 'diy_huangzhong', @@ -269,6 +274,7 @@ window.characterRank={ 'zhouyu', 'guanyinping', 'dingfeng', + 'mayunlu', 'pangtong', 'zhugeliangwolong', 'shen_guanyu', diff --git a/character/refresh.js b/character/refresh.js index 5286fa304..92071f83c 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -962,12 +962,8 @@ character.refresh={ !lib.filter.autoRespondSha.call({player:player}); }, content:function(){ - "step 0" - player.chooseToUse({name:'sha'},'是否对'+get.translation(trigger.player)+'使用一张杀',trigger.player); - "step 1" - if(result.bool){ - player.logSkill('zhuhai'); - } + player.chooseToUse({name:'sha'},'是否对'+get.translation(trigger.player)+'使用一张杀', + trigger.player).logSkill='zhuhai'; } }, qianxin:{ diff --git a/character/sp.js b/character/sp.js index 18653478f..b5df4da28 100755 --- a/character/sp.js +++ b/character/sp.js @@ -36,9 +36,381 @@ character.sp={ sp_caiwenji:['female','wei',3,['chenqing','mozhi'],['fullskin']], }, skill:{ + chenqing:{ + trigger:{global:'dying'}, + priority:6, + filter:function(event,player){ + return event.player.hp<=0&&!player.skills.contains('chenqing2'); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget('是否发动【陈情】?',function(card,player,target){ + return target!=player&&target!=trigger.player; + }).ai=function(target){ + if(ai.get.attitude(player,trigger.player)>0){ + var att1=ai.get.attitude(target,player); + var att2=ai.get.attitude(target,trigger.player); + var att3=ai.get.attitude(player,target); + if(att3<0) return 0; + return att1/2+att2+att3; + } + else{ + return ai.get.attitude(player,target); + } + } + 'step 1' + if(result.bool){ + player.addTempSkill('chenqing2',{player:'phaseBegin'}); + event.target=result.targets[0]; + event.target.draw(4); + player.logSkill('chenqing',event.target); + } + else{ + event.finish(); + } + 'step 2' + var target=event.target; + var tosave=trigger.player; + var att=ai.get.attitude(target,tosave); + var hastao=target.num('h','tao'); + target.chooseToDiscard(4,true).ai=function(card){ + if(!hastao&&att>0){ + var suit=get.suit(card); + for(var i=0;i0&&player.num('h')>0; + }, + content:function(){ + if(player.storage.mozhi.length&&player.num('h')){ + var card=player.storage.mozhi.shift(); + card={name:card.name,nature:card.nature,suit:card.suit,number:card.number}; + if(lib.filter.cardEnabled(card)){ + for(var i=0;i0; + }, + content:function(){ + player.loseHp(player.storage.ranshang); + } + }, + hanyong:{ + trigger:{player:'useCard'}, + filter:function(event,player){ + return player.storage.hanyong>player.hp&&event.card&& + (event.card.name=='nanman'||event.card.name=='wanjian'); + }, + content:function(){ + player.addTempSkill('hanyong3','useCardAfter'); + }, + init:function(player){ + player.storage.hanyong=0; + }, + group:'hanyong2' + }, + hanyong2:{ + trigger:{player:'phaseBegin'}, + forced:true, + popup:false, + silent:true, + content:function(){ + player.storage.hanyong++; + } + }, + hanyong3:{ + trigger:{source:'damageBegin'}, + forced:true, + filter:function(event,player){ + return event.card&&(event.card.name=='nanman'||event.card.name=='wanjian'); + }, + content:function(){ + trigger.num++; + } + }, + yishe:{ + trigger:{player:'phaseEnd'}, + init:function(player){ + player.storage.yishe=[]; + }, + filter:function(event,player){ + return !player.storage.yishe||!player.storage.yishe.length; + }, + intro:{ + content:'cards' + }, + content:function(){ + 'step 0' + player.draw(2); + player.chooseCard(2,'he',true,'选择两张牌作为“米”'); + 'step 1' + player.markSkill('yishe'); + player.storage.yishe=result.cards; + player.lose(result.cards,ui.special); + game.addVideo('storage',player,['yishe',get.cardsInfo(player.storage.yishe),'cards']); + } + }, + bushi:{ + trigger:{player:'damageEnd',source:'damageEnd'}, + filter:function(event,player){ + return player.storage.yishe&&player.storage.yishe.length&&event.player.isAlive(); + }, + direct:true, + content:function(){ + 'step 0' + trigger.player.chooseCardButton('选择获得一张“米”',player.storage.yishe); + 'step 1' + if(result.bool){ + player.logSkill('bushi'); + trigger.player.gain(result.buttons[0].link,'gain2'); + player.storage.yishe.remove(result.buttons[0].link); + game.addVideo('storage',player,['yishe',get.cardsInfo(player.storage.yishe),'cards']); + if(player.storage.yishe.length==0){ + player.recover(); + player.unmarkSkill('yishe'); + } + } + } + }, + midao:{ + unique:true, + trigger:{global:'judge'}, + direct:true, + filter:function(event,player){ + return player.storage.yishe&&player.storage.yishe.length&&event.player.isAlive(); + }, + content:function(){ + "step 0" + var list=player.storage.yishe; + var dialog=ui.create.dialog(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+get.translation(trigger.player.judging)+ + ',是否发动【米道】?',list,'hidden'); + player.chooseButton(dialog,function(button){ + var card=button.link; + var trigger=_status.event.parent._trigger; + var player=_status.event.player; + var result=trigger.judge(card)-trigger.judge(trigger.player.judging); + var attitude=ai.get.attitude(player,trigger.player); + return result*attitude; + }); + "step 1" + if(result.bool){ + event.card=result.buttons[0].link; + player.$throw(event.card,1000); + player.storage.yishe.remove(result.buttons[0].link); + game.addVideo('storage',player,['yishe',get.cardsInfo(player.storage.yishe),'cards']); + if(player.storage.yishe.length==0){ + player.recover(); + player.unmarkSkill('yishe'); + } + if(event.card.clone){ + event.card.clone.classList.add('thrownhighlight'); + game.addVideo('highlightnode',player,get.cardInfo(event.card)); + } + } + "step 2" + if(event.card){ + player.logSkill('midao',trigger.player); + ui.discardPile.appendChild(trigger.player.judging); + trigger.player.judging=event.card; + trigger.position.appendChild(event.card); + game.log(get.translation(trigger.player)+'的判定牌改为'+get.translation(event.card)); + event.card.expired=true; + game.delay(2); + } + }, + ai:{ + tag:{ + rejudge:0.6 + } + } + }, + fengpo:{ + trigger:{player:['shaBegin','juedouBegin']}, + filter:function(event,player){ + if(player.skills.contains('fengpo3')) return false; + return event.target&&event.targets&&event.targets.length==1; + }, + direct:true, + content:function(){ + 'step 0' + player.addTempSkill('fengpo3','phaseAfter'); + player.chooseControl('draw_card','加伤害','cancel', + ui.create.dialog('是否发动【凤魄】?','hidden')); + 'step 1' + if(result.control&&result.control!='cancel'){ + player.logSkill('fengpo'); + var nd=trigger.target.num('h',{suit:'diamond'}); + if(result.control=='draw_card'){ + player.draw(nd); + } + else{ + player.addTempSkill('fengpo2','useCardToAfter'); + player.storage.fengpo=nd; + } + } + } + }, + fengpo2:{ + trigger:{source:'damageBegin'}, + filter:function(event){ + return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&& + event.parent.name!='_lianhuan'&&event.parent.name!='_lianhuan2'; + }, + forced:true, + content:function(){ + if(typeof player.storage.fengpo=='number'){ + trigger.num+=player.storage.fengpo; + } + } + }, + fengpo3:{}, biluan:{ trigger:{player:'phaseDrawBefore'}, + mark:true, + unique:true, + intro:{ + content:function(storage){ + if(storage>0){ + return '防御距离+'+storage; + } + else if(storage<0){ + return '防御距离'+storage; + } + else{ + return '无距离变化'; + } + } + }, + init:function(player){ + player.storage.biluan=0; + }, check:function(event,player){ + if(player.num('h')>player.hp) return true; + if(player.num('j','lebu')) return true; var ng=[]; for(var i=0;i1){ - nai++; + if(game.players[i]!=player){ + var dist=get.distance(game.players[i],player,'attack'); + if(dist<=1&&dist+ng>1){ + nai++; + } } } - console.log(nai); return nai>=2; }, filter:function(event,player){ for(var i=0;i1; + }, + forced:true, + content:function(){ + 'step 0' + player.chooseTarget(function(card,player,target){ + return target==player||target==trigger.player; + },true,'礼下:选择一个目标摸一张牌').ai=function(target){ + return target==player; + }.ai=function(target){ + return player==target?1:0; + }; + 'step 1' + if(result.targets.length){ + result.targets[0].draw(); + player.line(result.targets[0],'green'); + } + player.storage.biluan--; + game.addVideo('storage',player,['biluan',player.storage.biluan]); + } }, fuji:{ trigger:{global:'damageBegin'}, @@ -386,8 +800,7 @@ character.sp={ if(cards.length){ var dialog; if(event.isMine()){ - dialog=ui.create.dialog('是否发动【'+get.translation(event.name)+'】?'); - dialog.style.opacity='none'; + dialog=ui.create.dialog('是否发动【'+get.translation(event.name)+'】?','hidden'); dialog.add(cards); for(var i=0;i0){ return 7-ai.get.useful(card); } return -1; } + next.logSkill=['zhendu',trigger.player]; "step 1" if(result.bool){ - player.logSkill('zhendu',trigger.player); trigger.player.damage(); } else{ @@ -1448,16 +1866,17 @@ character.sp={ content:function(){ "step 0" var nono=(Math.abs(ai.get.attitude(player,trigger.player))<3); - player.chooseToDiscard('是否发动【骁果】?',{type:'basic'}).ai=function(card){ + var next=player.chooseToDiscard('是否发动【骁果】?',{type:'basic'}); + next.ai=function(card){ if(nono) return 0; if(ai.get.damageEffect(trigger.player,player,player)>0){ return 8-ai.get.useful(card); } return 0; } + next.logSkill=['xiaoguo',trigger.player]; "step 1" if(result.bool){ - player.logSkill('xiaoguo',trigger.player); var nono=(ai.get.damageEffect(trigger.player,player,trigger.player)>=0); trigger.player.chooseToDiscard('he',{type:'equip'}).ai=function(card){ if(nono){ @@ -2381,7 +2800,7 @@ character.sp={ if(current>0) return; if(target.num('h')==0) return 1.6; if(target.num('h')==1) return 1.2; - if(target.num('h')==2) return [0.8,0.5,0,-0.5]; + if(target.num('h')==2) return [0.8,0.2,0,-0.2]; return [0.4,0.7,0,-0.7]; } } @@ -2850,12 +3269,14 @@ character.sp={ zhanglu:'张鲁', wutugu:'兀突骨', mateng:'马腾', + sp_caiwenji:'蔡文姬', biluan:'避乱', biluan_info:'摸牌阶段开始时,若有其他角色与你距离不大于1,则你可以放弃摸牌。若如此做,其他角色与你距离+X(X为势力数)', lixia:'礼下', lixia_info:'锁定技,其他角色结束阶段开始时,若你不在其攻击范围内,你摸一张牌或令其摸一张牌。若如此做,其他角色与你的距离-1', yishe:'义舍', + yishe_bg:'米', yishe_info:'结束阶段开始时,若你的武将牌上没有牌,你可以摸两张牌。若如此做,你将两张牌置于武将牌上,称为“米”;当“米”移至其他区域后,若你的武将牌上没有“米”,你回复1点体力', bushi:'布施', midao:'米道', @@ -2868,6 +3289,7 @@ character.sp={ mozhi:'默识', mozhi_info:'结束阶段开始时,你可以将一张手牌当你本回合出牌阶段使用的第一张基本或非延时类锦囊牌使用。然后,你可以将一张手牌当你本回合出牌阶段使用的第二张基本或非延时类锦囊牌使用', ranshang:'燃殇', + ranshang2:'燃殇', ranshang_info:'锁定技,当你受到1点火焰伤害后,你获得1枚“燃”标记;结束阶段开始时,你失去X点体力(X为“燃”标记的数量)', hanyong:'悍勇', hanyong_info:'当你使用【南蛮入侵】或【万箭齐发】时,若你的体力值小于游戏轮数,你可以令此牌造成的伤害+1', diff --git a/character/standard.js b/character/standard.js index fe30bc155..92ab54d6f 100755 --- a/character/standard.js +++ b/character/standard.js @@ -46,6 +46,7 @@ character.standard={ unique:true, trigger:{player:'chooseToRespondBegin'}, filter:function(event,player){ + if(event.responded) return false; if(!player.isZhu) return false; if(event.filterCard({name:'shan'})==false) return false; for(var i=0;i0; + return target.num('h')>0&&get.distance(player,target)<=2; }).ai=function(target){ var att=ai.get.attitude(player,target); var hs=target.get('h'); @@ -665,9 +665,11 @@ character.swd={ "step 0" var yep=ai.get.attitude(player,trigger.player)<0&& trigger.player.num('h')>2; - player.chooseToDiscard(function(card){ + var next=player.chooseToDiscard(function(card){ return get.type(card)!='basic'; - },'是否对'+get.translation(trigger.player)+'发动【入梦】?','he').ai=function(card){ + },'是否对'+get.translation(trigger.player)+'发动【入梦】?','he'); + next.logSkill=['rumeng',trigger.player]; + next.ai=function(card){ if(yep){ return 6-ai.get.value(card); } @@ -675,7 +677,6 @@ character.swd={ } "step 1" if(result.bool){ - player.logSkill('rumeng',trigger.player); trigger.player.chooseToDiscard({type:'basic'},'入梦:弃置一张基本牌或路过出牌及弃牌阶段').ai=function(card){ return 5-ai.get.value(card); } @@ -702,15 +703,16 @@ character.swd={ }, content:function(){ "step 0" - player.chooseToDiscard('he','是否发动【连打】?').ai=function(card){ + var next=player.chooseToDiscard('he','是否发动【连打】?'); + next.ai=function(card){ if(ai.get.effect(trigger.target,{name:'sha'},player,player)>0){ return 7-ai.get.value(card); } return 0; } + next.logSkill='lianda'; "step 1" if(result.bool){ - player.logSkill('lianda'); player.addTempSkill('lianda2','phaseAfter'); player.useCard({name:'sha'},trigger.target); } @@ -840,7 +842,9 @@ character.swd={ } } } - player.chooseToDiscard('he','是否发动【镇卫】?').ai=function(card){ + var next=player.chooseToDiscard('he','是否发动【镇卫】?'); + next.logSkill='hzhenwei',trigger.target; + next.ai=function(card){ if(save){ return 7-ai.get.value(card); } @@ -848,7 +852,6 @@ character.swd={ } "step 1" if(result.bool){ - player.logSkill('hzhenwei',trigger.target); trigger.target=player; trigger.untrigger(); trigger.trigger('useCardToBefore'); @@ -1616,13 +1619,14 @@ character.swd={ content:function(){ "step 0" var att=ai.get.attitude(player,trigger.player); - player.chooseToDiscard('he','是否发动【碎岩】?').ai=function(card){ + var next=player.chooseToDiscard('he','是否发动【碎岩】?'); + next.ai=function(card){ if(att<0) return 7-ai.get.value(card); return -1; } + next.logSkill=['suiyan',trigger.player]; "step 1" if(result.bool){ - player.logSkill('suiyan',trigger.player); trigger.player.discard(trigger.player.get('e')); } }, @@ -2146,7 +2150,9 @@ character.swd={ str+='对'+get.translation(trigger.targets); } str+='的'+get.translation(trigger.card)+'失效?' - player.chooseToDiscard('he',{type:'equip'},str).ai=function(card){ + var next=player.chooseToDiscard('he',{type:'equip'},str); + next.logSkill='gongshen'; + next.ai=function(card){ if(effect<0){ var val=9-ai.get.value(card); var nme=trigger.card.name; @@ -2173,7 +2179,6 @@ character.swd={ game.delay(); trigger.untrigger(); trigger.finish(); - player.logSkill('gongshen'); } }, ai:{ @@ -3066,14 +3071,15 @@ character.swd={ }, content:function(){ "step 0" - player.chooseToDiscard('是否弃置两张手牌将'+get.translation(trigger.card)+'反弹?',2).ai=function(card){ + var next=player.chooseToDiscard('是否弃置两张手牌将'+get.translation(trigger.card)+'反弹?',2); + next.ai=function(card){ if(ai.get.effect(player,trigger.card)<0) return 4-ai.get.value(card); return 0; } + next.logSkill='yihua'; "step 1" if(result.bool){ // player.discard(result.cards); - player.logSkill('yihua'); trigger.target=trigger.player; trigger.player=player; trigger.untrigger(); @@ -3312,10 +3318,9 @@ character.swd={ }, content:function(){ "step 0" - player.chooseToUse({name:'sha'},'是否对'+get.translation(trigger.player)+'使用一张杀',trigger.player); + player.chooseToUse({name:'sha'},'是否对'+get.translation(trigger.player)+'使用一张杀',trigger.player).logSkill='rexue'; "step 1" if(result.bool){ - player.logSkill('rexue'); player.draw(); } } @@ -3400,7 +3405,9 @@ character.swd={ "step 0" var att=ai.get.attitude(player,trigger.player); var nh=player.num('h'); - player.chooseToDiscard('是否发动苏生?').ai=function(card){ + var next=player.chooseToDiscard('是否发动苏生?'); + next.logSkill='susheng'; + next.ai=function(card){ if(att>3||(att>1&&nh>2)){ return ai.get.unuseful2(card); } @@ -3414,7 +3421,6 @@ character.swd={ trigger.player.hp=1; if(trigger.player.maxHp<1) trigger.player.maxHp=1; trigger.player.update(); - player.logSkill('susheng'); player.addTempSkill('susheng2','phaseAfter'); } @@ -4268,9 +4274,11 @@ character.swd={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('he','是否发动【唤魂】?',function(card){ + var next=player.chooseToDiscard('he','是否发动【唤魂】?',function(card){ return get.color(card)=='red'; - }).ai=function(card){ + }); + next.logSkill=['huanhun',trigger.player]; + next.ai=function(card){ if(ai.get.attitude(player,trigger.player)>0){ return 8-ai.get.value(card); } @@ -4278,7 +4286,6 @@ character.swd={ }; "step 1" if(result.bool){ - player.logSkill('huanhun',trigger.player); trigger.player.judge(function(card){ return get.color(card)=='red'?1:-1; }); @@ -4394,7 +4401,9 @@ character.swd={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('请选择发动代形的卡牌','he',[1,player.num('he')]).ai=function(card){ + var next=player.chooseToDiscard('请选择发动代形的卡牌','he',[1,player.num('he')]); + next.logSkill='daixing'; + next.ai=function(card){ if(ui.selected.cards.length>=2) return 0; if(ui.selected.cards.length==1){ if(player.num('h')>player.hp){ @@ -4408,7 +4417,6 @@ character.swd={ if(result.bool){ player.changeHujia(result.cards.length); player.storage.daixing=result.cards.length; - player.logSkill('daixing'); } }, ai:{ @@ -5051,7 +5059,9 @@ character.swd={ var num=player.num('h')-trigger.source.num('h'); event.num=num; if(num>0){ - player.chooseToDiscard(num,'是否弃置'+num+'张手牌,并对'+get.translation(trigger.source)+'造成一点伤害?').ai=function(card){ + var next=player.chooseToDiscard(num,'是否弃置'+num+'张手牌,并对'+get.translation(trigger.source)+'造成一点伤害?'); + next.logSkill=['pozhen',trigger.source]; + next.ai=function(card){ if(ai.get.damageEffect(trigger.source,player,player)>0&&num<=2){ return 6-ai.get.value(card); } @@ -5068,11 +5078,11 @@ character.swd={ } "step 1" if(result.bool){ - player.logSkill('pozhen',trigger.source); if(event.num>0){ trigger.source.damage(); } else{ + player.logSkill('pozhen',trigger.source); var cards=trigger.source.get('h'); cards.sort(lib.sort.random); trigger.source.discard(cards.slice(0,-event.num)); @@ -5605,9 +5615,11 @@ character.swd={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('he','是否弃置一张装备牌抵消伤害?',function(card,player){ + var next=player.chooseToDiscard('he','是否弃置一张装备牌抵消伤害?',function(card,player){ return get.type(card)=='equip'; - }).ai=function(card){ + }); + next.logSkill='yulin'; + next.ai=function(card){ if(player.hp==1||trigger.num>1){ return 9-ai.get.value(card); } @@ -5618,7 +5630,6 @@ character.swd={ }; "step 1" if(result.bool){ - player.logSkill('yulin'); game.delay(); trigger.untrigger(); trigger.finish(); @@ -5792,9 +5803,11 @@ character.swd={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('朱羽:是否弃置一张红色手牌使其受到一点火焰伤害?',function(card){ + var next=player.chooseToDiscard('朱羽:是否弃置一张红色手牌使其受到一点火焰伤害?',function(card){ return get.color(card)=='red'; - }).ai=function(card){ + }); + next.logSkill=['zhuyu',trigger.player,'fire']; + next.ai=function(card){ if(trigger.player.hasSkillTag('nofire')) return 0; if(ai.get.damageEffect(trigger.player,player,player,'fire')>0){ return 9-ai.get.value(card); @@ -5803,7 +5816,6 @@ character.swd={ }; "step 1" if(result.bool){ - player.logSkill('zhuyu',trigger.player,'fire'); trigger.player.damage('fire'); } } @@ -5822,9 +5834,11 @@ character.swd={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('是否弃置一张黑色手牌使其横置或翻面?',function(card){ + var next=player.chooseToDiscard('是否弃置一张黑色手牌使其横置或翻面?',function(card){ return get.color(card)=='black'; - }).ai=function(card){ + }); + next.logSkill='ningshuang'; + next.ai=function(card){ if(ai.get.attitude(player,trigger.player)<0){ return 9-ai.get.value(card); } @@ -5832,7 +5846,6 @@ character.swd={ }; "step 1" if(result.bool){ - player.logSkill('ningshuang'); if(trigger.player.classList.contains('turnedover')){ trigger.player.loseHp(); } @@ -6239,7 +6252,7 @@ character.swd={ list=list.concat(game.players[i].get('j')); } var dialog=ui.create.dialog(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+get.translation(trigger.player.judging)+ - ',是否发动【天轮】?',list); + ',是否发动【天轮】?',list,'hidden'); player.chooseButton(dialog,function(button){ var card=button.link; var trigger=_status.event.parent._trigger; @@ -6275,7 +6288,7 @@ character.swd={ } } }, - longyin:{ + hlongyin:{ enable:'phaseUse', usable:1, filterCard:function(card,player){ @@ -6875,16 +6888,17 @@ character.swd={ ai.get.attitude(player,trigger.source)<0&& ai.get.damageEffect(trigger.player,trigger.source,player)< ai.get.damageEffect(trigger.source,trigger.player,player); - player.chooseToDiscard('是否将伤害来源('+get.translation(trigger.source)+ - ')和目标('+get.translation(trigger.player)+')对调?','he').ai=function(card){ + var next=player.chooseToDiscard('是否将伤害来源('+get.translation(trigger.source)+ + ')和目标('+get.translation(trigger.player)+')对调?','he'); + next.ai=function(card){ if(go){ return 10-ai.get.value(card); } return 0; }; + next.logSkill='yinguo'; "step 1" if(result.bool){ - player.logSkill('yinguo'); var target=trigger.player; trigger.player=trigger.source; trigger.source=target; @@ -7568,13 +7582,14 @@ character.swd={ content:function(){ "step 0" var dis=trigger.target.num('h','shan')||trigger.target.num('e','bagua')||trigger.target.num('h')>2; - player.chooseToDiscard('是否发动【狩猎】?').ai=function(card){ + var next=player.chooseToDiscard('是否发动【狩猎】?'); + next.ai=function(card){ if(dis) return 7-ai.get.value(card); return 0; } + next.logSkill='shoulie'; "step 1" if(result.bool){ - player.logSkill('shoulie'); trigger.directHit=true; } } @@ -7817,7 +7832,7 @@ character.swd={ bingfeng2_info:'不能使用或打出手牌', bingfeng_info:'限定技,出牌阶段,你可以指定至多三个目标与其一同翻面,且处于翻面状态时不能使用或打出手牌;若如此做,你失去技能玄咒并减少一点体力上限', guozao:'聒噪', - guozao_info:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定一名有手牌的角色将手牌与这些牌交换', + guozao_info:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离2以内的一名有手牌角色将手牌与这些牌交换', heihuo:'黑火', heihuo_info:'出牌阶段,你可以弃置一张装备牌,令你的手牌数加倍;若你的手牌因此达到8张或更多,你立即受到3点火焰伤害且本回合内不能再次发动黑火', yaotong:'妖瞳', @@ -8097,7 +8112,7 @@ character.swd={ tianhuo:'天火', huanyin:'幻音', tianlun:'天轮', - longyin:'龙吟', + hlongyin:'龙吟', lanzhi:'兰芷', duanyi:'断意', miesheng:'灭生', @@ -8166,7 +8181,7 @@ character.swd={ duanyi_info:'出牌阶段限一次,你可以弃置两张杀,对一名角色造成一点伤害,然后其翻面并摸X张牌,X为其已损失的体力值', guxing_info:'出牌阶段,你可以将最后至多X张手牌当杀使用,此杀无视距离且可以指定至多3个目标,每造成一次伤害,你摸一张牌,X为你已损失的体力值且至少为1。', tianlun_info:'任意一名角色的判定生效前,你可以弃置一张场上角色的判定牌代替之', - longyin_info:'出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次', + hlongyin_info:'出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次', lanzhi_info:'每当你即将造成伤害,可以防止此伤害,然后摸两张牌。每回合限发动一次。', tianhuo_info:'出牌阶段,你可以令所有角色弃置其判定区域内的牌,并受到没有来源的等量火焰伤害,每阶段限一次', huanyin_info:'锁定技,每当你成为其他角色的卡牌的目标时,你进行一次判定,若为黑桃则取消之,若为红桃你摸一张牌', diff --git a/character/xianjian.js b/character/xianjian.js index 66b883ad5..bef3ecdf3 100755 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -408,7 +408,9 @@ character.xianjian={ targets.push(game.players[i]); } } - player.chooseToDiscard('是否对'+get.translation(targets)+'发动【忘忧】?','he').ai=function(card){ + var next=player.chooseToDiscard('是否对'+get.translation(targets)+'发动【忘忧】?','he'); + next.logSkill=['wangyou',event.targets]; + next.ai=function(card){ if(num<=0) return 0; switch(num){ case 1:return 5-ai.get.value(card); @@ -420,7 +422,6 @@ character.xianjian={ "step 1" if(result.bool){ event.targets.sort(lib.sort.seat); - player.logSkill('wangyou',event.targets); game.asyncDraw(event.targets); } else{ @@ -760,7 +761,8 @@ character.xianjian={ } } if(num){ - player.chooseToDiscard(num,'是否发动【千方】?','he').ai=function(card){ + var next=player.chooseToDiscard(num,'是否发动【千方】?','he'); + next.ai=function(card){ if(ainum>=0){ switch(num){ case 1:return 8-ai.get.value(card); @@ -770,6 +772,8 @@ character.xianjian={ } return -1; } + next.logSkill='qianfang'; + event.logged=true; } else{ player.chooseBool('是否发动【千方】?').ai=function(){ @@ -781,7 +785,7 @@ character.xianjian={ player.storage.xuanning=0; player.unmarkSkill('xuanning'); player.addTempSkill('qianfang2','phaseAfter'); - player.logSkill('qianfang'); + if(!event.logged) player.logSkill('qianfang'); player.useCard({name:'wanjian'},event.targets); } else{ @@ -1223,7 +1227,9 @@ character.xianjian={ trigger:{target:'useCardToBefore'}, content:function(){ "step 0" - player.chooseToDiscard('是否弃置两张牌使'+get.translation(trigger.card)+'失效?','he',2).ai=function(card){ + var next=player.chooseToDiscard('是否弃置两张牌使'+get.translation(trigger.card)+'失效?','he',2); + next.logSkill='xiaoyao'; + next.ai=function(card){ if(ai.get.effect(player,trigger.card,trigger.player,player)<0){ if(get.tag(trigger.card,'respondSha')&&player.num('h','sha')) return 0; if(get.tag(trigger.card,'respondShan')&&player.num('h','shan')) return 0; @@ -1235,7 +1241,6 @@ character.xianjian={ if(result.bool){ trigger.untrigger(); trigger.finish(); - player.logSkill('xiaoyao'); } } }, diff --git a/character/yijiang.js b/character/yijiang.js index bffbce9cc..2baf0dd96 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -14,8 +14,8 @@ character.yijiang={ masu:['male','shu',3,['xinzhan','huilei'],['fullskin']], fazheng:['male','shu',3,['enyuan','xuanhuo'],['fullskin']], xin_fazheng:['male','shu',3,['xinenyuan','xinxuanhuo'],['fullskin']], - // zhuran:['male','wu',4,['danshou']], - xusheng:['male','wu',4,['pojun'],['fullskin']], + zhuran:['male','wu',4,['danshou'],['fullskin']], + xusheng:['male','wu',4,['xinpojun'],['fullskin']], wuguotai:['female','wu',3,['ganlu','buyi'],['fullskin']], lingtong:['male','wu',4,['xuanfeng'],['fullskin']], liubiao:['male','qun',3,['zongshi','zishou'],['fullskin']], @@ -41,9 +41,1830 @@ character.yijiang={ zhangsong:['male','shu',3,['qiangzhi','xiantu'],['fullskin']], zhuhuan:['male','wu',4,['youdi'],['fullskin']], xiahoushi:['female','shu',3,['qiaoshi','yanyu'],['fullskin']], - // zhoucang:['male','shu',4,['zhongyong'],['fullskin']], + + panzhangmazhong:['male','wu',4,['anjian','duodao'],['fullskin']], + zhoucang:['male','shu',4,['zhongyong'],['fullskin']], + guanping:['male','shu',4,['longyin'],['fullskin']], + liaohua:['male','shu',4,['dangxian','fuli'],['fullskin']], + chengpu:['male','wu',4,['lihuo','chunlao'],['fullskin']], + gaoshun:['male','qun',4,['xianzhen','jinjiu'],['fullskin']], + caozhen:['male','wei',4,['sidi'],['fullskin']], + wuyi:['male','shu',4,['benxi'],['fullskin']], + hanhaoshihuan:['male','wei',4,['shenduan','yonglve'],['fullskin']], + + caorui:['male','wei',3,['huituo','mingjian','xingshuai'],['fullskin','zhu']], + caoxiu:['male','wei',4,['taoxi'],['fullskin']], + zhongyao:['male','wei',3,['huomo','zuoding'],['fullskin']], + liuchen:['male','shu',4,['zhanjue','qinwang'],['fullskin','zhu']], + zhangyi:['male','shu',4,['wurong','shizhi'],['fullskin']], + sunxiu:['male','wu',3,['yanzhu','xingxue','zhaofu'],['fullskin','zhu']], + zhuzhi:['male','wu',4,['anguo'],['fullskin']], + quancong:['male','wu',4,['yaoming'],['fullskin']], + gongsunyuan:['male','qun',4,['huaiyi'],['fullskin']], + guotufengji:['male','shu',3,['jigong','shifei'],['fullskin']], }, skill:{ + jinjiu:{ + mod:{ + cardEnabled:function(card,player){ + if(card.name=='jiu'&&_status.event.skill!='jinjiu') return false; + }, + cardUsable:function(card,player){ + if(card.name=='jiu'&&_status.event.skill!='jinjiu') return false; + }, + cardRespondable:function(card,player){ + if(card.name=='jiu'&&_status.event.skill!='jinjiu') return false; + }, + cardSavable:function(card,player){ + if(card.name=='jiu'&&_status.event.skill!='jinjiu') return false; + }, + }, + enable:['chooseToUse','chooseToRespond'], + filter:function(event,player){ + return player.num('h','jiu')>0; + }, + filterCard:{name:'jiu'}, + viewAs:{name:'sha'}, + viewAsFilter:function(player){ + if(!player.num('h','jiu')) return false; + }, + check:function(){return 1}, + ai:{ + skillTagFilter:function(player){ + if(!player.num('h','jiu')) return false; + }, + respondSha:true, + order:4, + useful:-1, + value:-1 + } + }, + xianzhen:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + return player!=target&&target.num('h')>0; + }, + filter:function(event,player){ + return player.num('h')>0; + }, + content:function(){ + "step 0" + player.chooseToCompare(target); + "step 1" + if(result.bool){ + player.storage.xianzhen=target; + player.addTempSkill('xianzhen2','phaseAfter'); + player.addTempSkill('unequip','phaseAfter'); + } + else{ + player.addTempSkill('xianzhen3','phaseAfter'); + } + }, + ai:{ + order:function(name,player){ + var cards=player.get('h'); + if(player.num('h','sha')==0){ + return 1; + } + for(var i=0;i11&&ai.get.value(cards[i])<7){ + return 9; + } + } + return lib.card.sha.ai.order-1; + }, + result:{ + player:function(player){ + if(player.num('h','sha')>0) return 0.6; + var num=player.num('h'); + if(num>player.hp) return 0; + if(num==1) return -2; + if(num==2) return -1; + return -0.7; + }, + target:function(player,target){ + var num=target.num('h'); + if(num==1) return -1; + if(num==2) return -0.7; + return -0.5 + }, + }, + threaten:1.3 + } + }, + xianzhen2:{ + mod:{ + targetInRange:function(card,player,target,now){ + if(player.storage.xianzhen==target) return true; + }, + cardUsable:function(card,player,num){ + if(card.name=='sha') return Infinity; + } + }, + }, + xianzhen3:{ + mod:{ + cardEnabled:function(card){if(card.name=='sha') return false} + } + }, + lihuo:{ + enable:'phaseUse', + usable:1, + filterCard:function(card){ + return card.name=='sha'&&!card.nature; + }, + filter:function(event,player){ + return player.num('h','sha')>0 + }, + viewAs:{name:'sha',nature:'fire'}, + mod:{ + selectTarget:function(card,player,range){ + if(card.name=='sha'&&card.nature=='fire'&&range[1]!=-1){ + range[1]++; + } + }, + } + }, + chunlao:{ + trigger:{player:'phaseEnd'}, + direct:true, + audio:2, + filter:function(event,player){ + return player.num('h','sha')>0&&!player.storage.chunlao.length; + }, + init:function(player){ + player.storage.chunlao=[]; + }, + intro:{ + content:'cards', + }, + content:function(){ + 'step 0' + player.chooseCard([1,player.num('h','sha')],'是否发动【醇醪】?',{name:'sha'}).ai=function(){ + return 1; + }; + 'step 1' + if(result.bool){ + player.logSkill('chunlao'); + player.storage.chunlao=player.storage.chunlao.concat(result.cards); + player.syncStorage('chunlao'); + player.markSkill('chunlao'); + player.lose(result.cards,ui.special); + player.$give(result.cards,player); + } + }, + ai:{ + effect:{ + player:function(card,player){ + console.log(1); + if(_status.currentPhase!=player) return; + if(card.name=='sha'&&player.num('h')<=player.hp&&!player.storage.chunlao.length){ + + return [0,0,0,0]; + } + } + }, + }, + group:'chunlao2', + ai:{ + threaten:1.4 + } + }, + chunlao2:{ + trigger:{global:'dying'}, + priority:6, + filter:function(event,player){ + return event.player.hp<=0&&player.storage.chunlao.length>0; + }, + direct:true, + content:function(){ + "step 0" + var att=ai.get.attitude(player,trigger.player); + player.chooseCardButton('是否对'+get.translation(trigger.player)+'发动【醇醪】?',player.storage.chunlao).ai=function(button){ + if(att>0) return 1; + return 0; + }; + "step 1" + if(result.bool){ + player.logSkill('chunlao',trigger.player); + player.$throw(result.links); + player.storage.chunlao.remove(result.links[0]); + ui.discardPile.appendChild(result.links[0]); + player.syncStorage('chunlao'); + trigger.player.useCard({name:'jiu'},trigger.player); + if(!player.storage.chunlao.length){ + player.unmarkSkill('chunlao'); + } + } + }, + ai:{ + expose:0.2 + } + }, + shenduan:{ + trigger:{player:'discardAfter'}, + filter:function(event,player){ + for(var i=0;i0; + }, + content:function(){ + 'step 0' + var att=ai.get.attitude(player,trigger.player); + var nh=trigger.player.num('h'); + var eff=ai.get.effect(trigger.player,{name:'sha'},player,player); + player.chooseCardButton('是否对'+get.translation(trigger.player)+'发动【勇略】?',trigger.player.get('j')).ai=function(button){ + var name=button.link.viewAs||button.link.name; + if(att>0&&eff>=0) return 1; + if(att>=0&&eff>0) return 1; + if(att>0&&(trigger.player.hp>=3||trigger.player.num('e','bagua')||trigger.player.num('h','shan'))){ + if(name=='lebu'&&nh>trigger.player.hp) return 1; + if(name=='bingliang'&&nh1){ + player.removeSkill('unequip'); + return; + } + } + player.addSkill('unequip'); + }, + group:['benxi2','benxi3'], + mod:{ + globalFrom:function(from,to,distance){ + if(_status.currentPhase==from){ + return distance-get.cardCount(true,from); + } + }, + selectTarget:function(card,player,range){ + if(_status.currentPhase==player){ + if(card.name=='sha'&&range[1]!=-1){ + for(var i=0;i1) return; + } + range[1]++; + } + } + }, + }, + }, + benxi2:{ + trigger:{player:'phaseBegin'}, + forced:true, + popup:false, + silent:true, + priority:5, + filter:function(event,player){ + return player.skills.contains('benxi'); + }, + content:function(){ + player.storage.benxi=!player.skills.contains('unequip'); + if(player.storage.benxi){ + for(var i=0;i1){ + return; + } + } + player.addSkill('unequip'); + } + } + }, + benxi3:{ + trigger:{player:'phaseAfter'}, + forced:true, + popup:false, + silent:true, + content:function(){ + if(player.storage.benxi){ + player.storage.benxi=false; + player.removeSkill('unequip'); + } + } + }, + sidi:{ + trigger:{global:'respondEnd'}, + filter:function(event,player){ + if(event.parent.parent.name!='sha') return false; + if(event.player==player) return true; + return _status.currentPhase==player; + }, + frequent:true, + init:function(player){ + player.storage.sidi=[]; + }, + intro:{ + content:'cards' + }, + content:function(){ + var card=get.cards()[0]; + game.log(get.translation(player)+'将'+get.translation(card)+'置于武将牌上'); + player.$gain2(card); + player.storage.sidi.add(card); + player.markSkill('sidi'); + player.syncStorage('sidi'); + }, + group:'sidi2' + }, + sidi2:{ + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + if(event.player==player) return false; + if(!player.storage.sidi.length) return false; + return true; + }, + check:function(event,player){ + if(ai.get.attitude(player,event.player)>=0) return false; + if(event.player.num('e','zhuge')) return false; + if(event.player.skills.contains('paoxiao')) return false; + for(var i=0;i0) break; + } + if(i==game.players.length) return false; + var nh=event.player.num('h'); + var nsha=event.player.num('h','sha'); + if(nh<2) return false; + switch(nh){ + case 2: + if(nsha) return Math.random()<0.4; + return Math.random()<0.2; + case 3: + if(nsha) return Math.random()<0.8; + return Math.random()<0.3; + case 4: + if(nsha>1) return true; + if(nsha) return Math.random()<0.9; + return Math.random()<0.5; + default:return true; + } + }, + content:function(){ + 'step 0' + if(player.storage.sidi.length==1){ + event.directbutton=player.storage.sidi[0]; + } + else{ + player.chooseCardButton('弃置武将牌上的一张牌',player.storage.sidi,true); + } + 'step 1' + var button; + if(event.directbutton){ + button=event.directbutton; + } + else if(result.bool&&result.links&&result.links.length){ + button=result.links[0]; + } + if(button){ + player.$throw([button]); + player.line(trigger.player,'green'); + game.log(get.translation(player)+'将'+get.translation(button)+'置于弃牌堆'); + ui.discardPile.appendChild(button); + trigger.player.addTempSkill('sidi3','phaseAfter'); + player.storage.sidi.remove(button); + player.syncStorage('sidi'); + if(player.storage.sidi.length==0){ + player.unmarkSkill('sidi'); + } + game.delayx(); + } + } + }, + sidi3:{ + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num-1; + } + } + }, + zhongyong:{ + trigger:{player:'shaMiss'}, + direct:true, + filter:function(event,player){ + return event.responded&&get.itemtype(event.responded.cards)=='cards'; + }, + content:function(){ + "step 0" + var cards=trigger.responded.cards; + event.cards=cards; + player.chooseTarget('忠勇:将'+get.translation(trigger.responded.cards)+'交给一名角色',function(card,player,target){ + return target!=trigger.target; + }).ai=function(target){ + var att=ai.get.attitude(player,target); + if(target.num('h','shan')&&target.num('h')>=2){ + att/=1.5; + } + return att; + } + "step 1" + if(result.bool){ + player.logSkill('zhongyong',result.targets); + result.targets[0].gain(event.cards,'gain2'); + if(result.targets[0]==player){ + event.finish(); + } + } + else{ + event.finish(); + } + "step 2" + if(player.skills.contains('jiu')){ + player.removeSkill('jiu'); + event.jiu=true; + } + player.chooseToUse('是否对'+get.translation(trigger.target)+'再使用一张杀?', + {name:'sha'},trigger.target,-1).logSkill='qinglong'; + "step 3" + if(event.jiu){ + player.addSkill('jiu'); + } + } + }, + dangxian:{ + trigger:{player:'phaseBegin'}, + forced:true, + content:function(){ + player.phaseUse(); + } + }, + longyin:{ + trigger:{global:'shaBegin'}, + direct:true, + filter:function(event,player){ + return event.target==event.targets[0]&&player.num('he')>0&&event.card.name=='sha'&& + _status.currentPhase==event.player&&event.parent.parent.parent.name=='phaseUse'; + }, + content:function(){ + 'step 0' + var go=false; + if(ai.get.attitude(player,trigger.player)>0){ + if(get.color(trigger.card)=='red'){ + go=true; + } + else if(!trigger.player.skills.contains('paoxiao')&& + !trigger.player.skills.contains('tanlnin3')&& + !trigger.player.skills.contains('zhaxiang2')&& + !trigger.player.skills.contains('fengnu')&& + !trigger.player.num('e','zhuge')){ + var nh=trigger.player.num('h'); + if(nh>=4){ + go=true; + } + else if(player.num('h','sha')){ + if(nh==3){ + go=Math.random()<0.8; + } + else if(nh==2){ + go=Math.random()<0.5; + } + } + else if(nh>=3){ + if(nh==3){ + go=Math.random()<0.5; + } + else if(nh==2){ + go=Math.random()<0.2; + } + } + } + } + var next=player.chooseToDiscard('是否发动【龙吟】?','he'); + next.logSkill=['longyin',trigger.player]; + next.ai=function(card){ + if(go){ + return 6-ai.get.value(card); + } + return 0; + } + 'step 1' + if(result.bool){ + trigger.player.getStat().card.sha--; + if(get.color(trigger.card)=='red'){ + player.draw(); + } + player.logSkill('longyin',trigger.player); + } + }, + ai:{ + expose:0.2 + } + }, + jigong:{ + trigger:{player:'phaseUseBegin'}, + check:function(event,player){ + var nh=player.num('h'); + if(nh<=2) return true; + if(nh==3&&!player.num('h','tao')) return Math.random()<0.5; + return false; + }, + content:function(){ + player.draw(2); + player.addTempSkill('jigong2','phaseAfter'); + } + }, + jigong2:{ + mod:{ + maxHandcard:function(player,num){ + var damage=player.getStat().damage; + if(typeof damage=='number') return damage; + return 0; + } + } + }, + shifei:{ + trigger:{player:'chooseToRespondBegin'}, + filter:function(event,player){ + if(event.responded) return false; + if(!event.filterCard({name:'shan'})) return false; + return true; + }, + check:function(event,player){ + if(ai.get.attitude(player,_status.currentPhase)>0) return true; + var nh=_status.currentPhase.num('h')+1; + var hasshan=(player.num('h','shan')>0); + for(var i=0;inh){ + if(!hasshan||ai.get.attitude(player,game.players[i])<=0) return true; + } + } + return false; + }, + content:function(){ + 'step 0' + player.line(_status.currentPhase,'green'); + _status.currentPhase.draw(); + 'step 1' + var nh=_status.currentPhase.num('h'); + var nmax=nh+1; + var targets=[]; + for(var i=0;inmax){ + nmax=nh2; + targets.length=0; + targets.push(game.players[i]); + } + else if(nh2==nmax){ + targets.push(game.players[i]); + } + } + if(targets.length==1){ + event.onlytarget=targets[0]; + } + else if(targets.length){ + player.chooseTarget('选择一名角色弃置其一张牌',true,function(card,player,target){ + return targets.contains(target); + }).ai=function(target){ + return -ai.get.attitude(player,target); + }; + } + else{ + event.finish(); + } + 'step 2' + var target; + if(event.onlytarget){ + target=event.onlytarget; + } + else if(result.targets&&result.targets.length){ + target=result.targets[0]; + } + if(target){ + player.line(target,'green'); + if(target==player){ + player.chooseToDiscard('he',true); + } + else{ + player.discardPlayerCard(target,'he',true); + } + trigger.untrigger(); + trigger.responded=true; + trigger.result={bool:true,card:{name:'shan'}} + } + } + }, + huaiyi:{ + enable:'phaseUse', + usable:1, + delay:0, + filter:function(event,player){ + return player.num('h',{color:'red'})&&player.num('h',{color:'black'}); + }, + content:function(){ + 'step 0' + player.chooseControl('红色','黑色').ai=function(){ + if(player.num('h',{color:'red'})==1&& + player.num('h',{color:'black'})>1) return '红色'; + return '黑色'; + } + 'step 1' + var cards; + if(result.control=='red'){ + cards=player.get('h',{color:'red'}); + } + else{ + cards=player.get('h',{color:'black'}); + } + player.discard(cards); + event.num=cards.length; + 'step 2' + player.chooseTarget([1,event.num],function(card,player,target){ + return target!=player&&target.num('he')>0; + }).ai=function(target){ + return -ai.get.attitude(player,target)+0.5; + } + 'step 3' + if(result.targets){ + event.targets=result.targets; + event.gained=event.targets.length; + } + else{ + event.finish(); + } + 'step 4' + if(event.targets.length){ + player.gainPlayerCard(event.targets.shift(),'he',true); + event.redo(); + } + 'step 5' + if(event.gained>=2){ + player.loseHp(); + } + }, + ai:{ + order:function(item,player){ + if(player.num('h',{color:'red'})==1) return 10; + if(player.num('h',{color:'black'})==1) return 10; + return 1; + }, + result:{ + player:1 + } + } + }, + yaoming:{ + trigger:{player:'damageEnd',source:'damageEnd'}, + direct:true, + filter:function(event,player){ + if(player.skills.contains('yaoming2')) return false; + var nh=player.num('h'); + for(var i=0;inh) return -att; + return att; + } + 'step 1' + if(result.bool){ + player.logSkill('yaoming',result.targets); + player.addTempSkill('yaoming2','phaseAfter'); + var target=result.targets[0]; + if(target.num('h')0; + }, + content:function(){ + 'step 0' + player.choosePlayerCard(target,'e',true); + 'step 1' + if(result.links){ + var num=0; + for(var i=0;inum2){ + player.draw(); + } + }, + ai:{ + order:7, + result:{ + target:function(player,target){ + if(target.get('e','1')||target.get('e','4')) return -1; + if(target.get('e','2')) return -0.7; + return -0.5; + } + } + } + }, + zhaofu:{ + unique:true, + global:'zhaofu2' + }, + zhaofu2:{ + mod:{ + attackTo:function(from,to,distance){ + if(from.group!='wu') return; + var zhu; + for(var i=0;i0&&target!=player; + }, + content:function(){ + 'step 0' + if(target.num('e')){ + target.chooseBool('是否将装备区内的所有牌交给'+get.translation(player)+'?').ai=function(){ + if(player.num('e')>=2) return false; + return true; + } + } + else{ + target.chooseToDiscard(true,'he'); + event.finish(); + } + 'step 1' + if(result.bool){ + var es=target.get('e'); + player.gain(es); + target.$give(es,player); + player.removeSkill('yanzhu'); + } + else{ + target.chooseToDiscard(true,'he'); + } + }, + ai:{ + order:6, + result:{ + target:function(player,target){ + var ne=target.num('e'); + if(!ne) return -2; + if(ne>=2) return -ne; + return 0; + } + } + } + }, + shizhi:{ + mod:{ + cardRespondable:function(card,player){ + if(card.name=='shan'&&player.hp==1&&_status.event.skill!='shizhi') return false; + }, + }, + enable:['chooseToUse','chooseToRespond'], + filter:function(event,player){ + return player.hp==1; + }, + filterCard:{name:'shan'}, + viewAs:{name:'sha'}, + viewAsFilter:function(player){ + if(!player.num('h','shan')) return false; + if(player.hp!=1) return false; + }, + check:function(){return 1}, + ai:{ + skillTagFilter:function(player){ + if(!player.num('h','shan')) return false; + if(player.hp!=1) return false; + }, + respondSha:true, + order:4, + useful:-1, + value:-1 + } + }, + wurong:{ + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return player.num('h')>0; + }, + filterTarget:function(card,player,target){ + return target.num('h')>0; + }, + content:function(){ + "step 0" + if(target.num('h')==0||player.num('h')==0){ + event.finish(); + return; + } + player.chooseCard(true).ai=function(){ + return Math.random(); + }; + "step 1" + event.card1=result.cards[0]; + var rand=Math.random()<0.4; + target.chooseCard(true).ai=function(card){ + if(rand) return card.name=='shan'?1:0; + return card.name=='shan'?0:1; + }; + "step 2" + event.card2=result.cards[0]; + ui.arena.classList.add('thrownhighlight'); + game.addVideo('thrownhighlight1'); + player.$compare(event.card1,target,event.card2); + game.delay(4); + "step 3" + game.log(get.translation(player)+'展示了'+get.translation(event.card1)); + game.log(get.translation(target)+'展示了'+get.translation(event.card2)); + var name1=event.card1.name; + if(player.hp==1&&name1=='shan'){ + name1='sha'; + } + if(name1=='sha'&&event.card2.name!='shan'){ + player.discard(event.card1).animate=false; + target.$gain2(event.card2); + var clone=event.card1.clone; + if(clone){ + clone.style.transition='all 0.5s'; + clone.style.transform='scale(1.2)'; + clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([clone])); + } + target.damage(); + } + else if(name1!='sha'&&event.card2.name=='shan'){ + player.discard(event.card1).animate=false; + target.$gain2(event.card2); + var clone=event.card1.clone; + if(clone){ + clone.style.transition='all 0.5s'; + clone.style.transform='scale(1.2)'; + clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([clone])); + } + player.gainPlayerCard(target,true); + } + else{ + player.$gain2(event.card1); + target.$gain2(event.card2); + } + ui.arena.classList.remove('thrownhighlight'); + game.addVideo('thrownhighlight2'); + }, + ai:{ + order:6, + result:{ + target:-1, + } + } + }, + zhanjue:{ + enable:'phaseUse', + filterCard:true, + selectCard:-1, + filter:function(event,player){ + if(!player.num('h')) return false; + if(player.storage.zhanjue>=2) return false; + return true; + }, + prepare:function(cards,player,targets){ + player.$throw(cards); + player.line(targets); + }, + discard:false, + filterTarget:function(card,player,target){ + return player.canUse('juedou',target); + }, + content:function(){ + targets.sort(lib.sort.seat); + player.useCard({name:'juedou'},cards,targets,'zhanjue').animate=false; + }, + group:['zhanjue2','zhanjue3'], + ai:{ + order:1, + result:{ + target:function(player,target){ + if(player.num('h')>3) return 0; + if(target.num('h','sha')) return 0; + if(player.num('h','tao')) return 0; + return ai.get.effect(target,{name:'juedou'},player,target); + } + } + } + }, + zhanjue2:{ + trigger:{player:'phaseBegin'}, + forced:true, + popup:false, + silent:true, + content:function(){ + player.storage.zhanjue=0; + } + }, + zhanjue3:{ + trigger:{player:'damageAfter',source:'damageAfter'}, + forced:true, + popup:false, + filter:function(event,player){ + return event.parent.skill=='zhanjue'; + }, + content:function(){ + if(player==trigger.source){ + game.asyncDraw([player,trigger.player]); + player.storage.zhanjue++; + } + else{ + player.draw(2); + player.storage.zhanjue+=2; + } + } + }, + qinwang:{ + unique:true, + group:['qinwang1','qinwang2'], + }, + qinwang1:{ + trigger:{player:'chooseToRespondBegin'}, + filter:function(event,player){ + if(event.responded) return false; + if(!player.isZhu) return false; + if(event.filterCard({name:'sha'})==false) return false; + for(var i=0;i0&&game.players[i].num('h')>=3){ + yep=true;break; + } + } + var next=player.chooseToDiscard('是否发动【勤王】?','he'); + next.ai=function(card){ + if(yep) return 5-ai.get.value(card); + return 0; + } + next.logSkill='qinwang' + "step 1" + if(!result.bool){ + event.finish(); + } + "step 2" + if(event.current==undefined) event.current=player.next; + if(event.current==player){ + event.finish(); + } + else if(event.current.group=='shu'){ + var next=event.current.chooseToRespond('是否替'+get.translation(player)+'打出一张杀?',{name:'sha'}); + next.ai=function(){ + var event=_status.event; + return (ai.get.attitude(event.player,event.source)-2); + }; + next.autochoose=lib.filter.autoRespondSha; + next.source=player; + } + "step 3" + if(result.bool){ + event.finish(); + trigger.result=result; + trigger.responded=true; + trigger.animate=false; + event.current.draw(); + if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ + event.current.ai.shown+=0.3; + if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + } + } + else{ + event.current=event.current.next; + event.goto(2); + } + } + }, + qinwang2:{ + enable:'chooseToUse', + filter:function(event,player){ + if(event.filterCard&&!event.filterCard({name:'sha'},player)) return false; + if(!player.isZhu) return false; + if(player!=game.me&&player.skills.contains('qinwang3')) return false; + for(var i=0;i0&&game.players[i].num('h')>=3){ + return 5-ai.get.value(card); + } + } + return 0; + }, + filterTarget:function(card,player,target){ + if(_status.event._backup&& + typeof _status.event._backup.filterTarget=='function'&& + !_status.event._backup.filterTarget({name:'sha'},player,target)){ + return false; + } + return player.canUse({name:'sha'},target); + }, + content:function(){ + "step 0" + if(event.current==undefined) event.current=player.next; + if(event.current==player){ + player.addTempSkill('qinwang3','phaseAfter'); + event.parent.parent.step=0; + event.finish(); + } + else if(event.current.group=='shu'){ + var next=event.current.chooseToRespond('是否替'+get.translation(player)+'对'+get.translation(target)+'使用一张杀', + function(card){return player.canUse(card,target)&&card.name=='sha';}); + next.ai=function(card){ + var event=_status.event; + return ai.get.effect(event.target,card,event.source,event.player); + }; + next.autochoose=lib.filter.autoRespondSha; + next.source=player; + next.target=target; + } + "step 1" + if(result.bool){ + event.finish(); + event.current.draw(); + if(result.cards&&result.cards.length==1&&result.cards[0].name=='sha'){ + player.useCard(result.cards[0],target).animate=false; + } + else{ + player.useCard({name:'sha'},target).animate=false; + } + if(typeof event.current.ai.shown=='number'&&event.current.ai.shown<0.95){ + event.current.ai.shown+=0.3; + if(event.current.ai.shown>0.95) event.current.ai.shown=0.95; + } + } + else{ + event.current=event.current.next; + event.goto(0); + } + }, + ai:{ + result:{ + target:function(player,target){ + if(player.skills.contains('qinwang3')) return 0; + return ai.get.effect(target,{name:'sha'},player,target); + } + }, + order:function(){ + return lib.card.sha.ai.order-0.1; + }, + } + }, + qinwang3:{}, + zuoding:{ + trigger:{global:'useCard'}, + filter:function(event,player){ + return !player.skills.contains('zuoding2')&&get.suit(event.card)=='spade'&& + event.targets&&event.targets.length&&event.player!=player; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget('是否发动【佐定】?',function(card,player,target){ + return trigger.targets.contains(target); + }).ai=function(target){ + return ai.get.attitude(player,target); + } + 'step 1' + if(result.bool){ + player.logSkill('zuoding',result.targets); + result.targets[0].draw(); + } + }, + ai:{ + expose:0.2 + }, + group:'zuoding3' + }, + zuoding2:{}, + zuoding3:{ + trigger:{global:'damageEnd'}, + forced:true, + popup:false, + silent:true, + content:function(){ + player.addTempSkill('zuoding2','phaseAfter'); + } + }, + huomo:{ + trigger:{player:'chooseToRespondBegin'}, + filter:function(event,player){ + if(event.responded) return false; + if(!event.filterCard({name:'shan'})) return false; + if(player.skills.contains('huomo2')) return false; + if(event.parent.name!='sha') return false; + var hs=player.get('h',{color:'black'}); + for(var i=0;i0&&!player.skills.contains('taoxi4')&&player!=event.target; + }, + check:function(event,player){ + return ai.get.attitude(player,event.target)<0; + }, + intro:{ + content:'cards' + }, + content:function(){ + var card=trigger.target.get('h').randomGet(); + player.showCards([card]); + player.storage.taoxi=card; + player.storage.taoxi2=trigger.target; + player.syncStorage('taoxi'); + player.markSkill('taoxi'); + player.addTempSkill('taoxi4','phaseAfter'); + }, + intro:{ + content:'card' + }, + group:['taoxi2','taoxi3'] + }, + taoxi2:{ + enable:'phaseUse', + filter:function(event,player){ + if(player.storage.taoxi&&player.storage.taoxi2&& + get.owner(player.storage.taoxi)==player.storage.taoxi2&& + lib.filter.filterCard(player.storage.taoxi,player,event)){ + return true; + } + return false; + }, + filterTarget:function(card,player,target){ + return player.canUse(player.storage.taoxi,target); + }, + selectTarget:function(){ + return get.select(get.info(_status.event.player.storage.taoxi).selectTarget); + }, + content:function(){ + player.useCard(player.storage.taoxi,targets); + delete player.storage.taoxi; + delete player.storage.taoxi2; + player.unmarkSkill('taoxi'); + }, + ai:{ + order:8, + result:{ + target:function(player,target){ + return ai.get.effect(target,player.storage.taoxi,player,target); + }, + player:1 + } + } + }, + taoxi3:{ + trigger:{player:'phaseEnd'}, + forced:true, + popup:false, + filter:function(event,player){ + return player.storage.taoxi?true:false; + }, + content:function(){ + if(get.owner(player.storage.taoxi)==player.storage.taoxi2){ + player.loseHp(); + } + delete player.storage.taoxi; + delete player.storage.taoxi2; + player.unmarkSkill('taoxi'); + } + }, + taoxi4:{}, + xingshuai:{ + trigger:{player:'dying'}, + priority:6, + filter:function(event,player){ + if(player.storage.xingshuai) return false; + if(player.hp>0) return false; + if(!player.isZhu) return false; + for(var i=0;i2; + } + 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(get.translation(event.current)+'令'+get.translation(player)+'回复一点体力'); + } + if(event.targets.length){ + event.goto(1); + } + 'step 3' + if(event.damages.length){ + player.recover(event.damages.length); + } + 'step 4' + if(event.damages.length){ + event.damages.shift().damage('nosource'); + event.redo(); + } + } + }, + mingjian:{ + trigger:{player:'phaseUseBefore'}, + direct:true, + filter:function(event,player){ + return player.num('h')>0; + }, + content:function(){ + 'step 0' + var go=Math.random()<0.5; + player.chooseTarget('是否发动【明鉴】?',function(card,player,target){ + return player!=target + }).ai=function(target){ + var att=ai.get.attitude(player,target); + if(att>3){ + if(player.num('h')>player.hp) return att; + if(go) return att; + } + return 0; + } + 'step 1' + if(result.bool){ + player.logSkill('huituo',result.targets); + trigger.untrigger(); + trigger.finish(); + var target=result.targets[0]; + target.addSkill('mingjian2'); + var hs=player.get('h'); + target.gain(hs); + player.$give(hs.length,target); + } + } + }, + mingjian2:{ + trigger:{global:'phaseAfter'}, + forced:true, + popup:false, + content:function(){ + if(lib.config.glow_phase){ + if(_status.currentPhase){ + _status.currentPhase.classList.remove('glow_phase'); + } + player.classList.add('glow_phase'); + } + game.addVideo('phaseChange',player); + _status.currentPhase=player; + player.ai.tempIgnore=[]; + player.stat.push({card:{},skill:{}}); + player.phaseUse(); + player.removeSkill('mingjian2'); + } + }, + huituo:{ + trigger:{player:'damageEnd'}, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget('是否发动【恢拓】?').ai=function(target){ + if(ai.get.attitude(player,target)>0){ + return ai.get.recoverEffect(target,player,player)+1; + } + return 0; + } + 'step 1' + if(result.bool){ + player.logSkill('huituo',result.targets); + var target=result.targets[0]; + event.target=target; + target.judge(function(card){ + if(target.hp==target.maxHp){ + if(get.color(card)=='red') return 0; + } + if(get.color(card)=='red') return 1.5; + return 1; + }); + } + else{ + event.finish(); + } + 'step 2' + if(result.color){ + if(result.color=='red'){ + if(event.target.hp0&&event.source&&event.source.get('e','1')!=undefined&& + event.card&&event.card.name=='sha'; + }, + check:function(event,player){ + return ai.get.attitude(player,event.source)<=0; + }, + direct:true, + priority:5, + audio:2, + content:function(){ + 'step 0' + var next=player.chooseToDiscard('he','是否发动【夺刀】?'); + next.logSkill=['duodao',trigger.source]; + next.ai=function(card){ + if(ai.get.attitude(player,trigger.source)<0){ + return 6-ai.get.value(card); + } + return 0; + }; + 'step 1' + if(result.bool){ + trigger.source.$give(trigger.source.get('e','1'),player); + player.gain(trigger.source.get('e','1')); + } + }, + }, + anjian:{ + audio:2, + trigger:{source:'damageBegin'}, + check:function(event,player){ + return ai.get.attitude(player,event.player)<=0; + }, + forced:true, + filter:function(event,player){ + return event.card&&event.card.name=='sha'&&get.distance(event.player,player,'attack')>1&& + event.parent.name!='_lianhuan'&&event.parent.name!='_lianhuan2'; + }, + content:function(){ + trigger.num++; + } + }, + xinpojun:{ + trigger:{player:'shaBegin'}, + direct:true, + filter:function(event,player){ + return event.target.hp>0&&event.target.num('he')>0; + }, + audio:2, + content:function(){ + 'step 0' + player.choosePlayerCard(trigger.target,'he', + [1,Math.min(trigger.target.num('he'),trigger.target.hp)],'是否发动【破军】?'); + 'step 1' + if(result.bool&&result.links.length){ + player.logSkill('xinpojun'); + if(trigger.target.storage.xinpojun2){ + trigger.target.storage.xinpojun2=trigger.target.storage.xinpojun2.concat(result.links); + } + else{ + trigger.target.storage.xinpojun2=result.links; + } + game.addVideo('storage',trigger.target,['xinpojun2',get.cardsInfo(trigger.target.storage.xinpojun2),'cards']); + trigger.target.addSkill('xinpojun2'); + trigger.target.lose(result.links,ui.special); + } + }, + ai:{ + expose:0.2 + } + }, + xinpojun2:{ + trigger:{global:'phaseEnd'}, + forced:true, + mark:true, + intro:{ + content:'cardCount' + }, + content:function(){ + if(player.storage.xinpojun2){ + player.gain(player.storage.xinpojun2); + delete player.storage.xinpojun2; + } + player.removeSkill('xinpojun2'); + } + }, qiaoshi:{ trigger:{global:'phaseEnd'}, filter:function(event,player){ @@ -52,6 +1873,7 @@ character.yijiang={ check:function(event,player){ return ai.get.attitude(player,event.player)>=0; }, + priority:-5, content:function(){ game.asyncDraw([trigger.player,player]); }, @@ -839,9 +2661,10 @@ character.yijiang={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('he','是否弃置一张装备牌令伤害-1?',function(card,player){ + var next=player.chooseToDiscard('he','是否弃置一张装备牌令伤害-1?',function(card,player){ return get.type(card)=='equip'; - }).ai=function(card){ + }); + next.ai=function(card){ if(player.hp==1||trigger.num>1){ return 9-ai.get.value(card); } @@ -850,9 +2673,9 @@ character.yijiang={ } return 7-ai.get.value(card); }; + next.logSkill='jiaojin'; "step 1" if(result.bool){ - player.logSkill('jiaojin'); game.delay(); trigger.num--; } @@ -968,6 +2791,7 @@ character.yijiang={ } if(!hasfriend) return; if(target.hp>=4) return [0.5,get.tag(card,'damage')*2]; + if(!target.skills.contains('paiyi')&&target.hp>1) return [0.5,get.tag(card,'damage')*1.5]; if(target.hp==3) return [0.5,get.tag(card,'damage')*1.5]; if(target.hp==2) return [1,get.tag(card,'damage')*0.5]; } @@ -2169,7 +3993,7 @@ character.yijiang={ player.update(); }, }, - danshou:{ + danshou_old:{ trigger:{source:'damageEnd'}, priority:9, content:function(){ @@ -2183,6 +4007,74 @@ character.yijiang={ _status.event.untrigger(true); } }, + danshou:{ + enable:'phaseUse', + filterCard:true, + position:'he', + audio:2, + filter:function(event,player){ + var num=player.getStat().skill.danshou; + if(num){ + num++; + } + else{ + num=1; + } + return player.num('he')>=num; + }, + check:function(card){ + return 6-ai.get.value(card); + }, + selectCard:function(card){ + var num=_status.event.player.getStat().skill.danshou; + if(num) return num+1; + return 1; + }, + filterTarget:function(card,player,target){ + var num=player.getStat().skill.danshou; + if(num){ + num++; + } + else{ + num=1; + } + if(num<=2&&!target.num('he')) return false; + return get.distance(player,target,'attack')<=1; + }, + content:function(){ + 'step 0' + var num=player.getStat().skill.danshou; + switch(num){ + case 1:player.discardPlayerCard(target,true);break; + case 2:target.chooseCard('选择一张牌交给'+get.translation(player),'he',true);break; + case 3:target.damage();break; + default:game.asyncDraw([player,target],2); + } + if(num!=2) event.finish(); + 'step 1' + if(result.cards){ + player.gain(result.cards); + target.$give(result.cards.length,player); + } + }, + ai:{ + order:8, + result:{ + target:function(player,target){ + var num=player.getStat().skill.danshou; + if(num){ + num++; + } + else{ + num=1; + } + if(num>3) return 0; + if(num==3) return ai.get.damageEffect(target,player,target); + return -1; + } + } + } + }, qice:{ enable:'phaseUse', usable:1, @@ -2843,7 +4735,9 @@ character.yijiang={ direct:true, content:function(){ "step 0" - player.chooseToDiscard('是否发动【仁心】?',{type:'equip'},'he').ai=function(card){ + var next=player.chooseToDiscard('是否发动【仁心】?',{type:'equip'},'he'); + next.logSkill=['renxin',trigger.player]; + next.ai=function(card){ if(ai.get.attitude(player,trigger.player)>3){ return 11-ai.get.value(card); } @@ -2851,7 +4745,6 @@ character.yijiang={ } "step 1" if(result.bool){ - player.logSkill('renxin',trigger.player); player.turnOver(); } else{ @@ -2874,12 +4767,13 @@ character.yijiang={ }, content:function(){ "step 0" - player.chooseToDiscard('是否发动御策?').ai=function(card){ + var next=player.chooseToDiscard('是否发动御策?'); + next.logSkill='yuce'; + next.ai=function(card){ return 7-ai.get.value(card); } "step 1" if(result.bool){ - player.logSkill('yuce'); var type=get.type(result.cards[0],'trick'); if(trigger.source){ trigger.source.chooseToDiscard('弃置一张'+get.translation(type)+'牌或令'+get.translation(player)+'回复一点体力',function(card){ @@ -3366,6 +5260,101 @@ character.yijiang={ yj_jushou:'沮授', zhuhuan:'朱桓', xiahoushi:'夏侯氏', + panzhangmazhong:'潘璋马忠', + caorui:'曹叡', + caoxiu:'曹休', + zhongyao:'钟繇', + liuchen:'刘谌', + zhangyi:'张嶷', + sunxiu:'孙休', + zhuzhi:'朱治', + quancong:'全琮', + gongsunyuan:'公孙渊', + guotufengji:'郭图逢纪', + zhoucang:'周仓', + guanping:'关平', + liaohua:'廖化', + caozhen:'曹真', + wuyi:'吴懿', + hanhaoshihuan:'韩浩史涣', + chengpu:'程普', + gaoshun:'高顺', + + xianzhen:'陷阵', + xianzhen_info:'出牌阶段,你可以与一名角色拼点。若你赢,你获得以下技能直到回合结束:无视与该角色的距离;无视防具且可使用任意数量的【杀】。若你没赢,你不能使用【杀】直到回合结束。每回合限一次', + jinjiu:'禁酒', + jinjiu_info:'锁定技,你的【酒】均视为【杀】', + chunlao:'醇醪', + chunlao_info:'结束阶段开始时,若没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以将一张“醇”置入弃牌堆,视为该角色使用一张【酒】', + lihuo:'疠火', + lihuo_info:'你可以将一张普通【杀】当火【杀】使用。若以此法使用的【杀】造成了伤害,则此【杀】结算后你失去1点体力;你使用火【杀】指定目标后,可以额外指定一个目标', + shenduan:'慎断', + shenduan_info:'当你的黑色基本牌因弃置而进入弃牌堆时,你可以将之视为 【兵粮寸断】并置于一名其他角色的判定区里', + yonglve:'勇略', + yonglve_info:'你攻击范围内的一名其他角色的判定阶段开始时,你可以弃置其判定区里的一张牌,视为对该角色使用一张【杀】。若此【杀】未造成伤害,你摸一张牌', + benxi:'奔袭', + benxi_info:'锁定技,在你的回合内,你每使用一次牌后,你计算与其他角色的距离便减少1,直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标', + sidi:'司敌', + sidi2:'司敌', + sidi3:'司敌', + sidi_info:'每当你使用或其他角色在你的回合内使用闪时,你可以将牌堆顶的一张牌正面向上置于你的武将牌上;一名其他角色的出牌阶段开始时,你可以将你武将牌上的一张牌置入弃牌堆,然后该角色本阶段可使用杀的次数上限-1', + dangxian:'当先', + dangxian_info:'锁定技,回合开始时,你执行一个额外的出牌阶段', + longyin:'龙吟', + longyin_info:'每当一名角色在其出牌阶段使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数,若此【杀】为红色,你摸一张牌', + zhongyong:'忠勇', + zhongyong_info:'当你于出牌阶段内使用的【杀】被目标角色使用的【闪】抵消时,你可以将此【闪】交给除该角色外的一名角色。若获得此【闪】的角色不是你,你可以对相同的目标再使用一张【杀】', + jigong:'急攻', + jigong_info:'出牌阶段开始时,你可以摸两张牌。若如此做,此回合你的手牌上限改为X(X为你此阶段造成的伤害数)', + shifei:'饰非', + shifei_info:'当你需要使用或打出【闪】时,你可以令当前回合角色摸一张牌,然后若其手牌数不为全场最多,则你弃置全场手牌数最多(或之一)角色的一张牌,视为你使用或打出了一张【闪】', + huaiyi:'怀异', + huaiyi_info:'出牌阶段限一次,你可以展示所有手牌,若其中包含不止一种颜色,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法获得的牌不少于两张,则你失去1点体力', + yaoming:'邀名', + yaoming_info:'每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张牌;2. 令手牌数小于你的一名角色摸一张牌', + anguo:'安国', + anguo_info:'出牌阶段限一次,你可以选择一名其他角色装备区里的一张牌,令其将此牌收回手牌。然后若该角色攻击范围内的角色数因此减少,则你摸一张牌', + yanzhu:'宴诛', + yanzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能“宴诛”,直到游戏结束;或弃置一张牌', + xingxue:'兴学', + xingxue_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值);若你已失去技能“宴诛”,则将X改为你的体力上限', + zhaofu:'诏缚', + zhaofu_info:'主公技,锁定技,你距离为1的角色视为在其他吴势力角色的攻击范围内', + wurong:'怃戎', + wurong_info:'出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌', + shizhi:'矢志', + shizhi_info:'锁定技,当你体力为1时,你的【闪】均视为【杀】', + zhanjue:'战绝', + zhanjue_info:'出牌阶段,你可以将所有手牌当【决斗】使用,结算后你和以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束', + qinwang:'勤王', + qinwang1:'勤王', + qinwang2:'勤王', + qinwang_info:'主公技,你可以弃置一张牌,然后视为你发动“激将”。若有角色响应,则该角色打出【杀】时摸一张牌', + huomo:'活墨', + huomo_sha:'墨杀', + huomo_shan:'墨闪', + huomo_tao:'墨桃', + huomo_jiu:'墨酒', + huomo_info:'每当你需要使用一张你于此回合内未使用过的基本牌时,你可以将一张黑色非基本牌置于牌堆顶,然后视为你使用了此基本牌', + zuoding:'佐定', + zuoding_info:'每当一名其他角色于其出牌阶段内使用♠牌指定目标后,若此阶段没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌', + taoxi:'讨袭', + taoxi2:'讨袭', + taoxi3:'讨袭', + taoxi_info:'出牌阶段限一次,你使用牌指定一名其他角色为唯一目标后,你可以亮出其一张手牌直到回合结束,并且你可以于此回合内将此牌如手牌般使用。回合结束时,若该角色未失去此手牌,则你失去1点体力', + huituo:'恢拓', + huituo_info:'每当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害数)', + mingjian:'明鉴', + mingjian_info:'你可以跳过出牌阶段并将所有手牌交给一名其他角色。若如此做,你结束此回合,然后该角色进行一个额外的出牌阶段', + xingshuai:'兴衰', + xingshuai_info:'主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害', + duodao:'夺刀', + duodao_info:'每当你受到杀造成的一次伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌', + anjian:'暗箭', + anjian_info:'当你使用的杀对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1', + xinpojun:'破军', + xinpojun2:'破军', + xinpojun_info:'当你于出牌阶段内使用【杀】指定一个目标后,你可以将其至多X张牌扣置于该角色的武将牌旁(X为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。', qiaoshi:'樵拾', qiaoshi_info:'其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。', @@ -3539,7 +5528,8 @@ character.yijiang={ zishou_info:'摸牌阶段摸牌时,你可以额外摸X张牌(X为现存势力数)。若如此做,你于本回合出牌阶段内使用的牌不能指定其他角色为目标。', zongshi_info:'锁定技,场上每有一种势力,你的手牌上限便+1。', shiyong_info:'锁定技,每当你受到一次红色【杀】或【酒】【杀】造成的伤害后,你减1点体力上限。', - danshou_info:'每当你造成一次伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。', + danshou_info:'出牌阶段,你可以选择你攻击范围内的一名其他角色,然后弃置X张牌(X为此前你于此阶段你发动“胆守”的次数+1)。若X:为1,你弃置该角色的一张牌;为2,令该角色交给你一张牌;为3,你对该角色造成1点伤害;不小于4,你与该角色各摸两张牌。', + danshou_infox:'每当你造成一次伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。', yizhong_info:'锁定技,当你没有防具时,黑色的杀对你无效', xinzhan_info:'出牌阶段限一次,你可以观看牌堆顶的3张牌,然后展示其中任意数量♥的牌并获得之', huilei_info:'锁定技,杀死你的角色立即弃置所有的牌。', diff --git a/character/yxs.js b/character/yxs.js index 8e76556ac..96d167fd8 100755 --- a/character/yxs.js +++ b/character/yxs.js @@ -658,12 +658,13 @@ character.yxs={ }, content:function(){ "step 0" - player.chooseToDiscard('he','是否弃置一张黑色牌并收回'+get.translation(trigger.card)+'?',{color:'black'}).ai=function(card){ + var next=player.chooseToDiscard('he','是否弃置一张黑色牌并收回'+get.translation(trigger.card)+'?',{color:'black'}); + next.ai=function(card){ return ai.get.value(trigger.card)-ai.get.value(card); } + next.logSkill='jieyong'; "step 1" if(result.bool){ - player.logSkill('jieyong'); player.gain(trigger.card,'gain2'); player.addTempSkill('jieyong2',['phaseAfter','phaseBegin']); } @@ -801,15 +802,16 @@ character.yxs={ "step 0" var val=ai.get.value(trigger.card); var suit=get.suit(trigger.card); - player.chooseToDiscard('he','逐鹿:是否发动弃置一张'+get.translation(suit)+ - '牌并获得'+get.translation(trigger.card)+'?',{suit:suit}).ai=function(card){ + var next=player.chooseToDiscard('he','逐鹿:是否发动弃置一张'+get.translation(suit)+ + '牌并获得'+get.translation(trigger.card)+'?',{suit:suit}); + next.ai=function(card){ return val-ai.get.value(card); }; + next.logSkill='zhulu'; "step 1" if(result.bool){ player.gain(trigger.card,'gain2'); player.addTempSkill('zhulu2','phaseAfter'); - player.logSkill('zhulu'); } }, ai:{ diff --git a/game/game.js b/game/game.js index f1e484939..046ac3677 100755 --- a/game/game.js +++ b/game/game.js @@ -239,6 +239,12 @@ else{ ui.arena.classList.remove('mobile'); } + if(lib.config.layout=='default'){ + ui.arena.classList.add('oldlayout'); + } + else{ + ui.arena.classList.remove('oldlayout'); + } if(lib.config.layout=='default'&&lib.config.hp_style=='official'){ ui.arena.classList.add('hpimage'); } @@ -359,7 +365,7 @@ item:{ default:'无', blur:'模糊', - gray:'黑色', + gray:'黑白', sepia:'怀旧', invert:'反色', saturate:'饱和', @@ -1748,8 +1754,7 @@ help:{ '游戏选项':'
  • 控制台命令
    开启后可用浏览器控制台控制游戏
  • 自动确认
    开启后当候选目标仅有1个时点击目标无需再点击确定
  • '+ '触屏模式
    可消除iOS等设备上300ms的点击延迟,但开启后无法使用鼠标
  • 滚轮控制手牌
    开启后滚轮可控制手牌的左右滚动,建议Mac等具备横向滚动功能的设备关闭此选项'+ - '
  • 隐藏非全身皮肤
    在新版布局中,若角色没有全身皮肤将被隐藏
  • 游戏玩法
    为游戏增加不同玩法,开启后可在帮助中查看介绍'+ - '
  • 加强主公
    反贼人数多于2时主公会额外增加一个技能(每个主公的额外技能固定,非常备主公增加天命)', + '
  • 隐藏非全身皮肤
    在新版布局中,若角色没有全身皮肤将被隐藏
  • 游戏玩法
    为游戏增加不同玩法,开启后可在帮助中查看介绍', '游戏操作':'
    • 长按/鼠标悬停/右键单击(需在设置中开启)显示信息
    • 触屏模式中双指点击切换暂停
    • 移动布局中,点击顶部的左半边或右半边可显示按钮,双击顶部可令界面下移(方便标身份)
    • 键盘快捷键
      '+ '
      a切换托管
      c打开设置
      w切换不询问无懈
      暂停', '游戏命令':'
      变量名
      • 场上角色
        game.players
      • 阵亡角色
        game.dead'+ @@ -1764,7 +1769,8 @@ '
      • 使用卡牌
        player.useCard(card,
        targets)
      • 死亡
        player.die()
      • 复活
        player.revive(hp)
      '+ '
      游戏操作
      • 在命令输入框中输出结果
        game.print(str)
      • 游戏结束
        game.over(bool)'+ '
      • 角色资料
        lib.character
      • 卡牌资料
        lib.card', - '身份模式':'
        明忠
        • 本模式需要8名玩家进行游戏,使用的身份牌为:1主公、2忠臣、4反贼和1内奸。游戏开始时,每名玩家随机获得一个身份,由系统随机选择一名忠臣身份的玩家亮出身份(将忠臣牌正面朝上放在面前),其他身份(包括主公)的玩家不亮出身份。
        • '+ + '身份模式':'
          选项
          • 加强主公
            反贼人数多于2时主公会额外增加一个技能(每个主公的额外技能固定,非常备主公增加天命)
          '+ + '
          明忠
          • 本模式需要8名玩家进行游戏,使用的身份牌为:1主公、2忠臣、4反贼和1内奸。游戏开始时,每名玩家随机获得一个身份,由系统随机选择一名忠臣身份的玩家亮出身份(将忠臣牌正面朝上放在面前),其他身份(包括主公)的玩家不亮出身份。
          • '+ '首先由亮出身份的忠臣玩家随机获得六张武将牌,挑选一名角色,并将选好的武将牌展示给其他玩家。之后其余每名玩家随机获得三张武将牌,各自从其中挑选一张同时亮出
          • '+ '亮出身份牌的忠臣增加1点体力上限。角色濒死和死亡的结算及胜利条件与普通身份局相同。', '战棋模式': @@ -1805,6 +1811,7 @@ } else{ node.addEventListener('mouseenter',ui.click.hoverpopped); + // node.addEventListener('mouseleave',ui.click.hoverpopped_leave); } }, placePoppedDialog:function(dialog,e){ @@ -2203,6 +2210,9 @@ playerproto:{ phase:function(){ "step 0" + if(player.node.judges.childElementCount){ + player.popup('判定阶段'); + } player.phaseJudge(); "step 1" player.phaseDraw(); @@ -2213,6 +2223,7 @@ game.delayx(); } "step 2" + if(!player.skipList.contains('phaseUse')) player.popup('出牌阶段'); player.phaseUse(); "step 3" player.phaseDiscard() @@ -2255,7 +2266,7 @@ }, phaseUse:function(){ "step 0"; - player.chooseToUse(); + player.chooseToUse().modCancel='结束'; "step 1" if(result.bool){ event.goto(0); @@ -2265,6 +2276,9 @@ "step 0" event.num=player.num('h')-game.checkMod(player,player.hp,'maxHandcard',player.get('s')); if(event.num<=0) event.finish(); + else{ + player.popup('弃牌阶段'); + } event.trigger('phaseDiscard'); "step 1" player.chooseToDiscard(num,true); @@ -2352,6 +2366,14 @@ event.skillDialog.close(); } if(event.result.bool){ + if(event.logSkill){ + if(typeof event.logSkill=='string'){ + player.logSkill(event.logSkill); + } + else if(Array.isArray(event.logSkill)){ + player.logSkill.apply(player,event.logSkill); + } + } if(event.result.card||!event.result.skill){ player.useCard(event.result.card,event.result.cards,event.result.targets,event.result.skill); } @@ -2464,6 +2486,14 @@ if(event.promptdiscard){ event.promptdiscard.close(); } + if(event.logSkill&&event.result.bool){ + if(typeof event.logSkill=='string'){ + player.logSkill(event.logSkill); + } + else if(Array.isArray(event.logSkill)){ + player.logSkill.apply(player,event.logSkill); + } + } player.discard(event.result.cards); if(event.dialog) event.dialog.close(); }, @@ -3149,7 +3179,9 @@ } } if(event.animate!=false||num>0){ - if(num==0)game.delayx(); + if(num==0){ + if(event.delayx!==false) game.delayx(); + } else game.delayx(0.5); } "step 3" @@ -3169,7 +3201,7 @@ } "step 5" if(document.getElementsByClassName('thrown').length){ - game.delayx(); + if(event.delayx!==false) game.delayx(); } else{ event.finish(); @@ -4463,6 +4495,13 @@ return cards; } }, + syncStorage:function(skill){ + switch(get.itemtype(this.storage[skill])){ + case 'cards':game.addVideo('storage',this,[skill,get.cardsInfo(this.storage[skill]),'cards']);break; + case 'card':game.addVideo('storage',this,[skill,get.cardInfo(this.storage[skill]),'cards']);break; + default:game.addVideo('storage',this,[skill,this.storage[skill]]); + } + }, playerfocus:function(time){ time=time||1000; this.classList.add('playerfocus'); @@ -6035,7 +6074,7 @@ var dx=this.offsetLeft+this.offsetWidth/2-52-node.offsetLeft; var dy=this.offsetTop+this.offsetHeight/2-52-node.offsetTop; - if(node.style.transform&&node.style.transform!='none'){ + if(node.style.transform&&node.style.transform!='none'&&node.style.transform.indexOf('translate')==-1){ node.style.transform+=' translate('+dx+'px,'+dy+'px)'; } else{ @@ -6220,7 +6259,7 @@ ny=ny[0]*ui.arena.offsetHeight/100+ny[1]; var dx=this.offsetLeft+this.offsetWidth/2-52-nx; var dy=this.offsetTop+this.offsetHeight/2-52-ny; - if(node.style.transform&&node.style.transform!='none'){ + if(node.style.transform&&node.style.transform!='none'&&node.style.transform.indexOf('translate')==-1){ node.style.transform+=' translate('+dx+'px,'+dy+'px)'; } else{ @@ -6264,7 +6303,7 @@ ny=ny[0]*ui.arena.offsetHeight/100+ny[1]; var dx=this.offsetLeft+this.offsetWidth/2-52-nx; var dy=this.offsetTop+this.offsetHeight/2-52-ny; - if(node.style.transform&&node.style.transform!='none'){ + if(node.style.transform&&node.style.transform!='none'&&node.style.transform.indexOf('translate')==-1){ node.style.transform+=' translate('+dx+'px,'+dy+'px)'; } else{ @@ -6358,7 +6397,7 @@ // node.dataset.position=player.dataset.position; var dx=player.offsetLeft+player.offsetWidth/2-52-node.offsetLeft; var dy=player.offsetTop+player.offsetHeight/2-52-node.offsetTop; - if(node.style.transform&&node.style.transform!='none'){ + if(node.style.transform&&node.style.transform!='none'&&node.style.transform.indexOf('translate')==-1){ node.style.transform+=' translate('+dx+'px,'+dy+'px)'; } else{ @@ -6708,21 +6747,26 @@ } } else{ + var zoom1=0.9,zoom2=0.95; + if(arguments[1]=='phase'){ + zoom1=1.05; + zoom2=1.05; + } if(lib.isMobileMe(this)){ if(this.isLinked()){ - this.node.avatar.style.transform='scale(0.9) rotate(-90deg)'; - this.node.avatar2.style.transform='scale(0.9) rotate(-90deg)'; + this.node.avatar.style.transform='scale('+zoom1+') rotate(-90deg)'; + this.node.avatar2.style.transform='scale('+zoom1+') rotate(-90deg)'; } else{ - this.node.avatar.style.transform='scale(0.9)'; - this.node.avatar2.style.transform='scale(0.9)'; + this.node.avatar.style.transform='scale('+zoom1+')'; + this.node.avatar2.style.transform='scale('+zoom1+')'; } } else if(this.isLinked()&&lib.isNewLayout()){ - this.style.transform='scale(0.95) rotate(-90deg)'; + this.style.transform='scale('+zoom2+') rotate(-90deg)'; } else{ - this.style.transform='scale(0.95)'; + this.style.transform='scale('+zoom2+')'; } } this.queue(); @@ -6867,7 +6911,7 @@ var dx=player.offsetLeft+player.offsetWidth/2-52-this.offsetLeft; var dy=player.offsetTop+player.offsetHeight/2-52-this.offsetTop; - if(this.style.transform&&this.style.transform!='none'){ + if(this.style.transform&&this.style.transform!='none'&&this.style.transform.indexOf('translate')==-1){ this.style.transform+=' translate('+dx+'px,'+dy+'px)'; } else{ @@ -7552,7 +7596,9 @@ _status.currentPhase.classList.remove('glow_phase'); } player.classList.add('glow_phase'); + // player.animate('playerbright',500); } + // player.$damage(null,'phase') game.addVideo('phaseChange',player); _status.currentPhase=player; game.log(); @@ -8746,6 +8792,7 @@ for(var j=0;j.background{z-index:-2} animation:cardflip 0.3s ease-out; -webkit-animation:cardflip 0.3s ease-out; } +.player.playerbright{ + filter:brightness(1.2); + -webkit-filter:brightness(1.2); +} .player.playerflip{ animation:playerflip 0.3s ease-out; -webkit-animation:playerflip 0.3s ease-out; @@ -246,7 +250,7 @@ margin-bottom: 5px; .button.character>.intro{top:71px;left:0;} .button.character>.identity{top:-6px;left:72px;} /*--------确认--------*/ -#control{text-align: center;z-index: 2;top: calc(200% / 3);left: calc(5% + 240px);width: calc(90% - 480px);pointer-events: none} +#control{text-align: center;z-index: 5;top: calc(200% / 3);left: calc(5% + 240px);width: calc(90% - 480px);pointer-events: none} #control>*{pointer-events: auto;} .control{padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;margin-left: 4px;margin-right: 4px;} .control{font-size: 18px;white-space: nowrap;position: relative;overflow: hidden;opacity:0} @@ -642,6 +646,7 @@ div:hover>.intro{opacity: 1;} .dialog.scroll1.scroll2{box-shadow:0 -10px 10px -9px rgba(0,0,0,0.1),0 -10px 0 -9px rgba(0,0,0,0.05), 0 10px 10px -9px rgba(0,0,0,0.1),0 10px 0 -9px rgba(0,0,0,0.05);}*/ .selected,.target{/*transform: scale(1.05);*/} +/*.player.target{-webkit-filter:brightness(1.2)}*/ .target{transform: rotate(-3deg);} .target2{transform: rotate(3deg);} .content>.config.line2{ diff --git a/layout/default/menu.css b/layout/default/menu.css index e462f7bf3..8e38b259b 100644 --- a/layout/default/menu.css +++ b/layout/default/menu.css @@ -72,22 +72,37 @@ left:calc(50% - 200px); top:calc(50% - 150px); } -.menu.main.slideup{ +/*.menu.main.slideup{ animation:menuslideup 0.5s forwards; -webkit-animation:menuslideup 0.5s forwards; } .menu.main.slidedown{ animation:menuslidedown 0.5s forwards; -webkit-animation:menuslidedown 0.5s forwards; +}*/ +.menu-container.hidden>.menu.main{ + transform:scale(0.5); + transform-origin:2px -35px; + opacity:0; } -.menu.main.zoomin{ +.menu-container>.menu.main{ + transition: all 0.3s; + transform-origin:2px -35px; +} +/*.menu.main.zoomin{ animation:menuzoomin 0.3s forwards; -webkit-animation:menuzoomin 0.3s forwards; + transform:scale(0.5); + transform-origin:2px -35px; + opacity:0; } .menu.main.zoomout{ animation:menuzoomout 0.3s forwards; -webkit-animation:menuzoomout 0.3s forwards; -} + transform:scale(0.5); + transform-origin:2px -35px; + opacity:0; +}*/ .menu.main{ width: 400px; height:300px; @@ -223,7 +238,7 @@ } .popup-container.hidden{ - display:none; + pointer-events:none; } .popup-container>.menu{ position:absolute; diff --git a/layout/newlayout/global.css b/layout/newlayout/global.css index fdb2b4c87..8c9f6e647 100644 --- a/layout/newlayout/global.css +++ b/layout/newlayout/global.css @@ -202,6 +202,9 @@ .player.linked{ transform:rotate(-90deg); } +.player.linked.target{ + transform:rotate(-93deg); +} .player.acted.linked .identity{ transform:rotate(270deg); }