From 699d11f99a43d1412b2e4d8c354c54178f267fd7 Mon Sep 17 00:00:00 2001 From: Tipx-L <138244655+Tipx-L@users.noreply.github.com> Date: Tue, 29 Aug 2023 00:14:15 -0700 Subject: [PATCH] Yingbian. --- card/guozhan.js | 23 +--- card/standard.js | 101 ++-------------- card/yingbian.js | 290 +++++++++------------------------------------ character/diy.js | 23 +--- character/extra.js | 213 ++++----------------------------- game/game.js | 232 +++++++++++++++++++++++++++++++++++- 6 files changed, 322 insertions(+), 560 deletions(-) diff --git a/card/guozhan.js b/card/guozhan.js index a8fea473c..f3deb0b68 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -455,28 +455,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return target!=player&&(get.mode()!='guozhan'||_status.mode=='yingbian'||_status.mode=='free'||target.countCards('e')>0); }, enable:true, - yingbian_prompt:function(card){ - var str=''; - if(get.cardtag(card,'yingbian_all')){ - str+='此牌的效果改为依次执行所有选项'; - } - if(!str.length||get.cardtag(card,'yingbian_add')){ - if(str.length) str+=';'; - str+='当你使用此牌选择目标后,你可为此牌增加一个目标'; - } - return str; - }, - yingbian:function(event){ - var card=event.card,bool=false; - if(get.cardtag(card,'yingbian_all')){ - bool=true; - card.yingbian_all=true; - game.log(card,'执行所有选项'); - } - if(!bool||get.cardtag(card,'yingbian_add')){ - event.yingbian_addTarget=true; - } - }, + defaultYingbianEffect:'add', content:function(){ 'step 0' if(event.card.yingbian_all){ diff --git a/card/standard.js b/card/standard.js index e18416e8e..5dd062144 100644 --- a/card/standard.js +++ b/card/standard.js @@ -100,39 +100,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(lib.linked.contains(card.nature)) return '出牌阶段,对你攻击范围内的一名角色使用。其须使用一张【闪】,否则你对其造成1点'+get.translation(card.nature)+'属性伤害。'; return '出牌阶段,对你攻击范围内的一名角色使用。其须使用一张【闪】,否则你对其造成1点伤害。'; }, - yingbian_prompt:function(card){ - var str=''; - if(get.cardtag(card,'yingbian_hit')){ - str+='此牌不可被响应'; - } - if(get.cardtag(card,'yingbian_damage')){ - if(str.length) str+=';'; - str+='此牌的伤害值基数+1'; - } - if(!str.length||get.cardtag(card,'yingbian_add')){ - if(str.length) str+=';'; - str+='当你使用此牌选择目标后,你可为此牌增加一个目标'; - } - return str; - }, - yingbian:function(event){ - var card=event.card,bool=false; - if(get.cardtag(card,'yingbian_hit')){ - bool=true; - event.directHit.addArray(game.players); - game.log(card,'不可被响应'); - } - if(get.cardtag(card,'yingbian_damage')){ - bool=true; - if(typeof event.baseDamage!='number') event.baseDamage=1; - event.baseDamage++; - game.log(event.card,'的伤害值基数+1'); - } - if(!bool||get.cardtag(card,'yingbian_add')){ - event.yingbian_addTarget=true; - } - }, - yingbian_tags:['hit','damage','add'], + defaultYingbianEffect:'add', filterTarget:function(card,player,target){return player!=target}, content:function(){ "step 0" @@ -387,27 +355,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ cardcolor:'red', notarget:true, nodelay:true, - yingbian_prompt:function(card){ - var str=''; - if(get.cardtag(card,'yingbian_gain')){ - str+='当你声明使用此牌时,你获得此牌响应的目标牌'; - } - if(!str.length||get.cardtag(card,'yingbian_draw')){ - if(str.length) str+=';'; - str+='当你声明使用此牌时,你摸一张牌'; - } - return str; - }, - yingbian_tags:['gain','draw'], - yingbian:function(event){ - var bool=false; - if(get.cardtag(event.card,'yingbian_gain')){ - bool=true; - var cardx=event.respondTo; - if(cardx&&cardx[1]&&cardx[1].cards&&cardx[1].cards.filterInD('od').length) event.player.gain(cardx[1].cards.filterInD('od'),'gain2','log'); - } - if(!bool||get.cardtag(event.card,'yingbian_draw')) event.player.draw(); - }, + defaultYingbianEffect:'draw', content:function(){ event.result='shaned'; event.getParent().delayx=false; @@ -889,11 +837,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ selectTarget:-1, cardcolor:'red', reverseOrder:true, - yingbian_prompt:'当你使用此牌选择目标后,你可为此牌减少一个目标', - yingbian_tags:['remove'], - yingbian:function(event){ - event.yingbian_removeTarget=true; - }, + defaultYingbianEffect:'remove', filterTarget:function(card,player,target){ //return target.hp0; }, - yingbian_tags:['all','hit','add'], - yingbian_prompt:function(card){ - var str=''; - if(get.cardtag(card,'yingbian_all')){ - str+='此牌的效果改为依次执行所有选项'; - } - if(get.cardtag(card,'yingbian_hit')){ - if(str.length) str+=';'; - str+='此牌不可被响应'; - } - if(!str.length||get.cardtag(card,'yingbian_add')){ - if(str.length) str+=';'; - str+='当你使用此牌选择目标后,你可为此牌增加一个目标'; - } - return str; - }, - yingbian:function(event){ - var card=event.card,bool=false; - if(get.cardtag(card,'yingbian_all')){ - bool=true; - card.yingbian_all=true; - game.log(card,'执行所有选项'); - } - if(get.cardtag(card,'yingbian_hit')){ - bool=true; - event.directHit.addArray(game.players); - game.log(card,'不可被响应'); - } - if(!bool||get.cardtag(card,'yingbian_add')){ - event.yingbian_addTarget=true; - } - }, + defaultYingbianEffect:'add', content:function(){ var dist=get.distance(player,target); if(dist>1||card.yingbian_all) player.discardPlayerCard(target,'hej',true); @@ -174,11 +143,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ return target!=player&&target.countCards('h')>0; }, - yingbian_prompt:'当你使用此牌选择目标后,你可为此牌增加一个目标', - yingbian_tags:['add'], - yingbian:function(event){ - event.yingbian_addTarget=true; - }, + defaultYingbianEffect:'add', content:function(){ 'step 0' if(player.isDead()||!target.countCards('h')){ @@ -399,27 +364,20 @@ game.import('card',function(lib,game,ui,get,ai,_status){ global:'heiguangkai_ai', }, tongque_skill:{ - trigger:{player:'useCard1'}, + trigger:{player:'useCardBegin'}, equipSkill:true, forced:true, - filter:function(event,player){ - return !event.card.yingbian&&get.is.yingbian(event.card)&&player.getHistory('useCard',function(evt){ - return get.is.yingbian(evt.card) - }).indexOf(event)==0; - }, - content:function(){ - trigger.card.yingbian=true; - var info=get.info(trigger.card); - if(info&&info.yingbian) info.yingbian(trigger); - player.addTempSkill('yingbian_changeTarget'); - }, + filter:(event,player)=>get.is.yingbianConditional(event.card)&&!player.hasHistory('useCard',evt=>get.is.yingbianConditional(evt.card)), + content:()=>{ + trigger.forceYingbian=true; + } }, tianjitu_skill:{ audio:true, trigger:{player:['equipBegin','loseBegin']}, forced:true, equipSkill:true, - filter:(event,player,name)=>name=='equipBegin'?event.card.name=='tianjitu'&&player.hasCard(card=>card!=event.card):event.cards.some(value=>value.name=='tianjitu')&&player.countCards('h')<5, + filter:(event,player,name)=>name=='equipBegin'?event.card.name=='tianjitu'&&player.hasCard(card=>card!=event.card):event.cards.some(value=>get.position(value)=='e'&&value.name=='tianjitu')&&player.countCards('h')<5, content:()=>{ if(event.triggername=='loseBegin') player.drawTo(5); else player.chooseToDiscard(true,card=>card!=_status.event.getTrigger().card,'he'); @@ -485,195 +443,62 @@ game.import('card',function(lib,game,ui,get,ai,_status){ firstDo:true, ruleSkill:true, forceLoad:true, - filter:function(event,player){ + filter:(event,player)=>{ if(event.card.yingbian) return false; - var bool=player.hasSkillTag('forceYingbian'); - var card=event.card; - if(get.cardtag(card,'yingbian_kongchao')&&(!player.countCards('h')||bool)) return true; - if(get.cardtag(card,'yingbian_canqu')&&(player.hp==1||bool)) return true; - if(get.cardtag(card,'yingbian_fujia')&&(player.isMaxHandcard()||bool)) return true; - if(get.cardtag(card,'yingbian_zhuzhan')) return true; - return false; + const temporaryYingbian=event.temporaryYingbian||[],card=event.card; + if(temporaryYingbian.includes('force')||get.cardtag(card,'yingbian_force')) return true; + const forceYingbian=event.forceYingbian||player.hasSkillTag('forceYingbian'); + for(const [key,value] of lib.yingbian.condition.simple){ + if((temporaryYingbian.includes(key)||get.cardtag(card,`yingbian_${key}`))&&(forceYingbian||value(event))) return true; + } + const complexYingbianConditions=get.complexYingbianConditions(); + return temporaryYingbian.some(value=>complexYingbianConditions.includes(value))||get.is.complexlyYingbianConditional(card); }, - content:function(){ + content:()=>{ 'step 0' - var card=trigger.card; - event.card=card; - var bool=false; - if(get.cardtag(card,'yingbian_kongchao')&&!player.countCards('h')){ - player.popup('空巢','soil'); - bool=true; + event.card=trigger.card; + event.temporaryYingbian=trigger.temporaryYingbian||[]; + var yingbianConditionSatisfied=false; + for(var [key,value] of lib.yingbian.condition.simple){ + if(!event.temporaryYingbian.includes(key)&&!get.cardtag(event.card,`yingbian_${key}`)||!value(trigger)) continue; + player.popup(`yingbian_${key}_tag`,lib.yingbian.condition.color.get(key)); + if(!yingbianConditionSatisfied) yingbianConditionSatisfied=true; } - else if(get.cardtag(card,'yingbian_canqu')&&player.hp==1){ - player.popup('残躯','fire'); - bool=true; + if(event.temporaryYingbian.includes('force')||get.cardtag(event.card,'yingbian_force')||trigger.forceYingbian||player.hasSkillTag('forceYingbian')){ + player.popup('yingbian_force_tag',lib.yingbian.condition.color.get('force')); + if(!yingbianConditionSatisfied) yingbianConditionSatisfied=true; } - else if(get.cardtag(card,'yingbian_fujia')&&player.isMaxHandcard()){ - player.popup('富甲','orange'); - bool=true; - } - else if(player.hasSkillTag('forceYingbian')){ - player.popup('应变','metal'); - bool=true; - } - if(bool){ - game.log(player,'触发了',card,'的应变条件'); - event.goto(10); + if(yingbianConditionSatisfied){ + game.log(player,'触发了',event.card,'的应变条件'); + event.goto(4); } + else if((event.num=0)>=(event.yingbianConditions=get.complexYingbianConditions()).length) event.finish(); 'step 1' - event._global_waiting=true; - event.send=function(player,card,source,targets,id,id2,skillState){ - if(skillState){ - player.applySkills(skillState); - } - var type=get.type2(card); - var str=get.translation(source); - if(targets&&targets.length){ - str+='对'; - str+=get.translation(targets); - } - str+='使用了'; - var next=player.chooseCard({ - filterCard:function(card){ - return get.type2(card)==type&&lib.filter.cardDiscardable.apply(this,arguments); - }, - prompt:str+=(get.translation(card)+',是否弃置一张'+get.translation(type)+'为其助战?'), - position:'h', - _global_waiting:true, - id:id, - id2:id2, - ai:function(cardx){ - var info=get.info(card); - if(info&&info.ai&&info.ai.yingbian){ - var ai=info.ai.yingbian(card,source,targets,player); - if(!ai) return 0; - return ai-get.value(cardx); - } - else if(get.attitude(player,source)<=0) return 0; - return 5-get.value(cardx); - }, - }); - if(game.online){ - _status.event._resultid=id; - game.resume(); - } - }; + var yingbianCondition=event.yingbianConditions[num]; + if(event.temporaryYingbian.includes(yingbianCondition)||get.cardtag(card,`yingbian_${yingbianCondition}`)) lib.yingbian.condition.complex.get(yingbianCondition)(trigger); + else event.goto(3); 'step 2' - var type=get.type2(card); - var list=game.filterPlayer(function(current){ - if(current==player) return false; - if(!current.countCards('h')) return false; - return _status.connectMode||current.countCards('h',function(cardx){ - return get.type2(cardx)==type; - }) - }); - event.list=list; - event.id=get.id(); - list.sort(function(a,b){ - return get.distance(event.source,a,'absolute')-get.distance(event.source,b,'absolute'); - }); + if(result.bool) event.goto(4); 'step 3' - if(event.list.length==0){ - event.finish(); - return; - } - else if(_status.connectMode&&(event.list[0].isOnline()||event.list[0]==game.me)){ - event.goto(5); - } - else{ - event.current=event.list.shift(); - event.send(event.current,event.card,player,trigger.targets,event.id,trigger.parent.id); - } - 'step 4' - if(result.bool){ - event.zhuzhanresult=event.current; - event.zhuzhanresult2=result; - if(event.current!=game.me) game.delayx(); - event.goto(9); - } - else{ - event.goto(3); - } - 'step 5' - var id=event.id; - var sendback=function(result,player){ - if(result&&result.id==id&&!event.zhuzhanresult&&result.bool){ - event.zhuzhanresult=player; - event.zhuzhanresult2=result; - game.broadcast('cancel',id); - if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused){ - return (function(){ - event.resultOL=_status.event.resultOL; - ui.click.cancel(); - if(ui.confirm) ui.confirm.close(); - }); - } - } - else{ - if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused){ - return (function(){ - event.resultOL=_status.event.resultOL; - }); - } - } - }; - - var withme=false; - var withol=false; - var list=event.list; - for(var i=0;i0; - }, - content:function(){ - if(!trigger.card.yingbian){ - trigger.card.yingbian=true; - var info=get.info(trigger.card); - if(info&&info.yingbian) info.yingbian(trigger); - player.addTempSkill('yingbian_changeTarget'); - } - }, + filter:event=>event.card.isCard&&event.cards.some(value=>value.hasGaintag('asara_yingwei')), + content:()=>{ + trigger.forceYingbian=true; + } }, yukito_kongwu:{ enable:'phaseUse', diff --git a/character/extra.js b/character/extra.js index d6246f22b..01eb54699 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1010,9 +1010,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else if(lib.translate[name+'_info']){ str+=(''+lib.translate[name+'_info']+'|'); } - if(lib.card[name].yingbian_prompt&&get.is.yingbian(node)){ - if(typeof lib.card[name].yingbian_prompt=='function') str+=('应变:'+lib.card[name].yingbian_prompt(node)+'|'); - else str+=('应变:'+lib.card[name].yingbian_prompt+'|'); + if(get.is.yingbianConditional(node)){ + const yingbianEffects=get.yingbianEffects(node); + if(!yingbianEffects.length){ + const defaultYingbianEffect=get.defaultYingbianEffect(node); + if(lib.yingbian.prompt.has(defaultYingbianEffect)) yingbianEffects.push(defaultYingbianEffect); + } + if(yingbianEffects.length) str+=`应变:${yingbianEffects.map(value=>lib.yingbian.prompt.get(value)).join(';')}|`; } return str; }, @@ -2337,199 +2341,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ group:'hina_shenshi_yingbian', }, hina_shenshi_yingbian:{ - trigger:{player:'useCard1'}, + trigger:{player:'useCardBegin'}, forced:true, - filter:function(event,player){ - return event.cards.length==1&&!event.card.yingbian&&player.hasHistory('lose',function(evt){ - if(evt.getParent()!=event) return false; - for(var i in evt.gaintag_map){ - if(evt.gaintag_map[i].contains('hina_shenshi')) return true; - } - return false; - })&&Array.isArray(get.info(event.card).yingbian_tags); - }, - content:function(){ - if(!trigger.card.yingbian){ - trigger.card.yingbian=true; - var info=get.info(trigger.card); - trigger.card.cardtags=info.yingbian_tags.map(function(i){ - return 'yingbian_'+i; - }); - if(info&&info.yingbian) info.yingbian(trigger); - player.addTempSkill('yingbian_changeTarget'); - } - }, + filter:event=>event.card.isCard&&event.cards.some(value=>value.hasGaintag('hina_shenshi')), + content:()=>{ + if(!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian=[]; + trigger.temporaryYingbian.add('force'); + trigger.temporaryYingbian.addArray(get.yingbianEffects()); + } }, hina_xingzhi:{ groupSkill:true, - trigger:{player:'useCard1'}, + trigger:{player:'useCardBegin'}, usable:1, - filter:function(event,player){ - return player.group=='key'&&!event.card.yingbian&&Array.isArray(get.info(event.card).yingbian_tags); - }, - content:function(){ - 'step 0' - var info=get.info(trigger.card); - trigger.card.cardtags=info.yingbian_tags.map(function(i){ - return 'yingbian_'+i; - }); - event.card=trigger.card; - event._global_waiting=true; - event.send=function(player,card,source,targets,id,id2,skillState){ - if(skillState){ - player.applySkills(skillState); - } - var type=get.type2(card); - var str=get.translation(source); - if(targets&&targets.length){ - str+='对'; - str+=get.translation(targets); - } - str+='使用了'; - var next=player.chooseCard({ - filterCard:function(card){ - return get.type2(card)==type&&lib.filter.cardDiscardable.apply(this,arguments); - }, - prompt:str+=(get.translation(card)+',是否弃置一张'+get.translation(type)+'为其助战?'), - position:'h', - _global_waiting:true, - id:id, - id2:id2, - ai:function(cardx){ - var info=get.info(card),num=0; - if(info&&info.ai&&info.ai.yingbian){ - var ai=info.ai.yingbian(card,source,targets,player); - if(ai) num=ai; - } - if(get.attitude(player,source)<=0) return 0; - return Math.max(ai,6)-get.value(cardx); - }, - }); - if(game.online){ - _status.event._resultid=id; - game.resume(); - } - }; - 'step 1' - var type=get.type2(card); - var list=game.filterPlayer(function(current){ - if(current==player) return false; - if(!current.countCards('h')) return false; - return _status.connectMode||current.countCards('h',function(cardx){ - return get.type2(cardx)==type; - }) - }); - event.list=list; - event.id=get.id(); - list.sort(function(a,b){ - return get.distance(event.source,a,'absolute')-get.distance(event.source,b,'absolute'); - }); - 'step 2' - if(event.list.length==0){ - event.finish(); - return; - } - else if(_status.connectMode&&(event.list[0].isOnline()||event.list[0]==game.me)){ - event.goto(4); - } - else{ - event.current=event.list.shift(); - event.send(event.current,event.card,player,trigger.targets,event.id,trigger.parent.id); - } - 'step 3' - if(result.bool){ - event.zhuzhanresult=event.current; - event.zhuzhanresult2=result; - if(event.current!=game.me) game.delayx(); - event.goto(8); - } - else{ - event.goto(2); - } - 'step 4' - var id=event.id; - var sendback=function(result,player){ - if(result&&result.id==id&&!event.zhuzhanresult&&result.bool){ - event.zhuzhanresult=player; - event.zhuzhanresult2=result; - game.broadcast('cancel',id); - if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused){ - return (function(){ - event.resultOL=_status.event.resultOL; - ui.click.cancel(); - if(ui.confirm) ui.confirm.close(); - }); - } - } - else{ - if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused){ - return (function(){ - event.resultOL=_status.event.resultOL; - }); - } - } - }; - - var withme=false; - var withol=false; - var list=event.list; - for(var i=0;iplayer.group=='key', + content:()=>{ + if(!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian=[]; + trigger.temporaryYingbian.add('zhuzhan'); + trigger.temporaryYingbian.addArray(get.yingbianEffects()); + trigger.afterYingbianZhuzhan=target=>target.draw(2); + } }, yingba:{ audio:2, diff --git a/game/game.js b/game/game.js index 3cd762400..20e371233 100644 --- a/game/game.js +++ b/game/game.js @@ -59,6 +59,7 @@ yingbian_kongchao:[], yingbian_fujia:[], yingbian_canqu:[], + yingbian_force:[] }, renku:[], prehidden_skills:[], @@ -149,6 +150,170 @@ }, } }, + yingbian:{ + condition:{ + color:new Map([ + ['zhuzhan','wood'], + ['kongchao','soil'], + ['fujia','orange'], + ['canqu','fire'], + ['force','metal'] + ]), + complex:new Map([ + ['zhuzhan',event=>{ + const yingbianZhuzhan=game.createEvent('yingbianZhuzhan'); + yingbianZhuzhan.player=event.player; + yingbianZhuzhan.card=event.card; + yingbianZhuzhan._trigger=event; + yingbianZhuzhan.afterYingbianZhuzhan=event.afterYingbianZhuzhan; + yingbianZhuzhan.setContent(()=>{ + 'step 0' + event._global_waiting=true; + event.send=(player,card,source,targets,id,id2,skillState)=>{ + if(skillState) player.applySkills(skillState); + var type=get.type2(card),str=get.translation(source); + if(targets&&targets.length) str+=`对${get.translation(targets)}`; + str+=`使用了${get.translation(card)},是否弃置一张${get.translation(type)}为其助战?`; + player.chooseCard({ + filterCard:(card,player)=>get.type2(card)==type&&lib.filter.cardDiscardable(card,player), + prompt:str, + position:'h', + _global_waiting:true, + id:id, + id2:id2, + ai:cardx=>{ + var info=get.info(card); + if(info&&info.ai&&info.ai.yingbian){ + var ai=info.ai.yingbian(card,source,targets,player); + if(!ai) return 0; + return ai-get.value(cardx); + } + else if(get.attitude(player,source)<=0) return 0; + return 5-get.value(cardx); + } + }); + if(!game.online) return; + _status.event._resultid=id; + game.resume(); + }; + 'step 1' + var type=get.type2(card); + event.list=game.filterPlayer(current=>current!=player&¤t.countCards('h')&&(_status.connectMode||current.hasCard(cardx=>get.type2(cardx)==type,'h'))).sortBySeat(_status.currentPhase||player); + event.id=get.id(); + 'step 2' + if(!event.list.length) event.finish(); + else if(_status.connectMode&&(event.list[0].isOnline()||event.list[0]==game.me)) event.goto(4); + else event.send(event.current=event.list.shift(),event.card,player,trigger.targets,event.id,trigger.parent.id); + 'step 3' + if(result.bool){ + event.zhuzhanresult=event.current; + event.zhuzhanresult2=result; + if(event.current!=game.me) game.delayx(); + event.goto(8); + } + else event.goto(2); + 'step 4' + var id=event.id,sendback=(result,player)=>{ + if(result&&result.id==id&&!event.zhuzhanresult&&result.bool){ + event.zhuzhanresult=player; + event.zhuzhanresult2=result; + game.broadcast('cancel',id); + if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused) return ()=>{ + event.resultOL=_status.event.resultOL; + ui.click.cancel(); + if(ui.confirm) ui.confirm.close(); + }; + } + else if(_status.event.id==id&&_status.event.name=='chooseCard'&&_status.paused) return ()=>event.resultOL=_status.event.resultOL; + },withme=false,withol=false,list=event.list; + for(var i=0;i{ + if(value!=player) value.showTimer(); + }); + event.withol=withol; + 'step 5' + if(!result||!result.bool||event.zhuzhanresult) return; + game.broadcast('cancel',event.id); + event.zhuzhanresult=game.me; + event.zhuzhanresult2=result; + 'step 6' + if(event.withol&&!event.resultOL) game.pause(); + 'step 7' + game.players.forEach(value=>value.hideTimer()); + 'step 8' + if(event.zhuzhanresult){ + var target=event.zhuzhanresult; + target.line(player,'green'); + target.discard(event.zhuzhanresult2.cards).discarder=target; + if(typeof event.afterYingbianZhuzhan=='function') event.afterYingbianZhuzhan(target); + var yingbianCondition=event.name.slice(8).toLowerCase(),yingbianConditionTag=`yingbian_${yingbianCondition}_tag`; + target.popup(yingbianConditionTag,lib.yingbian.condition.color.get(yingbianCondition)); + game.log(target,'响应了',player,'发起的',yingbianConditionTag); + target.addExpose(0.2); + event.result={ + bool:true + } + } + else event.result={ + bool:false + }; + }); + return yingbianZhuzhan; + }] + ]), + simple:new Map([ + ['kongchao',event=>!event.player.countCards('h')], + ['fujia',event=>event.player.isMaxHandcard()], + ['canqu',event=>event.player.getHp()==1] + ]) + }, + effect:new Map([ + ['add',event=>event.yingbian_addTarget=true], + ['remove',event=>event.yingbian_removeTarget=true], + ['damage',event=>{ + if(typeof event.baseDamage!='number') event.baseDamage=1; + event.baseDamage++; + game.log(event.card,'的伤害值基数+1'); + }], + ['draw',event=>event.player.draw()], + ['gain',event=>{ + const cardx=event.respondTo; + if(cardx&&cardx[1]&&cardx[1].cards&&cardx[1].cards.filterInD('od').length) event.player.gain(cardx[1].cards.filterInD('od'),'gain2','log'); + }], + ['hit',event=>{ + event.directHit.addArray(game.players).addArray(game.dead); + game.log(event.card,'不可被响应'); + }], + ['all',event=>{ + const card=event.card; + card.yingbian_all=true; + game.log(card,'执行所有选项'); + }] + ]), + prompt:new Map([ + ['add','当你使用此牌选择目标后,你可为此牌增加一个目标'], + ['remove','当你使用此牌选择目标后,你可为此牌减少一个目标'], + ['damage','此牌的伤害值基数+1'], + ['draw','当你声明使用此牌时,你摸一张牌'], + ['gain','当你声明使用此牌时,你获得此牌响应的目标牌'], + ['hit','此牌不可被响应'], + ['all','此牌的效果改为依次执行所有选项'] + ]) + }, characterDialogGroup:{ '收藏':function(name,capt){ return lib.config.favouriteCharacter.contains(name)?capt:null; @@ -31326,6 +31491,13 @@ ], }; var game={ + //Yingbian + //应变 + setYingbianConditionColor:(yingbianCondition,color)=>game.broadcastAll((yingbianCondition,color)=>lib.yingbian.condition.color.set(yingbianCondition,color),yingbianCondition,color), + setComplexYingbianCondition:(yingbianCondition,condition)=>game.broadcastAll((yingbianCondition,condition)=>lib.yingbian.condition.complex.set(yingbianCondition,condition),yingbianCondition,condition), + setSimpleYingbianCondition:(yingbianCondition,condition)=>game.broadcastAll((yingbianCondition,condition)=>lib.yingbian.condition.simple.set(yingbianCondition,condition),yingbianCondition,condition), + setYingbianEffect:(yingbianEffect,effect)=>game.broadcastAll((yingbianEffect,effect)=>lib.yingbian.effect.set(yingbianEffect,effect),yingbianEffect,effect), + setYingbianPrompt:(yingbian,prompt)=>game.broadcastAll((yingbian,prompt)=>lib.yingbian.prompt.set(yingbian,prompt),yingbian,prompt), //Add a background music to the config option //在设置选项中添加一首背景音乐 addBackgroundMusic:(link,musicName,aozhan)=>{ @@ -52674,6 +52846,31 @@ }, }; var get={ + //Yingbian + //应变 + //Get the Yingbian conditions (of the card) + //获取(此牌的)应变条件 + yingbianConditions:card=>get.complexYingbianConditions(card).concat(get.simpleYingbianConditions(card)), + complexYingbianConditions:card=>{ + const complexYingbianConditions=Array.from(lib.yingbian.condition.complex.keys()); + return card?complexYingbianConditions.filter(value=>get.cardtag(card,`yingbian_${value}`)):complexYingbianConditions; + }, + simpleYingbianConditions:card=>{ + const simpleYingbianConditions=Array.from(lib.yingbian.condition.simple.keys()) + return card?simpleYingbianConditions.filter(value=>get.cardtag(card,`yingbian_${value}`)):simpleYingbianConditions; + }, + //Get the Yingbian effects (of the card) + //获取(此牌的)应变效果 + yingbianEffects:card=>{ + const yingbianEffects=Array.from(lib.yingbian.effect.keys()); + return card?yingbianEffects.filter(value=>get.cardtag(card,`yingbian_${value}`)):yingbianEffects; + }, + //Get the default Yingbian effect of the card + //获取此牌的默认应变效果 + defaultYingbianEffect:card=>{ + const info=get.info(card); + return info&&info.defaultYingbianEffect||null; + }, //优先度判断 priority:function(skill){ const info=get.info(skill); @@ -52871,9 +53068,30 @@ } return false; }, - yingbian:function(node){ - return get.cardtag(node,'yingbian_zhuzhan')||get.cardtag(node,'yingbian_fujia')||get.cardtag(node,'yingbian_canqu')||get.cardtag(node,'yingbian_kongchao'); + //Check if the card has a Yingbian condition + //检测此牌是否具有应变条件 + yingbianConditional:card=>get.is.complexlyYingbianConditional(card)||get.is.simplyYingbianConditional(card), + complexlyYingbianConditional:card=>{ + for(const [key] of lib.yingbian.condition.complex){ + if(get.cardtag(card,`yingbian_${key}`)) return true; + } + return false; }, + simplyYingbianConditional:card=>{ + for(const [key] of lib.yingbian.condition.simple){ + if(get.cardtag(card,`yingbian_${key}`)) return true; + } + return false; + }, + //Check if the card has a Yingbian effect + //检测此牌是否具有应变效果 + yingbianEffective:card=>{ + for(const [key] of lib.yingbian.effect){ + if(get.cardtag(card,`yingbian_${key}`)) return true; + } + return false; + }, + yingbian:card=>get.is.yingbianConditional(card)||get.is.yingbianEffective(card), emoji:function(substring){ if(substring){ var reg=new RegExp("[~#^$@%&!?%*]",'g'); @@ -56148,9 +56366,13 @@ uiintro._place_text=placetext; } } - if(lib.card[name].yingbian_prompt&&get.is.yingbian(node.link||node)){ - if(typeof lib.card[name].yingbian_prompt=='function') uiintro.add('
应变:'+lib.card[name].yingbian_prompt(node.link||node)+'
'); - else uiintro.add('
应变:'+lib.card[name].yingbian_prompt+'
'); + if(get.is.yingbianConditional(node.link||node)){ + const yingbianEffects=get.yingbianEffects(node.link||node); + if(!yingbianEffects.length){ + const defaultYingbianEffect=get.defaultYingbianEffect(node.link||node); + if(lib.yingbian.prompt.has(defaultYingbianEffect)) yingbianEffects.push(defaultYingbianEffect); + } + if(yingbianEffects.length) uiintro.add(`
应变:${yingbianEffects.map(value=>lib.yingbian.prompt.get(value)).join(';')}
`); } if(lib.translate[name+'_append']){ uiintro.add('
'+lib.translate[name+'_append']+'
');