diff --git a/card/extra.js b/card/extra.js index 6c7e1736e..12f570962 100644 --- a/card/extra.js +++ b/card/extra.js @@ -399,7 +399,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ value:function(card,player,index,method){ if(player.isDisabled(2)) return 0.01; - if(card==player.getEquip(2)){ + if(player.getEquips('tengjia').contains(card)){ if(player.hasSkillTag('noDirectDamage')) return 10; if(game.hasPlayer(function(current){ return current!=player&&get.attitude(current,player)<0&¤t.hasSkillTag('fireAttack',null,null,true); @@ -788,7 +788,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ //if(card.name=='nanman'||card.name=='wanjian'||card.name=='chuqibuyi') return 'zerotarget'; if(card.name=='nanman'||card.name=='wanjian') return 'zerotarget'; if(card.name=='sha'){ - var equip1=player.getEquip(1); + var equip1=player.getEquip('zhuque'); if(equip1&&equip1.name=='zhuque') return 1.9; if(!card.nature) return 'zerotarget'; } diff --git a/card/sp.js b/card/sp.js index ee72624c6..7aa5a6957 100644 --- a/card/sp.js +++ b/card/sp.js @@ -47,7 +47,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ enable:true, filterTarget:function(card,player,target){ if(target==player) return false; - if(target.getEquip(5)){ + if(target.getEquips(5).length){ return target.countCards('e')>1; } else{ @@ -467,11 +467,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ trigger:{player:'damageBegin4'}, forced:true, filter:function(event,player){ - return event.card&&event.card.name=='sha'&&player.getEquip('lanyinjia'); + return event.card&&event.card.name=='sha'&&player.getEquips('lanyinjia').length>0; }, content:function(){ - var card=player.getEquip('lanyinjia'); - if(card){ + var card=player.getEquips('lanyinjia'); + if(card.length){ player.discard(card); } }, diff --git a/card/zhulu.js b/card/zhulu.js index 13e145a5e..886d7ee99 100644 --- a/card/zhulu.js +++ b/card/zhulu.js @@ -809,7 +809,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ forced:true, filter:function(event,player){ if(event.card.name!='sha') return false; - var cards=player.getEquip('wufengjian'); + var cards=player.getEquips('wufengjian'); return player.hasCard(function(card){ return !cards.contains(card); },'he'); diff --git a/character/collab.js b/character/collab.js index 73a1793d0..22921c374 100644 --- a/character/collab.js +++ b/character/collab.js @@ -718,7 +718,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.hasEquipableSlot(1); + return (event.name!='phase'||game.phaseNumber==0)&&player.hasEquipableSlot(1)&&!player.getEquips('ruyijingubang').length; }, content:function(){ var card=game.createCard2('ruyijingubang','heart',9); @@ -804,10 +804,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ var num=lib.skill.ruyijingubang_skill_backup.num; player.storage.ruyijingubang_skill=num; - var card=player.getEquip(1); - if(card&&card.name=='ruyijingubang'){ - card.storage.ruyijingubang_skill=num; - game.log(player,'将',card,'的攻击范围改为'+num) + var card=player.getEquips(1); + for(var card of cards){ + if(card&&card.name=='ruyijingubang'){ + card.storage.ruyijingubang_skill=num; + game.log(player,'将',card,'的攻击范围改为'+num) + } } player.markSkill('ruyijingubang_skill'); }, diff --git a/character/ddd.js b/character/ddd.js index 695d62523..fccf1d110 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -3405,7 +3405,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, direct:true, filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source.getEquip(1); + return event.source&&event.source.isIn()&&event.source.getEquips(1).length>0; }, content:function(){ 'step 0' diff --git a/character/diy.js b/character/diy.js index ad14b71fe..e4634ab4b 100755 --- a/character/diy.js +++ b/character/diy.js @@ -5026,11 +5026,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ check:function(button){ var player=_status.event.player; if(typeof button.link=='number'){ - var card=player.getEquip(button.link); - if(card){ - var val=get.value(card); - if(val>0) return 0; - return 5-val; + if(!player.hasEmptySlot(button.link)){ + var card=player.getEquip(button.link); + if(card){ + var val=get.value(card); + if(val>0) return 0; + return 5-val; + } } switch(button.link){ case 3:return 4.5;break; diff --git a/character/extra.js b/character/extra.js index 1d620f44a..3c6c2d952 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1323,13 +1323,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(event.responded||event.shouli||event.type=='wuxie') return false; if(game.hasPlayer(function(current){ - return current.getEquip(4); + return current.getCards('e',card=>get.subtype(card)=='equip4').length>0; })&&event.filterCard({ name:'sha', storage:{shouli:true}, },player,event)) return true; if(game.hasPlayer(function(current){ - return current.getEquip(3); + return current.getCards('e',card=>get.subtype(card)=='equip3').length>0; })&&event.filterCard({ name:'shan', storage:{shouli:true}, @@ -1341,23 +1341,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ var event=_status.event,evt=event; if(event._backup) evt=event._backup; - var equip3=target.getEquip(3); - var equip4=target.getEquip(4); - if(equip3&&evt.filterCard(get.autoViewAs({ + var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); + var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({ name:'shan', storage:{shouli:true}, - },[equip3]),player,event)) return true; - var sha=get.autoViewAs({ - name:'sha', - storage:{shouli:true}, - },[equip4]); - if(equip4&&evt.filterCard(sha,player,event)){ - if(!evt.filterTarget) return true; - return game.hasPlayer(function(current){ - return evt.filterTarget(sha,player,current); - }) - }; - return false; + },[card]),player,event))) return true; + return equip4.some(card=>{ + var sha=get.autoViewAs({ + name:'sha', + storage:{shouli:true}, + },[card]); + if(evt.filterCard(sha,player,event)){ + if(!evt.filterTarget) return true; + return game.hasPlayer(function(current){ + return evt.filterTarget(sha,player,current); + }) + }; + }) }, prompt:'将场上的一张坐骑牌当做【杀】或【闪】使用或打出', content:function(){ @@ -1365,32 +1366,45 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getParent(2); evt.set('shouli',true); var list=[]; - var equip3=target.getEquip(3); - var equip4=target.getEquip(4); + var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); + var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); var backupx=_status.event; _status.event=evt; try{ - if(equip3){ + if(equip3.length&&equip3.some(card=>{ var shan=get.autoViewAs({ name:'shan', storage:{shouli:true}, - },[equip3]); - if(evt.filterCard(shan,player,event)) list.push('shan'); + },[card]); + if(evt.filterCard(shan,player,event)) return true; + return false; + })){ + list.push('shan'); } - if(equip4){ + if(equip4.length&&equip4.some(card=>{ var sha=get.autoViewAs({ name:'sha', storage:{shouli:true}, - },[equip4]); + },[card]); if(evt.filterCard(sha,player,evt)&&(!evt.filterTarget||game.hasPlayer(function(current){ return evt.filterTarget(sha,player,current); - }))) list.push('sha'); + }))) return true; + return false; + })){ + list.push('sha'); }; }catch(e){game.print(e)}; _status.event=backupx; - if(list.length==1) event._result={ - bool:true, - links:[list[0]=='shan'?equip3:equip4], + if(list.length==1){ + event.cardName=list[0]; + var cards=list[0]=='shan'?equip3:equip4; + if(cards.length==1) event._result={ + bool:true, + links:[cards[0]], + } + else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ + return _status.event.cards.contains(button.link); + }).set('cards',cards) } else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ var type=get.subtype(button.link); @@ -1399,7 +1413,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' var evt=event.getParent(2); if(result.bool&&result.links&&result.links.length){ - var name=get.subtype(result.links[0])=='equip3'?'shan':'sha'; + var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan')); if(evt.name=='chooseToUse'){ game.broadcastAll(function(result,name){ lib.skill.shouli_backup.viewAs={ @@ -1443,7 +1457,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skillTagFilter:function(player,tag){ var subtype=(tag=='respondSha'?'equip4':'equip3'); return game.hasPlayer(function(current){ - return current.getEquip(subtype); + return current.hasCard(card=>get.subtype(card,false)==subtype,'e'); }); }, order:2, @@ -3392,7 +3406,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ var players=game.filterPlayer(); for(var i=0;i0){ return true; } } @@ -3401,10 +3415,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var players=game.filterPlayer(); for(var i=0;i0){ player.line(players[i],'green'); - players[i].give(e,player); + player.gain(e,players[i],'give','bySelf'); } } } diff --git a/character/huicui.js b/character/huicui.js index 7a47de378..349e1911d 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -6485,7 +6485,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i of list){ if(player.hasEnabledSlot(i)){ var card=player.getEquip(i); - if(!card) return true; + if(!card||player.hasEmptySlot(i)) return true; if(get.value(card,player)<=0) return true; } } @@ -6499,7 +6499,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i of list){ if(player.hasEnabledSlot(i)){ var card=player.getEquip(i); - if(!card) return 'equip'+i; + if(!card||player.hasEmptySlot(i)) return 'equip'+i; if(get.value(card,player)<=0) return 'equip'+i; } } diff --git a/character/mobile.js b/character/mobile.js index 03a9bc044..ac7fb1e5d 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -6504,17 +6504,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ var source=event.source; if(!source) return false; - var card=source.getEquip(1); - return card&&get.itemtype(card)=='card'&&lib.filter.canBeGained(card,player,source); + var cards=source.getEquips(1); + return cards.length&&cards.some(card=>lib.filter.canBeGained(card,player,source)); }, prompt2:function(event){ - return '获得其装备区中的'+get.translation(event.source.getEquip(1)); + var source=event.source; + var cards=source.getEquips(1).filter(card=>lib.filter.canBeGained(card,player,source)); + return '获得其装备区中的'+get.translation(cards); }, check:function(event,player){ return (get.attitude(player,event.source)+0.1)*get.value(event.source.getEquip(1),event.source); }, content:function(){ - player.gain(trigger.source.getEquip(1),trigger.source,'give','bySelf'); + var source=trigger.source; + var cards=source.getEquips(1).filter(card=>lib.filter.canBeGained(card,player,source)); + player.gain(cards,source,'give','bySelf'); }, }, xinanjian:{ @@ -9466,14 +9470,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mod:{ cardUsable:function(card,player,num){ - var cardx=player.getEquip('rewrite_zhuge'); - if(card.name=='sha'&&(!cardx||player.hasSkill('rw_zhuge_skill',null,false)||(!_status.rw_zhuge_temp&&!ui.selected.cards.contains(cardx)))){ - return Infinity; + var cards=player.getEquips('rewrite_zhuge') + if(card.name=='sha'){ + if(!cards.length||player.hasSkill('rw_zhuge_skill',null,false)||cards.some(card=>(card!=_status.rw_zhuge_temp&&!ui.selected.cards.contains(card)))){ + if(get.is.versus()||get.is.changban()){ + return num+3; + } + return Infinity; + } } }, cardEnabled2:function(card,player){ if(!_status.event.addCount_extra||player.hasSkill('rw_zhuge_skill',null,false)) return; - if(card&&card==player.getEquip('rewrite_zhuge')){ + var cards=player.getEquips('rewrite_zhuge'); + if(card&&cards.contains(card)){ try{ var cardz=get.card(); } @@ -9481,7 +9491,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return; } if(!cardz||cardz.name!='sha') return; - _status.rw_zhuge_temp=true; + _status.rw_zhuge_temp=card; var bool=lib.filter.cardUsable(get.autoViewAs({name:'sha'},ui.selected.cards.concat([card])),player); delete _status.rw_zhuge_temp; if(!bool) return false; @@ -11222,22 +11232,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var next=player.chooseTarget(2,function(card,player,target){ if(ui.selected.targets.length){ if(!_status.event.ingame){ - var cards=ui.selected.targets[0].getEquip(2); - return target.canEquip(card) + var cards=ui.selected.targets[0].getEquips(2); + return cards.some(card=>target.canEquip(card)) } var from=ui.selected.targets[0]; if(target.isMin()) return false; var es=from.getCards('e'); for(var i=0;i1) continue; if(target.canEquip(es[i])) return true; } return false; } else{ if(!event.ingame){ - if(target.getEquip(2)) return true; + if(target.getEquips(2).length) return true; return false; } return target.countCards('e')>0; @@ -11253,9 +11261,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(get.attitude(player,current)>0){ var es=target.getCards('e'); for(var i=0;i1) continue; - else if(current.canEquip(es[i])) return true; + if(current.canEquip(es[i])) return true; } return false; } @@ -11267,8 +11273,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var es=ui.selected.targets[0].getCards('e'); var i; for(i=0;i1) continue; if(target.canEquip(es[i])) break; } if(i==es.length) return 0; @@ -11289,21 +11293,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 3' if(targets.length==2){ if(!event.ingame){ - event._result={ + var cards=targets[0].getEquips(2); + if(cards.length==1) event._result={ bool:true, - links:[targets[0].getEquip(2)], - }; + links:cards, + } + else{ + player.choosePlayerCard('e',true,function(button){ + return get.equipValue(button.link); + },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ + if(!get.subtypes(button.link,false).contains('equip2')) return false; + var targets1=_status.event.targets1; + return targets1.canEquip(button.link); + }); + } } else{ - player.choosePlayerCard('e',true,function(button){ - return get.equipValue(button.link); - },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ - var targets1=_status.event.targets1; - if(['equip3','equip4'].contains(get.subtype(button.link))&&targets1.getEquip('liulongcanjia')) return false; - if(button.link.name=='liulongcanjia'&&targets1.countCards('e',{subtype:['equip3','equip4']})>1) return false; - return !targets1.countCards('e',{subtype:get.subtype(button.link)}); - - }); + player.choosePlayerCard('e',true,function(button){ + return get.equipValue(button.link); + },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ + var targets1=_status.event.targets1; + return targets1.canEquip(button.link); + }); } } else event.finish(); @@ -12405,7 +12416,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'damageEnd'}, forced:true, filter:function(event,player){ - return !player.getEquip('ly_piliche'); + return !player.getEquips('ly_piliche').length; }, content:function(){ 'step 0' @@ -12419,7 +12430,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); if(card) player.chooseUseTarget(card,true,'nopopup'); 'step 3' - if(event.count>0&&!player.getEquip('ly_piliche')) event.goto(1); + if(event.count>0&&!player.getEquips('ly_piliche').length) event.goto(1); }, }, }, diff --git a/character/refresh.js b/character/refresh.js index 20b1607fa..1ebd790bb 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -381,30 +381,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ relinglong:{ audio:2, trigger:{ - player:'loseAfter', + player:['loseAfter','disableEquipAfter','enableEquipAfter'], global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter','phaseBefore'], }, forced:true, onremove:true, derivation:'reqicai', filter:function(event,player){ - if(event.name!='phase'&&(event.name!='equip'||event.player!=player)){ + if(event.name=='disableEquip'||event.name=='enableEquip'){ + if(!event.slots.contains('equip5')) return false; + } + else if(event.name!='phase'&&(event.name!='equip'||event.player!=player)){ var evt=event.getl(player); - if(!evt||!evt.es||!evt.es.some(i=>get.subtype(i)=='equip5')) return false; + if(!evt||!evt.es||!evt.es.some(i=>get.subtypes(i).contains('equip5'))) return false; } var skills=player.additionalSkills['relinglong']; - return skills&&skills.length&&player.getEquip(5)||!(skills&&skills.length)&&!player.getEquip(5); + return (skills&&skills.length>0)!=player.hasEmptySlot(5); }, content:function(){ player.removeAdditionalSkill('relinglong'); - if(!player.getEquip(5)){ + if(player.hasEmptySlot(5)){ player.addAdditionalSkill('relinglong',['reqicai']); } }, group:['linglong_bagua','relinglong_directhit'], mod:{ maxHandcard:function(player,num){ - if(player.getEquip(3)||player.getEquip(4)||player.getEquip(6)) return; + if(!player.hasEmptySlot(3)||!player.hasEmptySlot(4)) return; return num+2; }, }, @@ -415,8 +418,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, filter:function(event,player){ if(event.card.name!='sha'&&get.type(event.card,false)!='trick') return false; - for(var i=2;i<=6;i++){ - if(player.getEquip(i)) return false; + for(var i=2;i<6;i++){ + if(!player.hasEmptySlot(i)) return false; } return true; }, @@ -428,8 +431,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ directHit_ai:true, skillTagFilter:function(player,tag,arg){ if(!arg||!arg.card||!arg.target||(arg.card.name!='sha'&&get.type(arg.card,false)!='trick')) return false; - for(var i=2;i<=6;i++){ - if(player.getEquip(i)) return false; + for(var i=2;i<6;i++){ + if(!player.hasEmptySlot(i)) return false; } return true; }, @@ -969,7 +972,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damageSource'}, forced:true, filter:function(event,player){ - return event.player.isIn()&&event.card&&event.card.name=='sha'&&event.cards.filterInD('od').length&&event.notLink()&&[2,3,4,6].some(i=>event.player.getEquip(i)); + return event.player.isIn()&&event.card&&event.card.name=='sha'&&event.cards.filterInD('od').length&& + event.notLink()&&[2,3,4].some(i=>event.player.getEquips(i).length>0); }, group:'remoshi_retrieve', content:function(){ @@ -983,23 +987,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, filter:function(event,player){ + var keys=['equip2','equip3','equip4']; return game.hasPlayer(current=>{ if(event.name=='gain'&¤t==player) return false; var cards=current.getExpansions('remoshi_stuck'); if(!cards.length) return false; var evt=event.getl(current); - if(evt&&evt.cards2&&evt.cards2.some(i=>['equip2','equip3','equip4','equip6'].contains(get.subtype(i)))) return true; + if(evt&&evt.cards2&&evt.cards2.some(i=>get.subtypes(i).some(slot=>keys.contains(slot)))) return true; }); }, direct:true, forced:true, content:function(){ 'step 0' + var keys=['equip2','equip3','equip4']; var targets=game.filterPlayer(current=>{ var cards=current.getExpansions('remoshi_stuck'); if(!cards.length) return false; var evt=trigger.getl(current); - if(evt&&evt.cards2&&evt.cards2.some(i=>['equip2','equip3','equip4','equip6'].contains(get.subtype(i)))) return true; + if(evt&&evt.cards2&&evt.cards2.some(i=>get.subtypes(i).some(slot=>keys.contains(slot)))) return true; }); event.targets=targets; 'step 1' @@ -7915,7 +7921,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ regongji:{ mod:{ attackRangeBase:function(player){ - if(player.getEquip(3)||player.getEquip(4)||player.getEquip(6)) return Infinity; + if(player.getEquips(3).length>0||player.getEquips(4).length>0) return Infinity; }, }, enable:'phaseUse', @@ -14660,7 +14666,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rejiqiao:'机巧', rejiqiao_info:'出牌阶段开始时,你可以弃置任意张牌,然后亮出牌堆顶X张牌(X为你以此法弃置的牌数与其中装备牌数之和),你获得其中所有非装备牌。', relinglong:'玲珑', - relinglong_info:'锁定技。若你的装备区:没有防具牌,视为你装备【八卦阵】;没有坐骑牌,你的手牌上限+2;没有宝物牌,你视为拥有〖奇才〗;以上均满足:你使用的【杀】或普通锦囊牌不可被响应。', + relinglong_info:'锁定技。若你的装备区:有空置的防具栏,你视为拥有〖八卦阵〗;有空置的两种坐骑栏,你的手牌上限+2;有空置的宝物栏,你视为拥有〖奇才〗;以上均满足:你使用的【杀】或普通锦囊牌不可被响应。', ol_zhangzhang:'界张昭张纮', olzhijian:'直谏', olzhijian_info:'出牌阶段,你可以将一张装备牌置于其他角色的装备区(可替换原装备),然后摸一张牌。', diff --git a/character/sb.js b/character/sb.js index 580b1e303..c6b4800d6 100644 --- a/character/sb.js +++ b/character/sb.js @@ -2016,7 +2016,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(card.name=='sha') return Infinity; }, targetInRange:function(card,player,target){ - if(card.name=='sha'&&player.getEquip(1)) return true; + if(card.name=='sha'&&player.getEquips(1).length>0) return true; }, }, trigger:{player:'useCard'}, @@ -4088,9 +4088,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbliegong:{ audio:2, mod:{ - cardnature:function(card,player){ - if(!player.getEquip(1)&&get.name(card,player)=='sha') return false; - }, + cardnature:function(card,player){ + if(player.hasEmptySlot(1)&&get.name(card,player)=='sha') return false; + }, }, trigger:{player:'useCardToPlayered'}, filter:function(event,player){ diff --git a/character/shiji.js b/character/shiji.js index be75dc3bd..e2c7872aa 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -1203,7 +1203,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ return event.card&&event.card.name=='sha'&& event.source&&event.source.isIn()&&player!=event.source - &&event.cards.filterInD().length>0&&player.getEquip(1); + &&event.cards.filterInD().length>0&&player.getEquips(1).length>0; }, check:function(event,player){ var card={ @@ -1222,7 +1222,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return hs.contains(i); }).length==cards.length&&player.canUse({name:'sha',cards:cards},target,false)){ var next=player.useCard({name:'sha'},cards,target,false); - if(!target.getEquip(1)) next.baseDamage=2; + if(!target.getEquips(1).length) next.baseDamage=2; } }, }, @@ -1241,11 +1241,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(card) player.gain(card,'gain2'); else{ var targets=game.filterPlayer(function(current){ - return current.getEquip(1); + return current.getEquips(1).length>0; }); if(targets.length){ var target=targets.randomGet(); - player.gain(target.getEquip(1),target,'give','bySelf'); + player.gain(target.getEquips(1),target,'give','bySelf'); } } }, @@ -5170,7 +5170,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ chooseControl:function(event,player){ var list=[]; for(var i=1;i<6;i++){ - if(player.getEquip(i)) list.push('equip'+i); + if(player.getEquips(i).length>0) list.push('equip'+i); } list.push('cancel2'); return list; diff --git a/character/sp.js b/character/sp.js index 448d70f9a..0ea91615f 100755 --- a/character/sp.js +++ b/character/sp.js @@ -7594,7 +7594,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ getNum:function(player,target){ var num=0; if(target.isHealthy()) num++; - if(target.getEquip(2)) num++; + if(target.getEquips(2).length) num++; var countSkill=function(player){ return player.getSkills(null,false,false).filter(function(skill){ var info=get.info(skill); @@ -7991,11 +7991,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var name='zhuangshu_'+get.type2(result.cards[0],result.cards[0].original=='h'?player:false); if(lib.card[name]&&trigger.player.isIn&&trigger.player.hasEmptySlot(5)){ var target=game.findPlayer(function(current){ - var equip=current.getEquip(5); + var equip=current.getEquip(name); return equip&&equip.name==name; }); if(target){ - var card=target.getEquip(5); + var card=target.getEquip(name); target.$give(card,trigger.player,false); } else{ @@ -8045,8 +8045,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.type!='discard'||event.getlx===false) return false; return game.hasPlayer(function(current){ if(player!=current){ - var card=current.getEquip(5); - if(!card||card.name.indexOf('zhuangshu_')!=0) return false; + var cards=current.getEquips(5); + if(!cards.some(card=>card.name.indexOf('zhuangshu_')==0)) return false; } var evt=event.getl(current); if(!evt||!evt.cards2) return false; @@ -8061,8 +8061,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=[]; game.countPlayer(function(current){ if(player!=current){ - var card=current.getEquip(5); - if(!card||card.name.indexOf('zhuangshu_')!=0) return false; + var cards=current.getEquips(5); + if(!cards.some(card=>card.name.indexOf('zhuangshu_')==0)) return false; } var evt=trigger.getl(current); for(var i of evt.cards2){ @@ -10705,17 +10705,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return lib.filter.filterTarget.apply(this,arguments); }).set('sourcex',targets[1]).set('addCount',false); 'step 2' - var card=targets[0].getEquip(1); - if(!result.bool&&card){ - event.card=card; - player.chooseTarget(true,'将'+get.translation(card)+'交给一名其他角色').set('ai',function(target){ - var card=_status.event.getParent().card; - return (target.hasSkillTag('nogain')?0:get.attitude(_status.event.player,target))*Math.max(0.1,target.getUseValue(card)); + var cards=targets[0].getEquips(1); + if(!result.bool&&cards.length){ + event.cards=cards; + player.chooseTarget(true,'将'+get.translation(cards)+'交给一名其他角色').set('ai',function(target){ + var card=_status.event.getParent().cards; + return (target.hasSkillTag('nogain')?0:get.attitude(_status.event.player,target))*Math.max(0.1,target.getUseValue(cards[0])); }); } else event.finish(); 'step 3' - result.targets[0].gain(card,result.targets[0],'give').giver=player; + result.targets[0].gain(cards,result.targets[0],'give').giver=player; }, ai:{ order:4, @@ -12023,7 +12023,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function (){ 'step 0' player.chooseTarget(get.prompt('new_mumu'),'弃置一名角色装备区内的一张牌,或者获得一名角色装备区内的防具牌',function(card,player,target){ - if(target==player) return target.getEquip(2)!=undefined; + if(target==player) return target.getEquips(2).length>0; return target.countCards('e')>0; }).set('ai',function(target){ var player=_status.event.player; @@ -12038,12 +12038,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.target=result.targets[0]; player.logSkill('new_mumu',event.target); player.line(event.target,'green'); - var e=event.target.getEquip(2); + var e=event.target.getEquips(2); event.e=e; if(target==player) event.choice='获得一张防具牌'; - else if(e){ + else if(e.length>0){ player.chooseControl('弃置一张装备牌','获得一张防具牌').set('ai',function(){ - if(_status.event.player.getEquip(2)){ + if(_status.event.player.getEquips(2).length>0){ return '弃置一张装备牌'; } return '获得一张防具牌'; @@ -12052,7 +12052,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ event.choice='弃置一张装备牌'; } - }else event.finish(); + } + else event.finish(); 'step 2' var choice=event.choice||result.control; if(choice=='弃置一张装备牌'){ @@ -12826,8 +12827,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.gain(card,'gain2'); } 'step 2' - var equip1=target.getEquip(1); - if(equip1){ + var equip1=target.getEquips(1); + if(equip1.length){ game.delay(); target.give(equip1,player); target.line(player); @@ -12864,8 +12865,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.list=result.targets.slice(0); } 'step 2' - var equip1=player.getEquip(1); - if(equip1){ + var equip1=player.getEquips(1); + if(equip1.length){ for(var i=0;islot=='equip2'||slot=='equip5')) return false; }, /*cardDiscardable:function (card,player){ if(player.getEquip(5)) return; @@ -16863,15 +16864,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterTarget:function(card,player,target){ if(target==player) return false; - return target.getEquip(1)||target.getEquip(2); + return target.getEquips(1).length>0||target.getEquips(2).length>0; }, content:function(){ 'step 0' - var e1=target.getEquip(1); - var e2=target.getEquip(2); + var e1=target.getEquips(1); + var e2=target.getEquips(2); event.e1=e1; event.e2=e2; - if(e1&&e2){ + if(e1.length&&e2.length){ player.chooseControl('武器牌','防具牌').set('ai',function(){ if(_status.event.player.getEquip(2)){ return '武器牌'; @@ -16879,7 +16880,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '防具牌'; }); } - else if(e1){ + else if(e1.length){ event.choice='武器牌'; } else{ @@ -18868,7 +18869,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.turnOver(); "step 1" var num=game.countPlayer(function(current){ - return current.getEquip(1); + return current.getEquips(1).length; }); player.draw(2+num); player.addSkill('kuiwei2'); @@ -18887,7 +18888,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:false, content:function(){ var num=game.countPlayer(function(current){ - return current.getEquip(1); + return current.getEquips(1).length; }); if(num>=player.countCards('he')){ player.discard(player.getCards('he')); diff --git a/character/standard.js b/character/standard.js index f73668cd2..073d1a8e4 100755 --- a/character/standard.js +++ b/character/standard.js @@ -5,8 +5,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, characterSort:{ standard:{ - standard_2008:["caocao","simayi","xiahoudun","zhangliao","xuzhu","guojia","zhenji","liubei","guanyu","zhangfei","zhugeliang","zhaoyun","machao","huangyueying","sunquan","ganning","lvmeng","huanggai","zhouyu","daqiao","luxun","sunshangxiang","huatuo","lvbu","diaochan","re_lidian"], - standard_2013:["huaxiong","re_yuanshu","re_xushu"], + standard_2008:["caocao","simayi","xiahoudun","zhangliao","xuzhu","guojia","zhenji","liubei","guanyu","zhangfei","zhugeliang","zhaoyun","machao","huangyueying","sunquan","ganning","lvmeng","huanggai","zhouyu","daqiao","luxun","sunshangxiang","huatuo","lvbu","diaochan"], + standard_2013:["huaxiong","re_yuanshu","re_xushu","re_lidian"], standard_2019:["gongsunzan","xf_yiji"], standard_2023:["std_panfeng"], }, @@ -2223,8 +2223,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ player.awakenSkill('zhanshen'); - var card=player.getEquip(1); - if(card) player.discard(card); + var card=player.getEquips(1); + if(cards.length) player.discard(card); player.loseMaxHp(); player.addSkill('mashu'); player.addSkill('shenji'); diff --git a/character/tw.js b/character/tw.js index 0ce4f6e41..195afd8ca 100644 --- a/character/tw.js +++ b/character/tw.js @@ -5960,7 +5960,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:['enterGame','phaseZhunbeiBegin'] }, filter:function(event,player){ - if(player.getEquip(1)) return false; + if(player.getEquips(1).length) return false; return event.name!='phase'||game.phaseNumber==0; }, forced:true, @@ -6000,7 +6000,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'phaseZhunbeiBegin'}, filter:function(event,player){ - if(!player.getEquip(1)) return false; + if(!player.getEquips(1).length) return false; return game.hasPlayer(function(current){ return player.inRange(current)&&player.canCompare(current); }); @@ -6052,8 +6052,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } else if(!result.tie){ - var card=player.getEquip(1); - if(card) target.gain(card,player,'give'); + var card=player.getEquips(1); + if(card.length) target.gain(card,player,'give'); } }, mod:{ @@ -6073,7 +6073,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'twjianwei', trigger:{player:'compare',target:'compare'}, filter:function(event,player){ - if(!player.getEquip(1)||player.getAttackRange()<=0) return false; + if(!player.getEquips(1).length||player.getAttackRange()<=0) return false; if(event.player==player) return !event.iwhile; return true; }, @@ -6112,8 +6112,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' if(!result.tie){ if(result.bool){ - var card=player.getEquip(1); - if(card) trigger.player.gain(card,player,'give'); + var card=player.getEquips(1); + if(card.length) trigger.player.gain(card,player,'give'); } else { var num=0; @@ -12160,7 +12160,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ var card=get.cardPile(function(card){ - return card.name=='meiyingqiang'&&card!=player.getEquip(1); + return card.name=='meiyingqiang'&&!player.getEquips(1).contains(card); },'field'); if(card) player.equip(card); } diff --git a/character/xianding.js b/character/xianding.js index 6a666c81f..7e890995a 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -2952,15 +2952,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return lib.filter.filterTarget.apply(this,arguments); }).set('addCount',false).set('source',player).set('prompt2','对除'+get.translation(player)+'外的一名角色使用一张【杀】,并将装备区内的武器牌交给其中一名目标角色;或点击“取消”,令'+get.translation(player)+'视为对你使用一张【杀】,并获得你装备区内的武器牌'); 'step 2' - var card=targets[0].getEquip(1); + var card=targets[0].getEquips(1); if(result.bool){ player.addSkill('dclianji_1'); - if(card&&result.targets.filter(target=>target.isIn()).length>0){ + if(card.length&&result.targets.filter(target=>target.isIn()).length>0){ event.card=card; targets[0].chooseTarget(true,'将'+get.translation(card)+'交给一名目标角色',(card,player,target)=>{ return _status.event.targets.contains(target); }).set('ai',function(target){ - var card=_status.event.getParent().card; + var card=_status.event.getParent().card[0]; return (target.hasSkillTag('nogain')?0:get.attitude(_status.event.player,target))*Math.max(0.1,target.getUseValue(card)); }).set('targets',result.targets); } else event.finish(); @@ -2975,8 +2975,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 4' player.useCard({name:'sha',isCard:true},targets[0],false); 'step 5' - var card=targets[0].getEquip(1); - if(card) targets[0].give(card,player,'give'); + var card=targets[0].getEquips(1); + if(card.length) targets[0].give(card,player,'give'); }, ai:{ order:4, diff --git a/character/yijiang.js b/character/yijiang.js index b876f2ed2..039f82605 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -6231,7 +6231,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var num=Math.min(game.countPlayer(function(current){ return player.inRange(current); - }),player.getEquip(1)?4:2); + }),player.getEquips(1).length?4:2); if(trigger.target.countCards('h')0; }, content:function(){ 'step 0' - var num=1; - var info=get.info(player.getEquip(1)); - if(info&&info.distance&&info.distance.attackFrom){ - num-=info.distance.attackFrom; + var num=0,cards=player.getEquips(1); + for(var card of cards){ + var numz=1; + var info=get.info(card,false); + if(info&&info.distance&&info.distance.attackFrom){ + numz-=info.distance.attackFrom; + } + num+=numz; } if(trigger.player.countCards('h')0); + return event.card.name=='sha'&&(get.color(event.card)=='red'?event.player.getEquips(1).length>0:player.countCards('he')>0); }, direct:true, audio:2, content:function(){ 'step 0' var prompt='弃置一张牌' - if(trigger.player.getEquip(1)) prompt+=(',然后获得'+get.translation(trigger.player)+'装备区中的'+get.translation(trigger.player.getEquip(1))); + if(trigger.player.getEquips(1).length) prompt+=(',然后获得'+get.translation(trigger.player)+'装备区中的'+get.translation(trigger.player.getEquips(1))); var next=player.chooseToDiscard('he',get.prompt('reduodao',trigger.player),prompt); next.logSkill=['reduodao',trigger.player]; next.set('ai',function(card){ - if(!_status.event.getTrigger().player.getEquip(1)) return 0; - if(get.attitude(_status.event.player,_status.event.getTrigger().player)*get.value(_status.event.getTrigger().player.getEquip(1))<=0){ + if(!_status.event.getTrigger().player.getEquips(1).length) return 0; + if(get.attitude(_status.event.player,_status.event.getTrigger().player)*get.value(_status.event.getTrigger().player.getEquips(1))<=0){ return 6-get.value(card); } return 0; }); 'step 1' - if(result.bool&&trigger.player.getEquip(1)){ + if(result.bool&&trigger.player.getEquips(1).length){ if(!result.cards||!result.cards.length) player.logSkill('reduodao',trigger.player); - player.gain(trigger.player.getEquip(1),trigger.player,'give','bySelf'); + player.gain(trigger.player.getEquips(1),trigger.player,'give','bySelf'); } }, }, @@ -11827,7 +11831,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, audio:2, filter:function(event,player){ - if(player.getEquip(2)) return false; + if(!player.hasEmptySlot(2)) return false; return (event.card.name=='sha'&&get.color(event.card)=='black') }, content:function(){ @@ -11836,10 +11840,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target){ - if(player==target&&get.subtype(card)=='equip2'){ + if(player==target&&get.subtypes(card).contains('equip2')){ if(get.equipValue(card)<=8) return 0; } - if(target.getEquip(2)) return; + if(!player.hasEmptySlot(2)) return; if(card.name=='sha'&&get.color(card)=='black') return 'zerotarget'; } } diff --git a/character/yingbian.js b/character/yingbian.js index 5dae2f95e..62ad0489b 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -1945,7 +1945,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', derivation:['cheliji_sichengliangyu','cheliji_tiejixuanyu','cheliji_feilunzhanyu'], filter:function(event,player){ - return !player.getEquip(5)&&player.countCards('he',{color:'black'})>0; + return !player.getEquips(5).length&&player.countCards('he',{color:'black'})>0; }, filterCard:{color:'black'}, position:'he', @@ -2011,7 +2011,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qiangshou:{ mod:{ globalFrom:function(player,target,distance){ - if(player.getEquip(5)) return distance-1; + if(player.getEquips(5).length) return distance-1; } }, }, diff --git a/game/game.js b/game/game.js index 27be2fed2..9b243cd33 100644 --- a/game/game.js +++ b/game/game.js @@ -10703,6 +10703,7 @@ cooperation_use:'戮力', cooperation_use_info:'双方累计使用至少4种花色的牌', charge:'蓄力值', + expandedSlots:'扩展装备栏', }, element:{ content:{ @@ -10782,7 +10783,7 @@ if(!player.expandedSlots[slot]) player.expandedSlots[slot]=0; player.expandedSlots[slot]+=expand; } - player.$syncDisable(); + player.$syncExpand(); }, //选择顶装备要顶的牌 replaceEquip:function(){ @@ -18468,6 +18469,18 @@ isDisabledJudge:function(){ return Boolean(this.storage._disableJudge); }, + //同步显示扩展装备区状态 + $syncExpand:function(map){ + var player=this; + if(!map){ + map=(player.expandedSlots||{}); + } + game.broadcast(function(player,map){ + player.expandedSlots=map; + player.$syncExpand(map); + },player,map); + player.markSkill('expandedSlots'); + }, //同步装备区废除牌显示状态 $syncDisable:function(map){ var player=this; @@ -28871,6 +28884,36 @@ } }, skill:{ + expandedSlots:{ + markimage:'image/card/expandedSlots.png', + intro:{ + markcount:function(storage,player){ + var all=0,storage=player.expandedSlots; + if(!storage) return 0; + for(var key in storage){ + var num=storage[key]; + if(typeof num=='number'&&num>0){ + all+=num; + } + } + return all; + }, + content:function(storage,player){ + storage=player.expandedSlots; + if(!storage) return '当前没有扩展装备栏'; + var keys=Object.keys(storage).sort(); + var str=''; + for(var key of keys){ + var num=storage[key]; + if(typeof num=='number'&&num>0){ + str+='
  • '+get.translation(key)+'栏:'+num+'个
    ' + } + } + if(str.length) return str.slice(0,str.length-4); + return '当前没有扩展装备栏'; + }, + }, + }, charge:{ markimage:'image/card/charge.png', intro:{ @@ -37586,8 +37629,9 @@ var name=arguments[arguments.length-2]; var skills=arguments[arguments.length-1]; if(skills.getSkills){ - if(name!='cardname') skills=skills.getSkills(); - else skills=skills.getSkills(null,false); + //if(name!='cardname') skills=skills.getSkills(); + //else skills=skills.getSkills(null,false); + skills=skills.getSkills(); } skills=skills.concat(lib.skill.global); game.expandSkills(skills); @@ -56709,11 +56753,14 @@ } var value1=get.equipValue(card,target); var value2=0; - var current=target.getEquip(card); - if(current&¤t!=card){ - value2=get.equipValue(current,target); - if(value2>0&&!target.needsToDiscard()&&!get.tag(card,'valueswap')){ - return 0; + if(!player.canEquip(card)){ + if(!player.canEquip(card,true)) return 0; + var current=target.getEquip(card); + if(current&¤t!=card){ + value2=get.equipValue(current,target); + if(value2>0&&!target.needsToDiscard()&&!get.tag(card,'valueswap')){ + return 0; + } } } return Math.max(0,value1-value2)/5; diff --git a/image/card/charge.png b/image/card/charge.png index 1e4e44f8b..5f85f33ab 100644 Binary files a/image/card/charge.png and b/image/card/charge.png differ diff --git a/image/card/expandedSlots.png b/image/card/expandedSlots.png new file mode 100644 index 000000000..e10a41649 Binary files /dev/null and b/image/card/expandedSlots.png differ