diff --git a/character/sp.js b/character/sp.js index 52a61508d..f532a785b 100755 --- a/character/sp.js +++ b/character/sp.js @@ -1557,6 +1557,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.addToExpansion(trigger.cards.filterInD(),'gain2').gaintag.add('olfushi'); }, + marktext:'豕', intro:{ content:'expansion', markcount:'expansion', @@ -1570,35 +1571,53 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wusheng:{ enable:'chooseToUse', filter:function(event,player){ - if(event.olfushi) return false; - return player.getExpansions('olfushi').length; + return player.getExpansions('olfushi').length&&event.filterCard({name:'sha',isCard:true},player,event); }, - filterCard:()=>false, - selectCard:-1, - viewAs:{name:'sha'}, - prompt:'将任意“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】', - precontent:function(){ - 'step 0' - delete event.result.skill; - player.chooseButton([2,Infinity],[ - '###缚豕###
将任意“缚豕”牌置入弃牌堆并摸等量的牌,并选择执行等量项(超过三张默认全部执行)
', - player.getExpansions('olfushi'), - [['额外目标','伤害-1','伤害+1'],'tdnodes'], - ]).set('filterOk',()=>{ + chooseButton:{ + dialog:function(event,player){ + return ui.create.dialog( + '###缚豕###
重铸任意“缚豕”牌,视为使用一张【杀】并执行等量项
', + player.getExpansions('olfushi'), + [['额外目标','伤害-1','伤害+1'],'tdnodes'], + 'hidden' + ); + }, + filter:function(button){ + const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); + if(cards.length>=3&&typeof button.link=='string') return false; + return true; + }, + select:[2,Infinity], + filterOk:()=>{ if(!ui.selected.buttons.length) return false; - var controls=ui.selected.buttons.filter(button=>typeof button.link=='string'); - var cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); - return Math.min(cards.length,3)==controls.length; - }).set('ai',function(button){ - var player=_status.event.player; - var trigger=_status.event.getParent().result; - var targets=game.filterPlayer(target=>{ - return !trigger.targets.contains(target)&&player.canUse(trigger.card,target); + const controls=ui.selected.buttons.filter(button=>typeof button.link=='string'); + const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); + if(cards.length>=3){ + const dialog=get.event().dialog; + if(dialog&&dialog.buttons){ + dialog.buttons.forEach(button=>{ + if(typeof button.link!='string') return; + button.classList.remove('selectable'); + button.classList.remove('selected'); + ui.selected.buttons.remove(button); + }); + } + return true; + } + return cards.length==controls.length; + }, + check:function(button){ + const player=get.player(); + const card=new lib.element.VCard({name:'sha',isCard:true}); + const targets=game.filterPlayer(target=>{ + return player.canUse(card,target); }); - var num1=targets.filter(target=>get.effect(target,trigger.card,player,player)>0).length; - var num2=targets.length-num1; - var list; - var num3=player.getExpansions('olfushi').length; + const num0=targets.filter(target=>get.effect(target,card,player,player)>0).length; + if(num0<=0) return 0; + const num1=Math.max(0,num0-1); + const num2=targets.length-num1; + const num3=player.getExpansions('olfushi').length; + let list; if((num1>0&&num2>0)||(num1==0&&num2==0)){ switch(num3){ case 1: @@ -1628,7 +1647,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else if(num1==0){ switch(num3){ case 1: - list=['伤害-1']; + list=['伤害+1']; break; default: list=['伤害-1','伤害+1']; @@ -1636,37 +1655,59 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } if(typeof button.link=='string'){ - if(list.contains(button.link)) return 114514; + if(list.includes(button.link)) return 114514; return -1; } else{ - var cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); - if(list.length==3||cards.lengthtypeof button.link=='object'); + if(list.length==3&&(player.getHp()<=2||cards.lengthtypeof button=='string'); - var cards=result.links.filter(button=>typeof button=='object'); - player.logSkill('olfushi'); - player.recast(cards); - event.result.card.olfushi_buff=controls; - player.addTempSkill('olfushi_buff'); + }, + backup:function(links,player){ + var cards=links.filter(button=>typeof button=='object'); + var controls=links.filter(button=>typeof button=='string'); + if(!controls.length) controls=['额外目标','伤害-1','伤害+1']; + return { + audio:'olfushi', + selectCard:-1, + position:'x', + cards:cards, + controls:controls, + filterCard:function(card){ + return lib.skill.olfushi_wusheng_backup.cards.includes(card); + }, + viewAs:{ + name:'sha', + isCard:true, + }, + precontent:function(){ + var cards=lib.skill.olfushi_wusheng_backup.cards.slice(); + var controls=lib.skill.olfushi_wusheng_backup.controls.slice(); + player.logSkill('olfushi'); + delete event.result.skill; + event.result.card=new lib.element.VCard(lib.skill.olfushi_wusheng_backup.viewAs); + event.result.cards=[]; + player.recast(cards); + event.result.card.storage.olfushi_buff=controls; + player.addTempSkill('olfushi_buff'); + } + } + }, + prompt:function(links,player){ + let controls=links.filter(button=>typeof button=='string'); + if(!controls.length) controls=['额外目标','伤害-1','伤害+1']; + return `选择【杀】的目标(${controls.join('、')})`; } - else{ - event.getParent().olfushi=true; - event.getParent().goto(0); - return; - } - }, - order:function(item,player){ - return get.order({name:'sha'})+0.1; }, ai:{ + order:function(item,player){ + return get.order({name:'sha'})+0.1; + }, + result:{player:1}, respondSha:true, skillTagFilter:function(player,tag,arg){ - if(arg=='respond'||_status.event.olfushi) return false; + if(arg=='respond') return false; if(!player.getExpansions('olfushi').length) return false; }, }, @@ -1675,37 +1716,39 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, trigger:{player:['useCard2','useCardToPlayered']}, filter:function(event,player,name){ - if(!event.card.olfushi_buff) return false; + if(!event.card.storage||!event.card.storage.olfushi_buff) return false; if(name=='useCard2') return true; - return event.getParent().triggeredTargets3.length==event.targets.length&&event.card.olfushi_buff.length>1&&event.card.olfushi_buff.contains('伤害-1')&&!event.targets.some(target=>!event.targets.contains(target.getPrevious())&&!event.targets.contains(target.getNext())); + return event.getParent().triggeredTargets3.length==event.targets.length&&event.card.storage.olfushi_buff.length>1&&event.card.storage.olfushi_buff.includes('伤害-1')&&!event.targets.some(target=>!event.targets.includes(target.getPrevious())&&!event.targets.includes(target.getNext())); }, forced:true, popup:false, content:function(){ 'step 0' if(event.triggername=='useCardToPlayered'){ - trigger.getParent().addCount=false; - if(player.stat[player.stat.length-1].card.sha>0){ - player.stat[player.stat.length-1].card.sha--; + if(trigger.getParent().addCount!==false){ + trigger.getParent().addCount=false; + if(player.stat[player.stat.length-1].card.sha>0){ + player.stat[player.stat.length-1].card.sha--; + } } game.log(trigger.card,'不计入次数'); event.finish(); return; } - var list=trigger.card.olfushi_buff; + var list=trigger.card.storage.olfushi_buff; event.list=list; - if(list.contains('额外目标')&&game.hasPlayer(target=>{ - return !trigger.targets.contains(target)&&player.canUse(trigger.card,target); - })){ - player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return !trigger.targets.contains(target)&&player.canUse(trigger.card,target); - },true).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target); - }); - } - else event._result={bool:false}; + var canBeAddedTargets=game.filterPlayer(target=>{ + return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); + }); + if(!list.includes('额外目标')||!canBeAddedTargets.length) event._result={bool:false}; + else if(canBeAddedTargets.length==1) event._result={bool:true,targets:canBeAddedTargets}; + else player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',function(card,player,target){ + var trigger=_status.event.getTrigger(); + return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); + },true).set('ai',function(target){ + var player=_status.event.player; + return get.attitude(player,target); + }); 'step 1' if(result.bool){ var targets=result.targets.sortBySeat(); @@ -1714,51 +1757,51 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.log(targets,'成为了',trigger.card,'的额外目标'); } 'step 2' - if(event.list.contains('伤害-1')){ - player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害-1的目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return trigger.targets.contains(target); - },true).set('ai',function(target){ - var player=_status.event.player; - return get.attitude(player,target); - }); - } - else event._result={bool:false}; + if(!event.list.includes('伤害-1')) event._result={bool:false}; + else if(trigger.targets.length==1) event._result={bool:true,targets:trigger.targets.slice()}; + else player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害-1的目标',function(card,player,target){ + var trigger=_status.event.getTrigger(); + return trigger.targets.contains(target); + },true).set('ai',function(target){ + var player=_status.event.player; + return get.attitude(player,target); + }); 'step 3' if(result.bool){ var target=result.targets[0]; player.line(target); - game.log(target,'受到',trigger.card,'的伤害-1'); - target.addTempSkill('olfushi_buff2'); - target.markAuto('olfushi_buff2',[trigger.card]); + game.log(trigger.card,'对',target,'的伤害-1'); + player.addTempSkill('olfushi_buff2'); + player.initStorage('olfushi_buff2',[]); + player.getStorage('olfushi_buff2').push([target,trigger.card]); } 'step 4' - if(event.list.contains('伤害+1')){ - player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害+1的目标',function(card,player,target){ - var trigger=_status.event.getTrigger(); - return trigger.targets.contains(target); - },true).set('ai',function(target){ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - } - else event.finish(); + if(!event.list.contains('伤害+1')) event.finish(); + else if(trigger.targets.length==1) event._result={bool:true,targets:trigger.targets.slice()}; + else player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害+1的目标',function(card,player,target){ + var trigger=_status.event.getTrigger(); + return trigger.targets.contains(target); + },true).set('ai',function(target){ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); 'step 5' if(result.bool){ var target=result.targets[0]; player.line(target); - game.log(target,'受到',trigger.card,'的伤害+1'); - target.addTempSkill('olfushi_buff3'); - target.markAuto('olfushi_buff3',[trigger.card]); + game.log(trigger.card,'对',target,'的伤害+1'); + player.addTempSkill('olfushi_buff3'); + player.initStorage('olfushi_buff3',[]); + player.getStorage('olfushi_buff3').push([target,trigger.card]); } }, }, buff2:{ charlotte:true, onremove:true, - trigger:{player:'damageBegin2'}, + trigger:{source:'damageBegin2'}, filter:function(event,player){ - return event.card&&player.getStorage('olfushi_buff2').contains(event.card); + return event.card&&player.getStorage('olfushi_buff2').some(info=>info[0]==event.player&&info[1]==event.card); }, forced:true, popup:false, @@ -1782,9 +1825,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ buff3:{ charlotte:true, onremove:true, - trigger:{player:'damageBegin1'}, + trigger:{source:'damageBegin1'}, filter:function(event,player){ - return event.card&&player.getStorage('olfushi_buff3').contains(event.card); + return event.card&&player.getStorage('olfushi_buff3').some(info=>info[0]==event.player&&info[1]==event.card); }, forced:true, popup:false, @@ -1792,6 +1835,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.num++; }, }, + wusheng_backup:{}, }, }, oldongdao:{ @@ -26410,7 +26454,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skill_feiyi_B_info:'每回合每项限一次,当你的手牌数变为1后,你可以展示此唯一手牌A并摸一张牌,然后你选择一项:①本回合使用点数大于A的点数的牌额外结算一次;②本回合使用点数小于A的点数的牌额外结算一次。', lvboshe:'吕伯奢', olfushi:'缚豕', - olfushi_info:'①一名角色使用【杀】结算完毕后,若你与其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②你可以将任意张“缚豕“牌置入弃牌堆并摸等量的牌,视为使用一张具有以下等同于置入弃牌堆牌数量的效果的【杀】:1.此【杀】额外指定一个目标;2.此【杀】对其中一个目标角色造成的伤害-1;3.此【杀】对其中一个目标造成的伤害+1。且此【杀】指定最后一个目标后,若此【杀】选择的效果和选择的目标均相邻,则此【杀】不计入次数限制。', + olfushi_info:'①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以重铸任意张“缚豕”牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。', oldongdao:'东道', oldongdao_info:'农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。', zhangyan:'张燕', diff --git a/game/game.js b/game/game.js index 3d9f26de2..b09645294 100644 --- a/game/game.js +++ b/game/game.js @@ -15510,6 +15510,7 @@ next.set('ai',info.chooseButton.check||function(){return 1;}); next.set('filterButton',info.chooseButton.filter||function(){return true;}); next.set('selectButton',info.chooseButton.select||1); + next.set('filterOk',info.chooseButton.filterOk||(()=>true)); if(event.id) next._parent_id=event.id; next.type='chooseToUse_button'; } @@ -15693,6 +15694,7 @@ next.set('ai',info.chooseButton.check||function(){return 1;}); next.set('filterButton',info.chooseButton.filter||function(){return true;}); next.set('selectButton',info.chooseButton.select||1); + next.set('filterOk',info.chooseButton.filterOk||(()=>true)); } event.buttoned=event.result.skill; }