From cb14094876862103b7c3d76601c8ec425117d3cc Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Mon, 25 Dec 2023 14:59:47 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=8F=8A=E6=97=B6=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E3=80=90=E5=87=9D=E5=AF=92=E3=80=91=E5=85=A8=E5=B1=80=E6=95=88?= =?UTF-8?q?=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/jsrg.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/character/jsrg.js b/character/jsrg.js index adcc07082..87921e89f 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -678,13 +678,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jsrgninghan:{ audio:2, + init:(player)=>{ + game.addGlobalSkill('jsrgninghan_frozen'); + }, + onremove:(player)=>{ + game.removeGlobalSkill('jsrgninghan_frozen'); + }, trigger:{global:'damageEnd'}, filter:function(event,player){ if(!event.hasNature('ice')) return false; return event.cards&&event.cards.filterInD().length; }, forced:true, - global:'jsrgninghan_frozen', content:function(){ var cards=trigger.cards.filterInD(); player.addToExpansion(cards,'gain2').gaintag.add('jsrgshacheng'); @@ -701,6 +706,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(lg) return num+0.15*Math.sign(get.attitude(player,lg)); } } + }, + trigger:{player:'dieAfter'}, + filter:(event,player)=>{ + return !game.hasPlayer(current=>!current.hasSkill('jsrgninghan')); + }, + silent:true, + forceDie:true, + content:()=>{ + game.removeGlobalSkill('jsrgninghan_frozen'); } }, }, From 0c57827800dceb7ce1431926a31072f39d4f007d Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Mon, 25 Dec 2023 15:28:20 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=8F=E6=A6=82?= =?UTF-8?q?=E7=8E=87=E8=BF=87=E6=97=A9=E7=A7=BB=E9=99=A4=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E7=9A=84bug(=E9=83=A8=E5=88=86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 12 +++--------- character/jsrg.js | 4 ++-- character/refresh.js | 4 ++-- character/shiji.js | 2 +- character/tw.js | 2 +- character/xianding.js | 6 +++--- character/yijiang.js | 4 ++-- 7 files changed, 14 insertions(+), 20 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index af0e6172c..a17358c08 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -7974,9 +7974,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ init:function(player){ game.addGlobalSkill('huguan_all'); }, - onremove:function(player){ - game.removeGlobalSkill('huguan_all'); - }, trigger:{global:'useCard'}, direct:true, filter:function(event,player){ @@ -8052,7 +8049,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ let num = -157; game.countPlayer(function (current){ if(current.hasSkill('huguan')) num = Math.max(num, get.attitude(_status.event.player, current)); - }); + }, true); if(num === -157) game.removeGlobalSkill('huguan_all'); else if(num === 0) player.storage.huguan_all = 6; else if(num > 0) player.storage.huguan_all = 9; @@ -9168,7 +9165,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('fengxiang_use'); }, onremove:function(player){ - game.removeGlobalSkill('fengxiang_use'); + if(!game.hasPlayer(current=>current.hasSkill('fengxiang'),true)) game.removeGlobalSkill('fengxiang_use'); }, trigger:{player:'damageEnd'}, forced:true, @@ -9210,10 +9207,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'dieAfter'}, filter:function(event,player){ - for(let i of game.players){ - if(i.hasSkill('fengxiang')) return false; - } - return true; + return !game.hasPlayer(current=>current.hasSkill('fengxiang'),true); }, silent:true, forceDie:true, diff --git a/character/jsrg.js b/character/jsrg.js index 87921e89f..4847fa1dd 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -682,7 +682,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('jsrgninghan_frozen'); }, onremove:(player)=>{ - game.removeGlobalSkill('jsrgninghan_frozen'); + if(!game.hasPlayer(current=>current.hasSkill('jsrgninghan'),true)) game.removeGlobalSkill('jsrgninghan_frozen'); }, trigger:{global:'damageEnd'}, filter:function(event,player){ @@ -709,7 +709,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'dieAfter'}, filter:(event,player)=>{ - return !game.hasPlayer(current=>!current.hasSkill('jsrgninghan')); + return !game.hasPlayer(current=>!current.hasSkill('jsrgninghan'),true); }, silent:true, forceDie:true, diff --git a/character/refresh.js b/character/refresh.js index dbd13f0b4..00090875c 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -5828,7 +5828,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('relongyin_order'); }, onremove:(player)=>{ - game.removeGlobalSkill('relongyin_order'); + if(!game.hasPlayer(current=>current.hasSkill('relongyin'),true)) game.removeGlobalSkill('relongyin_order'); }, trigger:{global:'useCard'}, direct:true, @@ -5917,7 +5917,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'dieAfter'}, filter:(event,player)=>{ - return !game.hasPlayer(current=>current.hasSkill('relongyin')); + return !game.hasPlayer(current=>current.hasSkill('relongyin'),true); }, silent:true, forceDie:true, diff --git a/character/shiji.js b/character/shiji.js index 93afe4dd4..94fe88ffd 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -5994,7 +5994,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('spshanxi_bj'); }, onremove:function(player){ - game.removeGlobalSkill('spshanxi_bj'); + if(!game.hasPlayer(current=>current.hasSkill('spshanxi'),true)) game.removeGlobalSkill('spshanxi_bj'); }, trigger:{player:'phaseUseBegin'}, direct:true, diff --git a/character/tw.js b/character/tw.js index 42dd48fdf..45bbc0723 100644 --- a/character/tw.js +++ b/character/tw.js @@ -11909,7 +11909,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('twzhian_ai'); }, onremove:function(player){ - game.removeGlobalSkill('twzhian_ai'); + if(!game.hasPlayer((current)=>current.hasSkill('twzhian'),true)) game.removeGlobalSkill('twzhian_ai'); }, usable:1, trigger:{global:'useCardAfter'}, diff --git a/character/xianding.js b/character/xianding.js index 70d2cbf03..e55242c72 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4783,7 +4783,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('dcaichen_hit'); }, onremove:function(player){ - game.removeGlobalSkill('dcaichen_hit'); + if(!game.hasPlayer(current=>current.hasSkill('dcaichen'),true)) game.removeGlobalSkill('dcaichen_hit'); }, trigger:{ player:['loseAfter','phaseDiscardBefore'], @@ -4813,7 +4813,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hit:{ trigger:{player:'dieAfter'}, filter:function(event,player){ - return !game.hasPlayer(current=>current.hasSkill('dcaichen')); + return !game.hasPlayer(current=>current.hasSkill('dcaichen'),true); }, silent:true, forceDie:true, @@ -5526,7 +5526,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ all:{ trigger:{player:'dieAfter'}, filter:function(event,player){ - return !game.hasPlayer(current=>current.hasSkill('dcwumei_wake')); + return !game.hasPlayer(current=>current.hasSkill('dcwumei_wake'),true); }, silent:true, forceDie:true, diff --git a/character/yijiang.js b/character/yijiang.js index f91eecc10..7eef0fb8e 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -7558,7 +7558,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.addGlobalSkill('longyin_order'); }, onremove:(player)=>{ - game.removeGlobalSkill('longyin_order'); + if(!game.hasPlayer(current=>current.hasSkill('longyin'),true)) game.removeGlobalSkill('longyin_order'); }, trigger:{global:'useCard'}, direct:true, @@ -7647,7 +7647,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, trigger:{player:'dieAfter'}, filter:(event,player)=>{ - return !game.hasPlayer(current=>current.hasSkill('longyin')); + return !game.hasPlayer(current=>current.hasSkill('longyin'),true); }, silent:true, forceDie:true, From 475201527a3c9610f6d5cae501724b6579833ea0 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Mon, 25 Dec 2023 16:11:46 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E3=80=90=E6=9D=80?= =?UTF-8?q?=E3=80=91ai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- card/standard.js | 107 +++++++++++++---------------------------------- 1 file changed, 30 insertions(+), 77 deletions(-) diff --git a/card/standard.js b/card/standard.js index 356fd2d5c..e3265f4eb 100644 --- a/card/standard.js +++ b/card/standard.js @@ -260,89 +260,42 @@ game.import('card',function(lib,game,ui,get,ai,_status){ value:[5,3,1], }, order:function(item,player){ - let res=3.2; - if(player.hasSkillTag('presha',true,null,true)) res=10; - if(get.itemtype(player)!=='player') return res; - /*let uv=player.getUseValue(item,true); - if(uv<=0) return res;*/ - let ignore=get.copy(ui.selected.cards),used=player.getCardUsable('sha')-1.5,ph=player.getCards('hs'); - ignore.add(item); - if(typeof item==='object'&&item.cards) ignore.addArray(item.cards); - let na=get.natureList(item),number,natures=['thunder','fire','ice','kami'],nb; - if(typeof item==='object') number=get.number(item); - else number=0; - for(let i of ph){ - if(ignore.includes(i)||get.name(i)!=='sha'||!lib.filter.cardEnabled(i,player)) continue; - nb=get.natureList(i); - if(na.length===nb.length&&(!na.length||na[0]===nb[0])){ - if(number>get.number(i)) return res-0.15; - continue; - } - if(used*(na.length-nb.length)>0) return res-0.15; - if(na.length===nb.length){ - if(used*(natures.indexOf(na[0])-natures.indexOf(nb[0]))>0) return res-0.15; - } - /*usev=player.getUseValue(i,true); - if(usev>0&&used*(uv-usev)>0) return res-0.15;*/ + if(player.hasSkillTag('presha',true,null,true)) return 10; + if(item.hasNature('linked')){ + if(game.hasPlayer(function(current){ + return current!=player&¤t.isLinked()&&player.canUse(item,current,null,true)&&get.effect(current,item,player,player)>0&&lib.card.sha.ai.canLink(player,current,item); + })&&game.countPlayer(function(current){ + return current.isLinked()&&get.damageEffect(current,player,player,get.nature(item))>0; + })>1) return 3.1; + return 3; } - return res; + return 3.05; }, result:{ - target:(player,target,card,isLink)=>{ - if(target._sha_result_temp) return -1.5; - target._sha_result_temp=true; - let basic=1,eff=-1.5,zhu=target.isZhu&&target.identityShown; - if(!target.hasSkillTag('filterDamage',null,{ - player:player, - card:card, - jiu:player.hasSkill('jiu'), - })&&(player.hasSkill('jiu')||player.hasSkillTag('damageBonus',true,{ - target:target, - card:card - }))){ - if(target.hp<2) basic=5; - else if(target.hp===2) basic=3; - else basic=2; - } - else if(target.hp<2) basic*=3; - if(zhu) eff*=Math.max(1,9/target.hp/target.hp); - if(isLink){ - let rate=_status.event.getTempCache('sha_result','mayShan'); - if(rate&&rate.id===card.sha_ai_id) rate=rate.rate; - delete target._sha_result_temp; - if(typeof rate==='boolean'||typeof rate==='number'){ - if(rate>=1) return eff; - return basic*eff*(1.3-0.9*rate); + target:function(player,target,card,isLink){ + var eff=function(){ + if(!isLink&&player.hasSkill('jiu')){ + if(!target.hasSkillTag('filterDamage',null,{ + player:player, + card:card, + jiu:true, + })){ + if(get.attitude(player,target)>0){ + return -7; + } + else{ + return -4; + } + } + return -0.5; } - delete _status.event._tempCache['sha_result']['mayShan']; - return basic*eff; - } - let mayShan; - if(player.hasSkillTag('directHit_ai',true,{ + return -1.5; + }(); + if(!isLink&&target.mayHaveShan()&&!player.hasSkillTag('directHit_ai',true,{ target:target, card:card, - },true)||game.hasNature(card,'stab')&&target.countCards('he')<2&&!target.hasSkillTag('noh')) mayShan=false; - else{ - let temp=target.getKnownCards(player); - if(temp.some(i=>{ - let name=get.name(i,target); - if(name==='shan'||name==='hufu') return lib.filter.cardEnabled(i,target,'forceEnable'); - return false; - })) mayShan=true; - else mayShan=1-Math.pow(0.7,(target.hasSkillTag('respondShan',true,'use',true)?1:0)+target.countCards('hs')-temp.length); - } - if(game.hasNature(card,'linked',player)){ - if(!_status.sha_ai_id) _status.sha_ai_id=1; - else _status.sha_ai_id++; - card.sha_ai_id=_status.sha_ai_id; - _status.event.putTempCache('sha_result','mayShan',{ - id:_status.sha_ai_id, - rate:mayShan - }); - } - delete target._sha_result_temp; - if(mayShan>=1) return eff; - return basic*eff*(1.3-0.9*mayShan); + },true)) return eff/1.2; + return eff; }, }, tag:{ From 56a77baea18f668880660cfb568e033db84c8692 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Mon, 25 Dec 2023 16:40:24 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E7=94=A8=5FtrueMe=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=80=85=E6=98=AF=E5=90=A6=E6=80=81=E5=BA=A6?= =?UTF-8?q?=E4=B8=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit isMad()已在attitude里检测,故移除 --- card/extra.js | 10 +++++----- card/standard.js | 17 ++++++----------- card/yingbian.js | 2 +- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/card/extra.js b/card/extra.js index a02ea45bc..17ba4277d 100644 --- a/card/extra.js +++ b/card/extra.js @@ -230,10 +230,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ value:[3,1], useful:1, }, - wuxie:function(target,card,player,viewer,state){ - let att=get.attitude(viewer,target), eff=get.effect(target,card,player,target); - if(status*get.attitude(viewer,player)>0&&!player.isMad() || status*eff*att>=0) return 0; - if(get.attitude(viewer,player)>=0 || _status.event.getRand('huogong_wuxie')*4>player.countCards('h')) return 0; + wuxie:function(target,card,player,viewer,status){ + if(get.attitude(viewer,player._trueMe||player)>0) return 0; + if(status*get.attitude(viewer,target)*get.effect(target,card,player,target)>=0) return 0; + if(_status.event.getRand('huogong_wuxie')*4>player.countCards('h')) return 0; }, result:{ player:function(player){ @@ -302,7 +302,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ recastable:true, ai:{ wuxie:(target,card,player,viewer, status)=>{ - if(status*get.attitude(viewer,player)>0&&!player.isMad() || target.hasSkillTag('nodamage') || target.hasSkillTag('nofire') || target.hasSkillTag('nothunder') || get.attitude(viewer,player)>0 || (1+target.countCards('hs'))*_status.event.getRand()>1.57) return 0; + if(status*get.attitude(viewer,player._trueMe||player)>0 || target.hasSkillTag('nodamage') || target.hasSkillTag('nofire') || target.hasSkillTag('nothunder') || get.attitude(viewer,player)>0 || (1+target.countCards('hs'))*_status.event.getRand()>1.57) return 0; }, basic:{ order:(item,player)=>{ diff --git a/card/standard.js b/card/standard.js index e3265f4eb..668a5c631 100644 --- a/card/standard.js +++ b/card/standard.js @@ -1228,10 +1228,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event._result={}; }, ai:{ - wuxie:function(target,card,player,viewer){ - if(player==game.me&&get.attitude(viewer,player)>0){ - return 0; - } + wuxie:function(target,card,player,viewer,status){ + if(player===game.me&&get.attitude(viewer,player._trueMe||player)>0) return 0; + if(status*get.attitude(viewer,target)*get.effect(target,card,player,target)>=0) return 0; }, basic:{ order:5, @@ -1295,9 +1294,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ wuxie:function(target,card,player,viewer){ - if(get.attitude(viewer,player)>0&&get.attitude(viewer,target)>0){ - return 0; - } + if(get.attitude(viewer,player._trueMe||player)>0) return 0; }, basic:{ order:7.5, @@ -1574,7 +1571,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ wuxie:(target,card,player,viewer,status)=>{ - if(status*get.attitude(viewer,player)>0&&!player.isMad() || target.hp>2&&!target.hasCard(i=>{ + if(status*get.attitude(viewer,player._trueMe||player)>0 || target.hp>2&&!target.hasCard(i=>{ let val=get.value(i,target),subtypes=get.subtypes(i); if(val<8&&target.hp<2&&!subtypes.includes('equip2')&&!subtypes.includes('equip5')) return false; return val>3+Math.min(5,target.hp); @@ -1824,9 +1821,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ wuxie:function(target,card,player,viewer){ - if(player==game.me&&get.attitude(viewer,player)>0){ - return 0; - } + if(player==game.me&&get.attitude(viewer,player._trueMe||player)>0) return 0; }, basic:{ order:8, diff --git a/card/yingbian.js b/card/yingbian.js index f00b13dd4..885564123 100644 --- a/card/yingbian.js +++ b/card/yingbian.js @@ -28,7 +28,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ wuxie:function(target,card,player,viewer,status){ - if(status*get.attitude(viewer,player)>0&&!player.isMad()) return 0; + if(get.attitude(viewer,player._trueMe||player)>0) return 0; if(!card.yingbian_all&&get.distance(player,target)>1&&!target.hasCard(i=>{ let val=get.value(i,target),subtypes=get.subtypes(i); if(val<8&&target.hp<2&&!subtypes.includes('equip2')&&!subtypes.includes('equip5')) return false; From f45dfd3126e7b201afe9efe79b637cb57f228127 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Mon, 25 Dec 2023 21:54:13 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=90=E6=AD=A6?= =?UTF-8?q?=E9=AD=82=E3=80=91=E3=80=90=E6=96=AD=E8=82=A0=E3=80=91=E3=80=90?= =?UTF-8?q?=E4=B8=9A=E4=BB=87=E3=80=91=E3=80=90=E5=A4=A9=E4=BD=90=E3=80=91?= =?UTF-8?q?=E3=80=90=E7=81=B5=E7=AD=96=E3=80=91=E3=80=90=E6=94=BE=E6=9D=83?= =?UTF-8?q?=E3=80=91ai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra.js | 74 +++++++++++++++++++++++++++++++++++++++++--- character/refresh.js | 4 +-- character/shenhua.js | 13 ++++---- character/sp2.js | 6 ++-- 4 files changed, 83 insertions(+), 14 deletions(-) diff --git a/character/extra.js b/character/extra.js index 7352440b5..e1b1490ea 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1992,6 +1992,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + ai:{ + notemp:true, + maixie_defend:true, + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')||!target.hasFriend()) return; + let die=[],extra=[null,0],temp; + game.filterPlayer(i=>{ + if(!i.hasMark('twwuhun')) return false; + temp=get.attitude(target,i); + if(temp<0) die.push(i); + else{ + temp=Math.sqrt(att)*i.countMark('twwuhun'); + if(!extra[0]||temp1&&(!die.length||get.attitude(player,target)<=0)) die.add(player); + if(die.length) return [1,0,1,die.reduce((num,i)=>{ + return num-=2*get.sgnAttitude(player,i); + },0)]; + } + } + } }, shouli:{ audio:2, @@ -3214,7 +3238,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target){ - if(card&&card.name=='qizhengxiangsheng') return 'zerotarget'; + if(card&&card.name=='qizhengxiangsheng') return 'zeroplayertarget'; }, } }, @@ -3293,18 +3317,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!map[id]) map[id]={}; map[id].qizheng_name=result.control; map[id].qizheng_aibuff=get.attitude(player,target)>0; - }, + } }, }, }, lingce:{ audio:2, + init:(player)=>{ + game.addGlobalSkill('lingce_global'); + }, trigger:{global:'useCard'}, forced:true, filter:function(event,player){ return (event.card.name=='qizhengxiangsheng'||get.zhinangs().contains(event.card.name)||player.getStorage('dinghan').contains(event.card.name))&&event.card.isCard&&event.cards.length==1; }, - content:function(){player.draw()}, + content:function(){ + player.draw(); + }, + subSkill:{ + global:{ + ai:{ + effect:{ + player:(card,player,target)=>{ + let num=0,nohave=true; + game.countPlayer(i=>{ + if(i.hasSkill('lingce')){ + nohave=false; + if(i.isIn()&&lib.skill.lingce.filter({card:card},i)) num+=get.sgnAttitude(player,i); + } + },true); + if(nohave) game.removeGlobalSkill('lingce_global'); + else return [1,0.8*num]; + } + } + } + } + } }, dinghan:{ audio:2, @@ -4710,8 +4758,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, group:'new_wuhun_die', ai:{ - threaten:0.01, notemp:true, + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')||!target.hasFriend()) return; + if(player.hasSkillTag('jueqing',null,target)) return 1.7; + let die=[null,1],temp; + game.filterPlayer(i=>{ + temp=i.countMark('new_wuhun'); + if(i===player&&target.hp+target.hujia>1) temp++; + if(temp>=die[1]){ + if(!die[0]) die=[i,temp]; + else{ + let att=get.attitude(player,i); + if(att=2&&player.countCards('h')<=player.hp+1; + var fang=player.countMark('olfangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.hp+2; player.chooseBool(get.prompt2('olfangquan')).set('ai',function(){ if(!_status.event.fang) return false; return game.hasPlayer(function(target){ @@ -14298,7 +14298,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ "step 0" - var fang=player.countMark('fangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.hp+1; + var fang=player.countMark('fangquan2')==0&&player.hp>=2&&player.countCards('h')<=player.maxHp+1; player.chooseBool(get.prompt2('refangquan')).set('ai',function(){ if(!_status.event.fang) return false; return game.hasPlayer(function(target){ diff --git a/character/shenhua.js b/character/shenhua.js index 013010448..4b3c9295f 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -3439,11 +3439,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "step 2" if(result.bool){ player.chooseTarget(true,'请选择进行额外回合的目标角色',lib.filter.notMe).ai=function(target){ - if(target.hasJudge('lebu')) return -1; - if(get.attitude(player,target)>4){ - return get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1); - } - return -1; + if(target.hasJudge('lebu')||get.attitude(player,target)<=0) return -1; + if(target.isTurnedOver()) return 0.18; + return get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1); }; } else event.finish(); @@ -4154,7 +4152,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ target:function(card,player,target,current){ if(!target.hasFriend()) return; - if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-2]; + if(target.hp<=1&&get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return 3; + return [1,0,0,-3*get.threaten(player)]; + } } } } diff --git a/character/sp2.js b/character/sp2.js index 8407714b7..586c6f156 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -8238,8 +8238,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget(get.prompt2('yechou'),function(card,player,target){ return player!=target&&target.getDamagedHp()>1 }).set('forceDie',true).set('ai',function(target){ - var num=get.attitude(_status.event.player,target); - return -num; + let att=get.attitude(_status.event.player,target); + if(att>0) return 0; + att=Math.sqrt(0.01-att); + return att*(get.distance(_status.currentPhase,target,'absolute')||game.players.length); }); "step 1" if(result.bool){ From cfad17964ca56d0b5b8c8b3179f81c26c4d8c749 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Tue, 26 Dec 2023 00:03:08 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=90=E5=86=B3?= =?UTF-8?q?=E8=AE=A8=E3=80=91=E3=80=90=E5=B1=AF=E7=94=B0=E3=80=91=E3=80=90?= =?UTF-8?q?=E5=89=91=E5=90=88=E3=80=91=E3=80=90=E6=82=B2=E6=AD=8C=E3=80=91?= =?UTF-8?q?=E3=80=90=E7=8B=82=E6=96=A7=E3=80=91=E3=80=90=E8=90=BD=E5=AE=A0?= =?UTF-8?q?=E3=80=91ai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui.js | 9 ++++++++- character/refresh.js | 21 ++++++++++----------- character/shenhua.js | 1 + character/sp.js | 36 +++++++++++++++++++++++++++++++++++- character/xianding.js | 23 +++++++++++++++-------- 5 files changed, 69 insertions(+), 21 deletions(-) diff --git a/character/huicui.js b/character/huicui.js index a17358c08..7b89af868 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -10824,10 +10824,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(val0&&min<=0) return target.hasSkillTag('noe')?3:1; - if(att<0&&max>0){ + if(att<=0&&max>0){ if(target.hasSkillTag('noe')) return max>6?(-max/3):0; return -max; } + if(player===target&&!player.hasSha()){ + let ph=player.countCards('h'); + if(game.hasPlayer(i=>{ + if(!player.canUse('sha',i,true,true)||get.effect(i,{name:'sha'},player,player)<=0) return false; + return !ph||!i.mayHaveShan(player,'use'); + })) return 1; + } return 0; }, }, diff --git a/character/refresh.js b/character/refresh.js index 8037a5ace..a6687ca52 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -3453,8 +3453,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return event.card&&event.card.name=='sha'&&event.player.isIn()&&player.countCards('he')>0; }, check:function(event,player){ - if(event.player.hasSkill('xinleiji')) return get.attitude(player,event.player)>0; - return true; + let att=get.attitude(player,event.player); + if(event.player.hasSkill('xinleiji')) return att>0; + if(att>0||event.player.isHealthy()) return true; + if(!event.source) return true; + att=get.attitude(player,event.source); + return att<=0||event.source.isTurnedOver(); }, prompt2:'令其进行判定,然后你可根据判定结果,弃置一张牌并令其执行对应效果。', content:function(){ @@ -13309,21 +13313,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ effect:function(card,player,target){ - if(!target.hasFriend()) return; - if(player==target) return; + if(player==target||!target.hasFriend()) return; var type=get.type(card); - var nh=target.countCards(); + var nh=Math.min(target.countCards(),game.countPlayer(i=>get.attitude(target,i)>0)); if(type=='trick'){ if(!get.tag(card,'multitarget')||get.info(card).singleCard){ - if(get.tag(card,'damage')){ - if(nh<3||target.hp<=2) return 0.8; - } + if(get.tag(card,'damage')) return [1.5,nh-1]; return [1,nh]; } } - else if(type=='delay'){ - return [0.5,0.5]; - } + else if(type=='delay') return [0.5,0.5]; }, } }, diff --git a/character/shenhua.js b/character/shenhua.js index 4b3c9295f..4823e0452 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -3663,6 +3663,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target,current){ + if(typeof card==='object'&&get.name(card)==='sha'&&target.mayHaveShan(player,'use')) return [0.6,0.75]; if(!target.hasFriend()&&!player.hasUnknown()) return; if(_status.currentPhase==target) return; if(card.name!='shuiyanqijunx'&&get.tag(card,'loseCard')&&target.countCards('he')){ diff --git a/character/sp.js b/character/sp.js index bfb7f3d3e..37abe21ea 100755 --- a/character/sp.js +++ b/character/sp.js @@ -5427,7 +5427,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ player:function(card,player,target){ if((!card.isCard||!card.cards)&&get.itemtype(card)!='card') return; - if(target&&player!=target&&player.countCards('h')>player.getHandcardLimit()) return [0,0,0,0.5]; + let cs=0; + if(target&&player!=target&&player.countCards('h',i=>{ + if(card===i||card.cards&&card.cards.includes(i)){ + cs++; + return false; + } + return true; + })>player.getHandcardLimit()){ + let targets=[],evt=_status.event.getParent('useCard'); + targets.addArray(ui.selected.targets); + if(evt&&evt.card==card) targets.addArray(evt.targets); + if(targets.length){ + if(targets.length>1||!targets.includes(target)) return 'zeroplayertarget'; + return; + } + let info=get.info(card); + if(!info||info.notarget||!info.filterTarget) return; + let range,select=get.copy(info.selectTarget),filter; + if(select===undefined) range=[1,1]; + else if(typeof select==='number') range=[select,select]; + else if(get.itemtype(select)==='select') range=select; + else if(typeof select==='function') range=select(card,player); + if(info.singleCard) range=[1,1]; + game.checkMod(card,player,range,'selectTarget',player); + if(range[1]<-1) range=[1, 1]; + else if(range[0]<0){ + if(info.filterTarget===true) filter=game.players.length; + else filter=game.countPlayer(current=>{ + return info.filterTarget(card,player,current); + }); + range=[filter,filter]; + } + if(range&&range[0]>1&&range[1]>1) return 'zeroplayertarget'; + return [0,0,0,1]; + } }, }, }, diff --git a/character/xianding.js b/character/xianding.js index e55242c72..e99e01378 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4725,16 +4725,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseButton([1,num]).set('createDialog',dialog).set('filterButton',button=>{ return lib.filter.canBeDiscarded(button.link,_status.event.player,get.owner(button.link)); }).set('ai',button=>{ - var card=button.link; - var player=_status.event.player,target=get.owner(card); - if(target==player&&ui.cardPile.childNodes.length>80){ - if(ui.selected.buttons.some(i=>get.owner(i.link)==player)) return 0; - if(get.value(card,player)<6) return 60-get.value(card,player); + var player=_status.event.player, + target=get.owner(button.link), + num=ui.selected.buttons.filter(i=>get.owner(i.link)==target).length; + if(num>1&&player.hp+player.hujia>2) return 0; + if(target==player){ + if(num) return -get.value(button.link,target); + if(ui.cardPile.childNodes.length>80) return 6-get.value(card,player); return 0; } - var num=ui.selected.buttons.filter(i=>get.owner(i.link)==target).length; var val=get.buttonValue(button); - if(num>2) val/=Math.sqrt(num); + if(num===2) val/=4; if(get.attitude(player,target)>0) return -val; return val; //return -(get.position(card)!='h'?get.value(card,target):(4.5+Math.random()-0.2*(num>2?1:0)))*get.attitude(player,target); @@ -9184,7 +9185,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget(get.prompt2('juetao'),lib.filter.notMe).set('ai',function(target){ - return -get.attitude(_status.event.player,target); + let att=-get.attitude(_status.event.player,target); + if(att<=0) return -att; + if(target.hasSkillTag('nodamage')) return 0.01*att; + if(target.getEquip('tengjia')||target.getEquip('renwang')) return 0.2*att; + if(target.getEquip('bugua')) return 0.3*att; + if(target.getEquip(2)) return att/2; + return 1.2*att; }); 'step 1' if(result.bool){ From 413e4e2848567643b5f392068e5a9f8dab563398 Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Tue, 26 Dec 2023 09:59:11 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=90=E8=B4=9E?= =?UTF-8?q?=E7=83=88=E3=80=91=E3=80=90=E6=A8=AA=E9=AA=9B=E3=80=91=E3=80=90?= =?UTF-8?q?=E9=A3=9E=E6=89=AC=E3=80=91ai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- card/sp.js | 5 +++++ card/standard.js | 8 ++++---- character/extra.js | 16 ++++++++++++++++ character/jsrg.js | 14 ++++++++++++-- character/yijiang.js | 14 +++++++++++++- mode/doudizhu.js | 16 ++++++++++------ 6 files changed, 60 insertions(+), 13 deletions(-) diff --git a/card/sp.js b/card/sp.js index 2a00dc468..396e64816 100644 --- a/card/sp.js +++ b/card/sp.js @@ -197,6 +197,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return lib.card.shandian.ai.result.target(player,target); } }, + tag:{ + damage:0.25, + natureDamage:0.25, + thunderDamage:0.25, + } } }, qibaodao:{ diff --git a/card/standard.js b/card/standard.js index 668a5c631..182ec7c5f 100644 --- a/card/standard.js +++ b/card/standard.js @@ -2032,7 +2032,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ result:{ target:function(player,target){ var num=game.countPlayer(function(current){ - var skills=current.getSkills(); + //var skills=current.getSkills(); for(var j=0;j{ + if(typeof card!=='object') return; + let suit=get.suit(card); + if(!lib.suit.contains(suit)||player.hasCard(function(i){ + return get.suit(i,player)==suit; + },'h')) return; + return [1,0.8*game.countPlayer(current=>{ + return current.countCards('e',card=>{ + return get.suit(card,current)==suit; + }); + })]; + } + } + } }, changandajian_equip5:{ equipSkill:true, diff --git a/character/jsrg.js b/character/jsrg.js index 4847fa1dd..f34c6bbb1 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -4039,8 +4039,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ - return 6-get.value(card); - }); + if(_status.event.goon) return 6-get.value(card); + return 0; + }).set('goon',(()=>{ + if(player.hasSkillTag('rejudge')&&player.countCards('j')<2) return false; + return player.hasCard(function(card){ + if(get.tag(card,'damage')&&get.damageEffect(player,player,_status.event.player,get.natureList(card))>=0) return false; + return get.effect(player,{ + name:card.viewAs||card.name, + cards:[card], + },player,player)<0; + },'j'); + })()); 'step 1' if(result.bool){ player.discardPlayerCard(player,'j',true); diff --git a/character/yijiang.js b/character/yijiang.js index 7eef0fb8e..1644392a3 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -11907,16 +11907,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{target:'useCardToTargeted'}, content:function(){ "step 0" + if(get.attitude(player,trigger.player)<0&&trigger.player.countDiscardableCards(player,'he')) player.addTempSkill('zhenlie_lose'); player.loseHp(); "step 1" + player.removeSkill('zhenlie_lose'); trigger.getParent().excluded.add(player); "step 2" if(trigger.player.countCards('he')){ + if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.12); player.discardPlayerCard(trigger.player,'he',true); } }, + subSkill:{ + lose:{ + charlotte:true + } + }, ai:{ - expose:0.3 + effect:{ + target:(card,player,target)=>{ + if(target.hp<=0&&target.hasSkill('zhenlie_lose')&&get.tag(card,'recover')) return [1,1.2]; + } + } } }, //吾彦... diff --git a/mode/doudizhu.js b/mode/doudizhu.js index 1cecbb59b..43ff0d49e 100644 --- a/mode/doudizhu.js +++ b/mode/doudizhu.js @@ -2256,12 +2256,16 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ player.chooseToDiscard('h',2,get.prompt('feiyang'),'弃置两张手牌,然后弃置判定区里的一张牌').set('logSkill','feiyang').set('ai',function(card){ if(_status.event.goon) return 6-get.value(card); return 0; - }).set('goon',player.hasCard(function(card){ - return get.effect(player,{ - name:card.viewAs||card.name, - cards:[card], - },player,player)<0; - },'j')); + }).set('goon',(()=>{ + if(player.hasSkillTag('rejudge')&&player.countCards('j')<2) return false; + return player.hasCard(function(card){ + if(get.tag(card,'damage')&&get.damageEffect(player,player,_status.event.player,get.natureList(card))>=0) return false; + return get.effect(player,{ + name:card.viewAs||card.name, + cards:[card], + },player,player)<0; + },'j'); + })()); "step 1" if(result.bool){ player.discardPlayerCard(player,'j',true); From 3f4b30a1e8114300cbf8b40cb40165128dac5d5d Mon Sep 17 00:00:00 2001 From: 157 <3619242020@qq.com> Date: Tue, 26 Dec 2023 22:15:32 +0800 Subject: [PATCH 8/8] =?UTF-8?q?bugfix,=20ai=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- card/standard.js | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/card/standard.js b/card/standard.js index 182ec7c5f..e4bf4f355 100644 --- a/card/standard.js +++ b/card/standard.js @@ -138,25 +138,18 @@ game.import('card',function(lib,game,ui,get,ai,_status){ next.set('prompt2','(在此之后仍需弃置一张手牌)'); } next.set('ai1',function(card){ - var target=_status.event.player; - var evt=_status.event.getParent(); - var bool=true; - if(_status.event.shanRequired>1&&!get.is.object(card)&&target.countCards('h','shan')<_status.event.shanRequired-(_status.event.shanIgnored||0)){ - bool=false; - } - else if(target.hasSkillTag('useShan')){ - bool=true; - } - else if(target.hasSkillTag('noShan')){ - bool=false; - } - else if(get.damageEffect(target,evt.player,target,evt.card.nature)>=0) bool=false; - if(bool){ - return get.order(card); - } + if(_status.event.useShan) return get.order(card); return 0; }).set('shanRequired',event.shanRequired); next.set('respondTo',[player,card]); + next.set('useShan',(()=>{ + if(target.hasSkillTag('noShan',null,event)) return false; + if(target.hasSkillTag('useShan',null,event)) return true; + if(event.baseDamage+event.extraDamage<=0 || get.attitude(target,player._trueMe||player)>0) bool=false; + if(event.shanRequired>1&&target.countCards('h','shan')=0) return false; + return true; + })()); //next.autochoose=lib.filter.autoRespondShan; } "step 2" @@ -261,7 +254,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, order:function(item,player){ if(player.hasSkillTag('presha',true,null,true)) return 10; - if(item.hasNature('linked')){ + if(typeof item==='object'&&item.hasNature('linked')){ if(game.hasPlayer(function(current){ return current!=player&¤t.isLinked()&&player.canUse(item,current,null,true)&&get.effect(current,item,player,player)>0&&lib.card.sha.ai.canLink(player,current,item); })&&game.countPlayer(function(current){