diff --git a/audio/die/ol_zhangzhang.mp3 b/audio/die/ol_zhangzhang.mp3 new file mode 100644 index 000000000..03d811cd2 Binary files /dev/null and b/audio/die/ol_zhangzhang.mp3 differ diff --git a/audio/skill/olguzheng1.mp3 b/audio/skill/olguzheng1.mp3 new file mode 100644 index 000000000..ad52616e1 Binary files /dev/null and b/audio/skill/olguzheng1.mp3 differ diff --git a/audio/skill/olguzheng2.mp3 b/audio/skill/olguzheng2.mp3 new file mode 100644 index 000000000..8e0348ae3 Binary files /dev/null and b/audio/skill/olguzheng2.mp3 differ diff --git a/audio/skill/olzhijian1.mp3 b/audio/skill/olzhijian1.mp3 new file mode 100644 index 000000000..e32c47e09 Binary files /dev/null and b/audio/skill/olzhijian1.mp3 differ diff --git a/audio/skill/olzhijian2.mp3 b/audio/skill/olzhijian2.mp3 new file mode 100644 index 000000000..5b0619a60 Binary files /dev/null and b/audio/skill/olzhijian2.mp3 differ diff --git a/character/clan.js b/character/clan.js index 5a090f6c5..31622434f 100644 --- a/character/clan.js +++ b/character/clan.js @@ -2164,7 +2164,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ str+=('摸'+get.cnNumber(Math.min(8,num2-num1))+'张牌,然后手牌上限-1。'); } str+=('
※当前手牌上限:'+num2); - var num3=player.countMark('clanguixiang_count'); + var num3=((_status.event.getParent().phaseIndex||0)+1); if(num3>0){ str+=(';阶段数:'+num3) } @@ -2186,7 +2186,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ order:function(item,player){ - var num=player.getHandcardLimit(),numx=player.countMark('clanguixiang_count'); + var num=player.getHandcardLimit(),numx=((_status.event.getParent().phaseIndex||0)+1); if(num==5&&numx==4&&player.getStat('skill').clanyirong) return 0; if(player.countCards('h')==num+1&&num!=2&&(num<=4||num>4&&numx>4)) return 10; return 0.5; @@ -2197,56 +2197,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, clanguixiang:{ audio:2, - init:function(player){ - player.addSkill('clanguixiang_count'); - }, - onremove:function(player){ - player.removeSkill('clanguixiang_count'); - var event=_status.event.getParent('phase'); - if(event) delete event._clanguixiang; - }, trigger:{ - player:['phaseZhunbeiBefore','phaseJudgeBefore','phaseDrawBefore','phaseDiscardBefore','phaseJieshuBefore'], + player:'phaseChange', }, forced:true, filter:function(event,player){ - var evt=event.getParent('phase'); - if(!evt||!evt._clanguixiang) return false; - var num1=player.getHandcardLimit()-1,num2=player.countMark('clanguixiang_count'); + if(event.phaseList[event.num].startsWith('phaseUse')) return false; + var num1=player.getHandcardLimit()-1,num2=event.num; return num1==num2; }, content:function(){ - trigger.cancel(null,null,'notrigger'); - var next=player.phaseUse(); - event.next.remove(next); - trigger.getParent().next.unshift(next); - }, - subSkill:{ - count:{ - trigger:{ - player:['phaseZhunbeiBegin','phaseJudgeBegin','phaseDrawBegin','phaseDiscardBegin','phaseJieshuBegin','phaseUseBegin'], - }, - forced:true, - popup:false, - lastDo:true, - priority:-Infinity, - content:function(){ - player.addMark('clanguixiang_count',1,false); - }, - group:'clanguixiang_clear', - }, - clear:{ - trigger:{player:'phaseBefore'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - priority:Infinity, - content:function(){ - delete player.storage.clanguixiang_count; - trigger._clanguixiang=true; - }, - }, + trigger.phaseList[trigger.num]='phaseUse|clanguixiang'; + game.delayx(); }, }, clanmuyin:{ diff --git a/character/ddd.js b/character/ddd.js index 53dbc276e..ad2e67a17 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -3304,14 +3304,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddduanbing:{ enable:'phaseUse', filter:function(event,player){ - return player.canAddJudge('bingliang')&&player.hasCard((card)=>lib.skill['dddduanbing'].filterCard(card,player),'h'); + return player.canAddJudge('bingliang')&&player.hasCard((card)=>lib.skill['dddduanbing'].filterCard(card,player),'he'); }, filterCard:function(card,player){ if(get.color(card)!='black'||get.type2(card)=='trick') return false; return player.canAddJudge(get.autoViewAs({name:'bingliang'},[card])); }, check:function(card){ - return 6-get.value(card); + return 8.2-get.value(card); }, discard:false, lose:false, diff --git a/character/diy.js b/character/diy.js index ceeba6270..7a1dcc2ed 100755 --- a/character/diy.js +++ b/character/diy.js @@ -178,7 +178,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ns_chengpu:['male','wu',4,['decadelihuo','decadechunlao']], ns_sundeng:['male','wu',4,['xinkuangbi']], ns_duji:['male','wei',3,['xinfu_andong','xinyingshi']], - old_majun:["male","wei",3,["xinfu_jingxie1","xinfu_qiaosi"],[]], + old_majun:["male","wei",3,["xinfu_jingxie1","xinfu_qiaosi"]], + ns_mengyou:['male','qun',4,['nsmanzhi']], old_jiakui:['male','wei',4,['tongqu','xinwanlan']], ol_guohuai:['male','wei',3,['rejingce']], @@ -219,7 +220,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "ns_chentai","ns_huangwudie","ns_sunyi","ns_zhangning","ns_yanghu"], diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu','prp_zhugeliang','key_seira','key_kiyu','key_tomoyo','key_minagi','key_michiru'], diy_tieba:["ns_zuoci","ns_lvzhi","ns_wangyun","ns_nanhua","ns_nanhua_left","ns_nanhua_right","ns_huamulan","ns_huangzu","ns_jinke","ns_yanliang","ns_wenchou","ns_caocao","ns_caocaosp","ns_zhugeliang","ns_wangyue","ns_yuji","ns_xinxianying","ns_guanlu","ns_simazhao","ns_sunjian","ns_duangui","ns_zhangbao","ns_masu","ns_zhangxiu","ns_lvmeng","ns_shenpei","ns_yujisp","ns_yangyi","ns_liuzhang","ns_xinnanhua","ns_luyusheng"], - diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu",'ns_sundeng','ns_duji'], + diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu",'ns_sundeng','ns_duji','ns_mengyou'], diy_xushi:["diy_feishi","diy_hanlong","diy_liufu","diy_liuyan","diy_liuzan","diy_tianyu","diy_xizhenxihong","diy_yangyi","diy_zaozhirenjun"], diy_default:["diy_yuji","diy_caiwenji","diy_lukang","diy_zhenji","old_majun"], diy_noname:['noname'], @@ -373,6 +374,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ns_zhangxiu:'#p本因坊神策', ns_yangyi:'#p本因坊神策', ns_liuzhang:'#r矮子剑薄荷糖', + ns_mengyou:'#g残昼厄夜', }, card:{ kano_paibingbuzhen:{ @@ -2599,7 +2601,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else game.delayx(); 'step 3' - player.addTempSkill('nstuilun_effect',{player:'phaseBegin'}); + player.addTempSkill('nstuilun_effect',{player:'phaseBeginStart'}); }, subSkill:{ effect:{ @@ -3560,7 +3562,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countCards('h')>0) player.chooseToDiscard('h',true,player.countCards('h')); player.recover(); trigger.cancel(); - player.addTempSkill('kyou_duanfa_draw',{player:'phaseBegin'}); + player.addTempSkill('kyou_duanfa_draw',{player:'phaseBeginStart'}); }, subSkill:{ draw:{ @@ -6370,9 +6372,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=game.roundNumber; if(num&&typeof num=='number') player.draw(Math.min(3,num)); 'step 1' - var next=player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|godan_yuanyi'); }, }, godan_feiqu:{ @@ -17953,6 +17953,96 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + nsmanzhi:{ + audio:'dcmanzhi', + trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, + direct:true, + filter:function(event,player){ + var nums=[]; + game.countPlayer(current=>{ + nums.add(current.hp); + nums.add(current.maxHp); + nums.add(current.countCards('h')); + nums.add(current.countCards('e')); + nums.add(current.countCards('j')); + }); + for(var a of nums){ + for(var b of nums){ + if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()) return true; + } + } + return false; + }, + content:function(){ + 'step 0' + var nums=[]; + game.countPlayer(current=>{ + nums.add(current.hp); + nums.add(current.maxHp); + nums.add(current.countCards('h')); + nums.add(current.countCards('e')); + nums.add(current.countCards('j')); + }); + nums.sort((a,b)=>a-b); + var a=null,b=null,goon=false; + for(a of nums){ + for(b of nums){ + if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()){ + goon=true; + break; + } + } + if(goon) break; + } + player.chooseButton(2,[ + '蛮智:请选择让下列等式成立的A与B的值', + '
目标等式
', + `0.5 × A² + 2.5 × B - ${game.roundNumber} = ${game.countPlayer()}`, + '
A的可选值
', + [nums.map(i=>{ + return [ + `A|${i}`, + i==a?(`${i}`):i, + ] + }),'tdnodes'], + '
B的可选值
', + [nums.map(i=>{ + return [ + `B|${i}`, + i==b?(`${i}`):i, + ] + }),'tdnodes'], + ]).set('filterButton',function(button){ + if(!ui.selected.buttons.length) return true; + return button.link[0]!=ui.selected.buttons[0].link[0]; + }).set('filterOk',function(){ + if(ui.selected.buttons.length!=2) return false; + var a,b; + for(var i of ui.selected.buttons){ + if(i.link[0]=='A') a=parseInt(i.link.slice(2)); + else b=parseInt(i.link.slice(2)); + } + return (0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer(); + }).set('choice',[a,b]).set('ai',(button)=>{ + var choice=_status.event.choice; + if(button.link==`A|${choice[0]}`||button.link==`B|${choice[1]}`) return 1; + return 0; + }); + 'step 1' + if(result.bool){ + var a,b; + for(var i of result.links){ + if(i[0]=='A') a=parseInt(i.slice(2)); + else b=parseInt(i.slice(2)); + } + equals=`0.5×${a}²+2.5×${b}-${game.roundNumber}=${game.countPlayer()}`; + player.logSkill('nsmanzhi'); + player.chat(equals); + game.log(player,'的计算结果为',equals); + player.draw(game.countPlayer()); + } + }, + }, }, dynamicTranslate:{ nsjiquan:function(player){ @@ -19030,6 +19120,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ junk_huangyueying_prefix:'旧界', old_majun:'骰子马钧', old_majun_prefix:'骰子', + ns_mengyou:'数学孟优', + ns_mengyou_prefix:'数学', + ns_mengyou_ab:'孟优', + nsmanzhi:'蛮智', + nsmanzhi_info:'准备阶段或结束阶段开始时,你可以将场上出现的数字代入等式中的A和B。若此等式成立,你摸Y张牌。(等式为Y=0.5A²+2.5B-X,其中X为游戏轮数,Y为存活人数)', + ns_chengpu:'铁索程普', + ns_chengpu_prefix:'铁索', + ns_chengpu_ab:'程普', + ns_sundeng:'画饼孙登', + ns_sundeng_prefix:'画饼', + ns_sundeng_ab:'孙登', + ns_duji:'画饼杜畿', + ns_duji_prefix:'画饼', + ns_duji_ab:'杜畿', diy_tieba:'吧友设计', diy_xushi:'玩点论杀·虚实篇', @@ -19041,12 +19145,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ diy_yijiang3:'设计比赛2022', diy_fakenews:'杀海流言', diy_trashbin:'垃圾桶', - ns_chengpu:'铁索程普', - ns_chengpu_ab:'程普', - ns_sundeng:'画饼孙登', - ns_sundeng_ab:'孙登', - ns_duji:'画饼杜畿', - ns_duji_ab:'杜畿', }, pinyins:{ 加藤うみ:['Kato','Umi'], diff --git a/character/extra.js b/character/extra.js index ac81f163b..72c31d4e2 100755 --- a/character/extra.js +++ b/character/extra.js @@ -3586,7 +3586,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huoxin2:{ trigger:{ player:['phaseAfter','dieAfter'], - global:'phaseBefore', + global:'phaseBeforeStart', }, lastDo:true, charlotte:true, @@ -5412,7 +5412,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget(get.prompt('dawu'),'令至多'+get.cnNumber(num)+'名角色获得“大雾”标记', [1,num]).set('ai',function(target){ if(target.isMin()) return 0; - if(target.hasSkill('biantian2')) return 0; + if(target.hasSkill('biantian2')||target.hasSkill('dawu2')) return 0; var att=get.attitude(player,target); if(att>=4){ if(_status.event.allUse) return att; @@ -5426,13 +5426,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })*2); "step 1" if(result.bool){ - player.logSkill('dawu',result.targets,'thunder'); - var length=result.targets.length; - for(var i=0;i{ + target.addAdditionalSkill(`dawu_${player.playerid}`,'dawu2'); + target.markAuto('dawu2',[player]); + }); + player.addTempSkill('dawu3',{player:'phaseBeginStart'}) player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true); - player.addSkill('dawu3'); } else{ event.finish(); @@ -5443,46 +5445,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{combo:'qixing'}, }, dawu2:{ - trigger:{player:'damageBegin4'}, - filter:function(event){ - if(!event.hasNature('thunder')) return true; - return false; - }, - mark:true, - forced:true, charlotte:true, - content:function(){ - trigger.cancel(); - }, ai:{ nofire:true, nodamage:true, effect:{ target:function(card,player,target,current){ - if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return [0,0]; + if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return 'zeroplayertarget'; } }, }, intro:{ - markcount:()=>1, - content:'共有1个标记', + content:function(storage){ + return `共有${storage.length}枚标记`; + }, } }, dawu3:{ - trigger:{player:['phaseBegin','dieBegin']}, - silent:true, + trigger:{global:'damageBegin4'}, + filter:function(event,player){ + return !event.hasNature('thunder')&&event.player.getStorage('dawu2').includes(player); + }, + forced:true, charlotte:true, + logTarget:'player', content:function(){ - for(var i=0;i{ + if(current.getStorage('dawu2').includes(player)){ + current.unmarkAuto('dawu2',player); + current.removeAdditionalSkill(`dawu_${player.playerid}`); } - if(game.players[i].hasSkill('kuangfeng2')){ - game.players[i].removeSkill('kuangfeng2'); - } - } - player.removeSkill('dawu3'); - } + },true); + }, }, kuangfeng:{ unique:true, @@ -5499,13 +5496,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } "step 1" if(result.bool){ - var length=result.targets.length; - for(var i=0;i{ + target.addAdditionalSkill(`kuangfeng_${player.playerid}`,'kuangfeng2'); + target.markAuto('kuangfeng2',[player]); + }); + player.addTempSkill('kuangfeng3',{player:'phaseBeginStart'}) + player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true); } else{ event.finish(); @@ -5516,28 +5515,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{combo:'qixing'}, }, kuangfeng2:{ - trigger:{player:'damageBegin3'}, - filter:function(event){ - if(event.hasNature('fire')) return true; - return false; - }, - mark:true, + charlotte:true, intro:{ - markcount:()=>1, - content:'共有1个标记' - }, - forced:true, - content:function(){ - trigger.num++; + content:function(storage){ + return `共有${storage.length}枚标记`; + }, }, ai:{ effect:{ target:function(card,player,target,current){ - if(get.tag(card,'fireDamage')) return 1.5; + if(get.tag(card,'fireDamage')&¤t<0) return 1.5; } } } }, + kuangfeng3:{ + trigger:{global:'damageBegin3'}, + filter:function(event){ + return event.hasNature('fire')&&event.player.getStorage('kuangfeng2').includes(player); + }, + charlotte:true, + forced:true, + logTarget:'player', + content:function(){ + trigger.num++; + }, + onremove:function(player){ + game.countPlayer2(current=>{ + if(current.getStorage('kuangfeng2').includes(player)){ + current.unmarkAuto('kuangfeng2',player); + current.removeAdditionalSkill(`kuangfeng_${player.playerid}`); + } + },true); + }, + }, yeyan:{ unique:true, forceDie:true, diff --git a/character/huicui.js b/character/huicui.js index 3411e5a22..b7301ba44 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -6398,6 +6398,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.directHit.push(trigger.target); } }, + ai:{ + effect:{ + player:function(card,player,target){ + if(player!==target&&get.itemtype(target)==='player'&&(card.name==='sha'||get.type(card,false)==='trick')&& + target.countCards('he')&&!target.hasSkillTag('noh')) return [1,0,1,-1]; + } + } + } }, }, }, @@ -10090,6 +10098,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_jiaxu:['sp_jiaxu','dc_sp_jiaxu','yj_jiaxu'], qiaorui:['qiaorui','tw_qiaorui'], mamidi:['mamidi','xin_mamidi'], + mengyou:['mengyou','ns_mengyou'], }, translate:{ re_panfeng:'潘凤', diff --git a/character/jiange.js b/character/jiange.js index cad3400b3..937a6e4a4 100644 --- a/character/jiange.js +++ b/character/jiange.js @@ -201,7 +201,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, chiying:{ - trigger:{global:'damageBegin'}, + trigger:{global:'damageBegin2'}, check:function(event,player){ return get.attitude(player,event.player)>0; }, @@ -209,7 +209,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.num<=1) return false; return true; }, - priority:-11, content:function(){ trigger.num=1; if(trigger.source){ diff --git a/character/mobile.js b/character/mobile.js index 8777ac537..d14170729 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -4595,7 +4595,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ viewAsFilter:function(player){ return player.hasCard({type:'equip'},'ehs'); }, - check:(card)=>5-get.value(card), + check:function(card){ + if(_status.event.type=='dying') return 1/(get.value(card)||0.5); + return 5-get.value(card); + }, locked:false, mod:{ maxHandcard:function(player,num){ @@ -12165,7 +12168,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:"linkBefore", }, forced:true, - priority:20, + //priority:20, filter:function(event,player){ return !player.isLinked(); }, @@ -13179,7 +13182,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, cancel:{ trigger:{player:'phaseUseEnd'}, - priority:50, + firstDo:true, silent:true, charlotte:true, content:function(){ diff --git a/character/offline.js b/character/offline.js index 0b0164d47..83492160f 100644 --- a/character/offline.js +++ b/character/offline.js @@ -944,6 +944,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ trigger.cancel(); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(card.name==='sha'&&!game.hasNature(card)&&target.hasEmptySlot(2)) return 'zeroplayertarget'; + if(get.subtype(card)=='equip2'&&target.isEmpty(2)) return [0.6,-0.8]; + } + } } }, //战役篇蒋钦 @@ -1976,7 +1984,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ skip:{ - trigger:{player:'phaseBefore'}, + trigger:{player:'phaseBeforeStart'}, forced:true, priority:Infinity, popup:false, diff --git a/character/rank.js b/character/rank.js index 46186010d..0b8cf1ab1 100644 --- a/character/rank.js +++ b/character/rank.js @@ -960,6 +960,7 @@ window.noname_character_rank={ 'mengyou', 're_wenpin', 'yue_zhoufei', + 'ns_mengyou', ], b:[ 'diy_feishi', @@ -1969,6 +1970,7 @@ window.noname_character_rank={ 'clan_zhonghui', 'zhoubuyi', 'dc_wangjun', + 'ns_mengyou', 'key_kano', 'key_haruko', 'key_akiko', diff --git a/character/shenhua.js b/character/shenhua.js index f3098cfe5..12d929fba 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -3804,6 +3804,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, preHidden:true, audioname:['sp_lvmeng','re_sunben','re_sunce'], + mod:{ + aiOrder:function(player,card,num){ + if(get.color(card)==='red'&&get.name(card)==='sha') return get.order({name: 'sha'})+0.15; + } + }, trigger:{ player:'useCardToPlayered', target:'useCardToTargeted', @@ -3812,6 +3817,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!(event.card.name=='juedou'||(event.card.name=='sha'&&get.color(event.card)=='red'))) return false; return player==event.target||event.getParent().triggeredTargets3.length==1; }, + locked:false, frequent:true, content:function(){ player.draw(); @@ -4872,9 +4878,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, preHidden:true, check:function(event,player){ - if(player.countCards('h')<=1) return true; - return game.hasPlayer(function(current){ - return current!=player&¤t.isMinHandcard()&&get.attitude(player,current)>0; + return (player.countCards('h')+2+event.num)<=5||game.hasPlayer(function(target){ + return player!==target&&!game.hasPlayer(function(current){ + return current!==player&¤t!==target&¤t.countCards('h')0; }); }, content:function(){ @@ -6276,30 +6283,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ useShan:true, effect:{ target:function(card,player,target,current){ - if(get.tag(card,'respondShan')){ - var hastarget=game.hasPlayer(function(current){ - return get.attitude(target,current)<0; - }); - var be=target.countCards('e',{color:'black'}); - if(target.countCards('h','shan')&&be){ - if(!target.hasSkill('guidao')) return 0; - return [0,hastarget?target.countCards('he')/2:0]; + if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ + target: target, + card: card + },true)){ + let club=0,spade=0; + if(game.hasPlayer(function(current){ + return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; + })){ + club=2; + spade=4; } - if(target.countCards('h','shan')&&target.countCards('h')>2){ - if(!target.hasSkill('guidao')) return 0; - return [0,hastarget?target.countCards('h')/4:0]; - } - if(target.countCards('h')>3||(be&&target.countCards('h')>=2)){ - return [0,0]; - } - if(target.countCards('h')==0){ - return [1.5,0]; - } - if(target.countCards('h')==1&&!be){ - return [1.2,0]; - } - if(!target.hasSkill('guidao')) return [1,0.05]; - return [1,Math.min(0.5,(target.countCards('h')+be)/4)]; + if(!target.isHealthy()) club+=2; + if(!club&&!spade) return 1; + if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); + if(!target.hasSkillTag('rejudge')) return [1,(club+spade)/4]; + let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e',better=club>spade?'club':'spade',max=0; + target.hasCard(function(cardx){ + if(get.suit(cardx)===better){ + max=2; + return true; + } + if(spade&&get.color(cardx)==='black') max=1; + },pos); + if(max===2) return [1,Math.max(club,spade)]; + if(max===1) return [1,Math.min(club,spade)]; + if(pos==='e') return [1,Math.min(Math.max(1,target.countCards('hs'))*(club+spade)/4,Math.max(club,spade))]; + return [1,(club+spade)/4]; } } } @@ -7259,17 +7269,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ useShan:true, effect:{ target:function(card,player,target,current){ - if(get.tag(card,'respondShan')){ - var hastarget=game.hasPlayer(function(current){ - return get.attitude(target,current)<0; - }); - if(target.countCards('h','shan')&&target.countCards('e',{suit:'spade'})){ - return [0,hastarget?target.countCards('he')/2:0]; - } - if(target.countCards('h','shan')){ - return [1,hastarget?target.countCards('he')/2:0]; - } - return [1,target.countCards('h')/4]; + if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ + target: target, + card: card + },true)&&game.hasPlayer(function(current){ + return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; + })){ + if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); + if(!target.hasSkillTag('rejudge')) return [1,1]; + let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e'; + if(target.hasCard(function(cardx){ + return get.suit(cardx)==='spade'; + },pos)) return [1,4]; + if(pos==='e') return [1,Math.min(4,1+0.75*Math.max(1,target.countCards('hs')))]; + return [1,1]; } } } diff --git a/character/sp.js b/character/sp.js index 365e5e325..72f66f354 100755 --- a/character/sp.js +++ b/character/sp.js @@ -4054,9 +4054,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' player.damage('nosource'); 'step 1' - var next=player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|oldianjun'); }, }, olkangrui:{ diff --git a/character/sp2.js b/character/sp2.js index 8635c4118..e72035f52 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -8836,7 +8836,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, zongkui:{ - trigger:{player:'phaseBefore',global:'roundStart'}, + trigger:{ + player:'phaseBeforeEnd', + global:'roundStart', + }, direct:true, audio:2, audioname:['tw_beimihu'], @@ -10208,7 +10211,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zongkui:'纵傀', zongkui_mark:'纵傀', zongkui_mark_bg:'傀', - zongkui_info:'回合开始时,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。每轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。', + zongkui_info:'回合开始前,你可以指定一名未拥有“傀”标记的其他角色,令其获得一枚“傀”标记。一轮游戏开始时,你指定一名体力值最少且没有“傀”标记的其他角色,令其获得一枚“傀”标记。', guju:'骨疽', guju_info:'锁定技,拥有“傀”标记的角色受到伤害后,你摸一张牌。', baijia:'拜假', diff --git a/character/xianding.js b/character/xianding.js index 1e2b7904c..6850f0c48 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4585,11 +4585,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //周宣 dcwumei:{ audio:2, - trigger:{player:'phaseBegin'}, + trigger:{player:'phaseBeginStart'}, filter:function(event,player){ return !player.hasSkill('dcwumei_used'); }, - priority:10,//离谱的优先机制 direct:true, content:function(){ 'step 0' @@ -4616,6 +4615,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger._triggered=5; var evt=player.insertPhase(); delete evt.skill; + game.broadcastAll(function(player){ + player.classList.remove('glow_phase'); + delete _status.currentPhase; + },player); } } }, @@ -10550,6 +10553,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.draw(2+get.sgn(trigger.player.hp-player.hp)); }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.itemtype(player)!=='player'||player===target) return 1; + let num=1,ds=2+get.sgn(player.hp-target.hp); + if(player===_status.currentPhase&&_status.currentPhase.group==='qun'&&target.hasZhuSkill('yuwei',player)) num=2; + if(target.getHistory('gain',function(evt){ + return evt.getParent(2).name==='shiyuan'&&evt.cards.length===ds; + }).length>=num) return 1; + let name=get.name(card); + if(get.tag(card,'lose')||name==='huogong'||name==='juedou'||name==='tiesuo') return [1,ds]; + if(!target.hasFriend()) return 1; + return [1,0.8*ds]; + } + } + } }, dushi:{ audio:2, diff --git a/character/yijiang.js b/character/yijiang.js index 3135aa285..ea57992f9 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -2508,10 +2508,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_guansuo:'dangxian_guansuo', }, content:function(){ - var next=player.phaseUse(); - next.xindangxian=true; - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|xindangxian'); }, group:'xindangxian_rewrite', subSkill:{ @@ -2520,7 +2517,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, popup:false, filter:function(kagari){ - return kagari.xindangxian==true; + return kagari._extraPhaseReason=='xindangxian'; }, content:function(){ 'step 0' @@ -7664,9 +7661,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, audioname:['guansuo'], content:function(){ - var next=player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|dangxian'); } }, longyin:{ @@ -10588,6 +10583,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ "step 0" + if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2); player.draw(2); "step 1" player.chooseCard(2,'he',true,'交给'+get.translation(trigger.player)+'两张牌').set('ai',function(card){ @@ -10602,8 +10598,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.player.storage.xiantu4.push(player); }, ai:{ - threaten:1.1, - expose:0.3 + threaten:1.1 } }, xiantu1:{audio:true}, diff --git a/character/yingbian.js b/character/yingbian.js index e6f489f3c..181424f12 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -2592,10 +2592,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player!=event.player&&event.num-2) return false; - if(player.hp>2) return true; - if(player.hp==2&&event.player.hp<3) return false; - return player.hp>1; + if(event.player.hasSkillTag('nodamage')) return false; + let tj = player.countCards('hs', function (card) { + return get.name(card) === 'tao' || get.name(card) === 'jiu'; + }), + att = get.attitude(_status.event.player, event.player), + eff = get.damageEffect(event.player, player, _status.event.player, event.nature), + fd = event.player.hasSkillTag('filterDamage', null, { + player: player, + card: event.card + }), + hp = player.hp + tj; + if(player.storage.tairan2) hp -= player.storage.tairan2; + if(eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false; + if(hp > 2 || event.player.isLinked() && event.nature && eff > 0) return true; + return !event.player.countCards('hs') || event.player.hp > 2 * event.num && !event.player.hasSkillTag('maixie'); }, logTarget:'player', content:function(){ @@ -2604,6 +2615,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.yimie_num=trigger.player.hp-trigger.num; trigger.num=trigger.player.hp; }, + ai:{ + damageBonus:true, + skillTagFilter:function(player,tag,arg){ + return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2; + } + } }, yimie2:{ trigger:{player:'damageEnd'}, diff --git a/game/game.js b/game/game.js index ba6f9e00d..4efa13d6e 100644 --- a/game/game.js +++ b/game/game.js @@ -14388,7 +14388,7 @@ next.setContent(info.content); next.skillHidden=event.skillHidden; if(info.forceDie) next.forceDie=true; - if(info.forceOut||event.skill=='_turnover') next.includeOut=true; + if(info.forceOut) next.includeOut=true; "step 4" if(player._hookTrigger){ for(var i=0;i0){ + game.players[i].outCount--; + if(game.players[i].outCount==0&&!game.players[i].outSkills){ + game.players[i].in(); + } + } + } + event.trigger('roundStart'); + } + } + _status.globalHistory.push({ + cardMove:[], + custom:[], + useCard:[], + changeHp:[], + everything:[], + }); + var players=game.players.slice(0).concat(game.dead); + for(var i=0;igame.players.length*num&&game.showIdentity){ + if(!_status.video) player.popup('显示身份'); + _status.identityShown=true; + game.showIdentity(false); + } + } + player.ai.tempIgnore=[]; + if(ui.land&&ui.land.player==player){ + game.addVideo('destroyLand'); + ui.land.destroy(); + } + 'step 6' + //规则集中的“回合开始后⑦”,国战武将明置武将牌 + event.trigger('phaseBeginStart'); + 'step 7' + //规则集中的“回合开始后⑨”,进行当先,化身等操作 + //没有⑧ 因为⑧用不到 + event.trigger('phaseBegin'); + //阶段部分 + 'step 8' + if(num1){ + next._extraPhaseReason=phase[1]; + } + if(event.currentPhase=='phaseDraw'||event.currentPhase=='phaseDiscard'){ + if(!player.noPhaseDelay){ + if(player==game.me){ + game.delay(); + } + else{ + game.delayx(); + } + } + } + } + 'step 10' + if(event.currentPhase=='phaseUse'){ + game.broadcastAll(function(){ + if(ui.tempnowuxie){ + ui.tempnowuxie.close(); + delete ui.tempnowuxie; + } + }); + delete player._noSkill; + } + event.num++; + 'step 11' + if(event.num