diff --git a/character/extra.js b/character/extra.js index 492a76e85..b3c87a7c8 100755 --- a/character/extra.js +++ b/character/extra.js @@ -624,6 +624,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } player.gain(cards,'gain2'); } + }, + ai:{ + combo:'yizhao', } }, sanshou:{ diff --git a/character/sb.js b/character/sb.js index 67c04b56d..1880b1181 100644 --- a/character/sb.js +++ b/character/sb.js @@ -773,7 +773,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ player:function(card,player,target){ - if(player!=target&&target&&target.group=='qun') return [1,0.2]; + if(player!=target&&target&&target.group=='qun'&&card.name!='tao') return [1,0.1]; }, }, } diff --git a/character/sp.js b/character/sp.js index fdb2cb2d4..2773131a5 100755 --- a/character/sp.js +++ b/character/sp.js @@ -9994,6 +9994,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).length>0; }, logTarget:'player', + check:function(event,player){ + var list=event.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ + var info=get.info(skill); + return info&&!info.juexingji&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte&&!info.limited&&!info.dutySkill; + }); + var negSkill=list.some(function(skill){ + return get.skillRank(skill,'inout')<=0; + }); + var att=get.sgnAttitude(event.player,player); + if(!player.storage.retuogu){ + if(negSkill&&att<0) return false; + return true; + } + list.sort(function(a,b){ + return att*(get.skillRank(b,'inout')-get.skillRank(a,'inout')); + })[0]; + return get.skillRank(list[0],'inout')>=get.skillRank(player.storage.retuogu,'inout'); + }, content:function(){ 'step 0' var list=trigger.player.getStockSkills('仲村由理','天下第一').filter(function(skill){ @@ -10002,7 +10020,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); if(list.length==1) event._result={control:list[0]}; else trigger.player.chooseControl(list).set('prompt','选择令'+get.translation(player)+'获得一个技能').set('forceDie',true).set('ai',function(){ - return list.randomGet(); + var att=get.sgnAttitude(_status.event.getTrigger().player,player); + if(att==0) return list.randomGet(); + var listx=list.map(function(skill){ + return [skill,get.skillRank(skill,'inout')]; + }).sort(function(a,b){ + return att*(b[1]-a[1]); + }).slice(0,2); + var listx2=[0]; + if(Math.abs(listx[0][1]-listx[1][1])<=0.5&&Math.sign(listx[0][1])==Math.sign(listx[1][1])) listx2.push(1); + return listx[listx2.randomGet()][0]; }); 'step 1' if(player.storage.retuogu) player.removeSkill(player.storage.retuogu); diff --git a/character/sp2.js b/character/sp2.js index 803a353db..3f501346f 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -1356,7 +1356,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lose:false, delay:false, skillAnimation:true, - animationColor:'legend', + animationColor:'metal', check:function(card){ if(get.type(card)!='basic'&&get.type(card)!='trick') return 0; return get.value(card)-7.5; @@ -18435,7 +18435,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }, usable:1, - check:()=>false, + check:function(event,player){ + var hs=player.getCards('h'),cards=event.cards.filter(function(i){ + return (hs.contains(i)&&get.color(i,player)=='red'&&lib.filter.cardDiscardable(i,player,'difa')); + }); + var value=get.value(hs,player); + return Array.from(ui.cardPile.childNodes).some(function(card){ + return get.type2(card,false)=='trick'&&get.value(card,player)>value; + }); + }, content:function(){ 'step 0' var hs=player.getCards('h'),cards=trigger.cards.filter(function(i){ @@ -18451,7 +18459,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.type2(i,false)=='trick'; }); if(!list.length) event.finish(); - else player.chooseButton(['选择获得一种锦囊牌',[list.map((i)=>['锦囊','',i]),'vcard']],true); + else player.chooseButton(['选择获得一种锦囊牌',[list.map((i)=>['锦囊','',i]),'vcard']],true).set('ai',function(button){ + var card={name:button.link[2]}; + if(!_status.event.list.contains(card.name)) return 0; + return _status.event.player.getUseValue(card); + }).set('list',Array.from(ui.cardPile.childNodes).filter(function(card){ + return get.type2(card,false)=='trick'; + }).map(function(card){ + return card.name; + }).reduce(function(list,name){ + if(!list.contains(name)) list.add(name); + return list; + },[])); 'step 2' var card=get.cardPile(function(i){ return i.name==result.links[0][2]&&!event.cards.contains(i); diff --git a/character/yijiang.js b/character/yijiang.js index 979259a78..8229bcd84 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -4091,7 +4091,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var list=lib.inpile.filter(function(i){ if(player.storage.shouxi.contains(i)) return false; - var type=get.type(i); + var type=get.type2(i); if(type=='basic'||type=='trick') return true; return false; }); @@ -4108,6 +4108,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.vcard=result.links; event.cardname=name; player.storage.shouxi.add(name); + player.popup(name); + game.log(player,'声明了','#y'+get.translation(name)); } else{ event.finish(); diff --git a/game/game.js b/game/game.js index 1af569f8a..b351bc1c1 100644 --- a/game/game.js +++ b/game/game.js @@ -47655,10 +47655,10 @@ for(var i of game.connectPlayers){ if(!i.nickname&&!i.classList.contains('unselectable2')) num++; } - // if(num>=lib.configOL.number-1){ - // alert('至少要有两名玩家才能开始游戏!'); - // return; - // } + if(num>=lib.configOL.number-1){ + alert('至少要有两名玩家才能开始游戏!'); + return; + } game.resume(); } button.delete(); @@ -53293,17 +53293,23 @@ threaten=info.ai.threaten(player,player); } } - if(type=='in'){ + if(type.indexOf('in')!=-1){ if(info.enable=='phaseUse') num+=0.5; if(info.trigger&&info.trigger.player){ var list=Array.isArray(info.trigger.player)?info.trigger.player:[info.trigger.player]; var add=false; for(var i of list){ - for(var j of lib.phaseName){ - if(i.indexOf[j]==0){ - num+=0.5; - add=true; - break; + if(i.indexOf('phase')==0){ + num+=0.5; + add=true; + } + else{ + for(var j of lib.phaseName){ + if(i.indexOf[j]==0){ + num+=0.5; + add=true; + break; + } } } if(add) break; @@ -53316,12 +53322,22 @@ num+=Math.sqrt(threaten)-1; } } - else if(type=='out'){ + if(type.indexOf('out')!=-1){ if(threaten<1){ - num=1/Math.sqrt(threaten); + num*=1/Math.sqrt(threaten); + } + if(info.trigger){ + if(info.trigger.global){ + var list=Array.isArray(info.trigger.global)?info.trigger.global:[info.trigger.global]; + num+=Math.min(3,list.length)/10; + for(var i of list){ + if(i.indexOf('lose')==0||i.indexOf('use')==0) num+=0.3; + if(i.indexOf('cardsDiscard')==0) num+=0.4; + } + } + if(info.trigger.target||(typeof info.trigger.player=='string'&& + (info.trigger.player.indexOf('damage')==0||info.trigger.player.indexOf('lose')==0))) num+=0.1; } - if(info.trigger&&(info.trigger.global||info.trigger.target||(typeof info.trigger.player=='string'&& - (info.trigger.player.indexOf('damage')==0||info.trigger.player.indexOf('lose')==0)))) num+=0.1; if(info.ai){ if(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend){ num+=0.5; diff --git a/mode/single.js b/mode/single.js index 4d6f58a5a..628aabfed 100644 --- a/mode/single.js +++ b/mode/single.js @@ -362,6 +362,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return Math.random(); }).set('dialog',event.videoId); "step 5" + game.broadcastAll('closeDialog',event.videoId); game.me.next.init(result.links[0]); _status.characterlist.remove(result.links[0]); game.addRecentCharacter(result.links[0]);