diff --git a/character/extra.js b/character/extra.js index 9cf297567..b64afd467 100755 --- a/character/extra.js +++ b/character/extra.js @@ -1131,11 +1131,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:'damageEnd', source:'damageSource', }, - forced:true, - filter:function(event,player,name){ - var key=(name=='damageEnd'?'damage':'sourceDamage'); - return player.getAllHistory(key).indexOf(event)%2==1; + filter:function(event,player){ + return game.getGlobalHistory('damage',evt=>evt.player==player||(evt.source&&evt.source==player)).indexOf(event)%2==1; }, + forced:true, content:function(){ 'step 0' var tags=['dctuoyu_fengtian','dctuoyu_qingqu','dctuoyu_junshan']; @@ -1158,20 +1157,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, dcqijing:{ + derivation:'dccuixin', audio:2, trigger:{global:'phaseEnd'}, - forced:true, - juexingji:true, - derivation:'dccuixin', - skillAnimation:true, - animationColor:'orange', filter:function(event,player){ return player.getStorage('dctuoyu').length==3; }, + forced:true, + juexingji:true, + skillAnimation:true, + animationColor:'orange', content:function(){ 'step 0' player.awakenSkill('dcqijing'); player.loseMaxHp(); + player.addSkillLog('dccuixin'); 'step 1' if(game.countPlayer()>2){ if(player==trigger.player&&!trigger.skill){ @@ -1202,7 +1202,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ },player,target); } 'step 3' - player.addSkill('dccuixin'); player.insertPhase(); }, }, @@ -7977,9 +7976,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dctuoyu_junshan_tag:'峻山', dctuoyu_info:'①锁定技。当你使用拥有对应副区域标签的牌时,你令此牌获得对应效果。
丰田:伤害值或回复值+1;清渠:无次数和距离限制;峻山:不可被响应。②出牌阶段开始时和结束时,你给你的手牌分配对应的已激活副区域标签(每个区域至多五张)。', dcxianjin:'险进', - dcxianjin_info:'锁定技。当你造成或受到伤害后,若这是你本局游戏内第偶数次造成或受到伤害,则你激活一个副区域标签并摸X张牌(X为你已激活的副区域数,若你的手牌数为全场最多则改为摸一张牌)。', + dcxianjin_info:'锁定技。当你每造成或受到两次伤害后,你激活一个副区域标签并摸X张牌(X为你已激活的副区域数,若你的手牌数为全场最多则改为摸一张牌)。', dcqijing:'奇径', - dcqijing_info:'觉醒技。一名角色的回合结束后,若你的三个副区域标签均被激活,则你减1点体力上限,将座位移动至一名其他角色的上家之后,获得〖摧心〗和一个额外回合。', + dcqijing_info:'觉醒技。一名角色的回合结束后,若你的三个副区域标签均被激活,则你减1点体力上限,获得〖摧心〗,将座位移动至一名其他角色的上家之后,然后执行一个额外回合。', dccuixin:'摧心', dccuixin_info:'当你不因此技能使用的基本牌或普通锦囊牌结算结束后,若此牌的目标于你使用此牌指定第一个目标时包含你的上家或下家,则你可以视为对下家或上家再使用一张牌名和元素相同的牌。', shen_dianwei:'神典韦', diff --git a/character/huicui.js b/character/huicui.js index ecd18cae2..2b0d6015a 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -2074,8 +2074,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - if(target) event._result={bool:true,targets:[target]}; - else player.chooseTarget(get.prompt2('dcshengdu'),lib.filter.notMe).set('ai',target=>{ + player.chooseTarget(get.prompt2('dcshengdu'),lib.filter.notMe).set('ai',target=>{ var player=_status.event.player; var att=get.attitude(player,target); var eff=get.effect(target,{ @@ -2085,56 +2084,37 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var value=att/5; if(value<0) value=-value/1.3; value=Math.max(value-eff/20,0.01); - var skills=target.getSkills(null,false,false); - for(var skill of skills){ - var str=get.skillInfoTranslation(skill,target); - if(/摸牌阶段[^少放弃]{0,8}摸/.test(str)) value+=Math.random()/2+1.5; - } return value; }); 'step 1' if(result.bool){ var target=result.targets[0]; player.logSkill('dcshengdu',target); - target.addSkill('dcshengdu_effect'); - target.markAuto('dcshengdu_effect',[player]); + target.addMark('dcshengdu',1); } }, + intro:{content:'mark'}, + group:'dcshengdu_effect', subSkill:{ effect:{ - trigger:{player:'gainAfter'}, - charlotte:true, - forced:true, - popup:false, + audio:'dcshengdu', + trigger:{global:'gainAfter'}, filter:function(event,player){ - return event.getParent(2).name=='phaseDraw'; + return event.getParent(2).name=='phaseDraw'&&event.player.hasMark('dcshengdu'); }, + forced:true, + logTarget:'player', content:function(){ - 'step 0' - var targets=player.getStorage('dcshengdu_effect'); - event.targets=targets.sortBySeat(player); - 'step 1' - var target=targets.shift(); - if(target.isIn()){ - target.logSkill('dcshengdu_effect',player); - target.draw(trigger.cards.length); - } - if(targets.length) event.redo(); - 'step 2' - player.removeSkill('dcshengdu_effect'); - game.delayx(); + var num=trigger.player.countMark('dcshengdu'); + player.draw(num); + trigger.player.removeMark('dcshengdu',num); }, - marktext:'绞', - intro:{ - content:'下个摸牌阶段得到牌后,$摸等量的牌' - } } } }, dcjieling:{ audio:2, enable:'phaseUse', - usable:1, position:'hs', viewAs:{ name:'sha', @@ -2142,7 +2122,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterCard:function(card,player){ if(ui.selected.cards.length){ - return get.color(card)!=get.color(ui.selected.cards[0]); + return get.suit(card)!=get.suit(ui.selected.cards[0]); } return true; }, @@ -2154,6 +2134,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ precontent:function(){ player.addTempSkill('dcjieling_after'); event.getParent().addCount=false; + player.addTempSkill('dcjieling_count','phaseUseAfter'); + player.markAuto('dcjieling_count',event.result.cards.reduce((list,card)=>list.add(get.suit(card,player)),[])); }, ai:{ order:function(item,player){ @@ -2192,10 +2174,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ for(var target of targets){ - var next=game.createEvent('dcshengdu',false); - next.player=player; - next.target=target; - next.setContent(lib.skill.dcshengdu.content); + target.addMark('dcshengdu',1); } } } @@ -11328,9 +11307,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcguangshi_info:'锁定技。准备阶段,若所有其他角色均有“信众”,你摸两张牌并失去1点体力。', dongwan:'董绾', dcshengdu:'生妒', - dcshengdu_info:'回合开始时,你可以选择一名其他角色。当其于其的下个摸牌阶段得到牌后,你摸等量的牌。', + dcshengdu_info:'回合开始时,你可以选择一名其他角色,令其获得1枚“生妒”标记。有“生妒”标记的角色于摸牌阶段得到牌后,你摸X张牌,然后其移去所有“生妒”标记(X为其拥有的“生妒”标记数)。', dcjieling:'介绫', - dcjieling_info:'出牌阶段限一次。你可以将两张颜色不同的手牌当无距离限制且无任何次数限制的【杀】使用。然后若此【杀】:造成了伤害,所有目标角色失去1点体力;未造成伤害,你对所有目标角色依次发动一次〖生妒〗。', + dcjieling_info:'出牌阶段每种花色限一次,你可以将两张花色不同的手牌当无距离限制且无任何次数限制的【杀】使用。然后若此【杀】:造成了伤害,所有目标角色失去1点体力;未造成伤害,所有目标角色依次获得1枚“生妒”标记。', yuanyin:'袁胤', dcmoshou:'墨守', dcmoshou_info:'当你成为其他角色使用的黑色牌的目标后,你可以摸X张牌(X为你本局游戏此前发动过此技能的次数÷3的余数+1)。', diff --git a/character/sp2.js b/character/sp2.js index cdcc36025..fdd784fff 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -795,6 +795,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!player.isPhaseUsing()) return; if(card.name=='sha'&&!player.getStorage('dcjiaoxia_mark').includes(target)) return true; }, + targetInRange:function(card,player,target){ + if(!player.isPhaseUsing()) return; + if(card.name=='sha'&&!player.getStorage('dcjiaoxia_mark').includes(target)) return true; + }, }, audio:2, locked:false, @@ -881,9 +885,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!game.online&&!event.dchumei_num){ var player=event.player; var evtx=event.getParent('phaseUse'); - event.set('dchumei_num',player.getHistory('sourceDamage',function(evt){ + event.set('dchumei_num',player.getHistory('sourceDamage',evt=>{ return evt.getParent('phaseUse')==evtx; - }).length); + }).reduce((sum,evt)=>sum+evt.num,0)); } }, audio:2, @@ -3151,11 +3155,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:'使用基本牌无距离限制,且伤害值和回复值基数+1', }, trigger:{source:['damageBegin1','recoverBegin']}, - forced:true, filter:function(event,player){ var evt=event.getParent(); return evt.type=='card'&&get.type(evt.card,false)=='basic'; }, + forced:true, logTarget:'player', content:function(){ trigger.num++; @@ -3177,10 +3181,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:'使用锦囊牌时摸一张牌,且锦囊牌不计入本回合的手牌上限', }, trigger:{player:'useCard'}, - forced:true, filter:function(event,player){ return get.type2(event.card)=='trick'; }, + forced:true, content:function(){ player.draw(); }, @@ -3198,13 +3202,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ marktext:'装', mark:true, intro:{ - content:'使用装备牌时,可弃置一名其他角色的一张牌', + content:'有装备牌进汝你的装备时,可弃置一名其他角色的一张牌', }, - trigger:{player:'useCard'}, - direct:true, + trigger:{player:'equipAfter'}, filter:function(event,player){ - return get.type(event.card)=='equip'&&game.hasPlayer((target)=>(target!=player&&target.countDiscardableCards(player,'he')>0)); + return game.hasPlayer((target)=>(target!=player&&target.countDiscardableCards(player,'he')>0)); }, + direct:true, content:function(){ 'step 0' player.chooseTarget('战意:是否弃置一名其他角色的一张牌?',function(card,player,target){ @@ -10890,9 +10894,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiaojie:'狡黠', jiaojie_info:'锁定技,你的红色牌不计入手牌上限。你使用黑色牌无距离和次数限制。', dcjiaoxia:'狡黠', - dcjiaoxia_info:'①出牌阶段开始时,你可以令自己的所有手牌于此阶段均视为【杀】。若如此做,你使用以此法转化的【杀】造成伤害后,你可以视为使用此牌对应的原卡牌。②出牌阶段,你对你本阶段未使用过【杀】的角色使用【杀】无次数限制。', + dcjiaoxia_info:'①出牌阶段开始时,你可以令自己的所有手牌于此阶段均视为【杀】。若如此做,你使用以此法转化的【杀】造成伤害后,你可以视为使用此牌对应的原卡牌。②出牌阶段,你对你本阶段未使用过【杀】的角色使用【杀】无距离和次数限制。', dchumei:'狐魅', - dchumei_info:'出牌阶段各限一次,你可以选择一名体力值不大于X的角色,令其:①摸一张牌。②交给你一张牌。③回复1点体力。(X为你本阶段造成伤害的次数)', + dchumei_info:'出牌阶段各限一次,你可以选择一名体力值不大于X的角色,令其:①摸一张牌。②交给你一张牌。③回复1点体力。(X为你本阶段造成的伤害数)', buchen:'不臣', buchen_info:'隐匿技,你于其他角色的回合登场时,可获得当前回合角色的一张牌。', smyyingshi:'鹰视', @@ -11060,7 +11064,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qibie_info:'一名角色死亡后,若你有手牌且这些手牌均可被弃置,则你可以弃置所有手牌,然后回复1点体力并摸X+2张牌(X为你弃置的牌数)。', dc_zhuling:'朱灵', dczhanyi:'战意', - dczhanyi_info:'出牌阶段开始时,你可以弃置所有基本牌/锦囊牌/装备牌,然后获得另外两种类型的牌对应的效果直到回合结束:基本牌、你使用基本牌无距离限制,且伤害值和回复值基数+1;锦囊牌、你使用锦囊牌时摸一张牌,且锦囊牌不计入手牌上限;装备牌,当你使用装备牌时,你可弃置一名其他角色的一张牌。', + dczhanyi_info:'出牌阶段开始时,你可以弃置所有基本牌/锦囊牌/装备牌,然后获得另外两种类型的牌对应的效果直到你的下个回合开始:基本牌、你使用基本牌无距离限制,且伤害值和回复值基数+1;锦囊牌、你使用锦囊牌时摸一张牌,且锦囊牌不计入手牌上限;装备牌,当装备牌进入你的装备区时,你可弃置一名其他角色的一张牌。', yanrou:'阎柔', choutao:'仇讨', choutao_info:'当你使用【杀】时,或成为【杀】的目标后,你可以弃置此【杀】使用者的一张牌,令此【杀】不可被响应。若你是此【杀】的使用者,则你令此【杀】不计入次数限制。', diff --git a/character/xianding.js b/character/xianding.js index a740e68e8..800e4074e 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4363,68 +4363,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!event.isFirstTarget) return false; if(!event.targets||!event.targets.length) return false; var evt=lib.skill.dcjianying.getLastUsed(player,event.getParent()); - if(!evt||!evt.targets||!evt.targets.length||evt.targets.length!=event.targets.length) return false; - var targetsx=event.targets.slice(); - var targetsy=evt.targets.slice(); - return targetsx.slice().removeArray(targetsy).length==0&&targetsy.slice().removeArray(targetsx).length==0; + if(!evt||!evt.targets||!evt.targets.length) return false; + return event.targets.some(target=>evt.targets.includes(target)); }, frequent:true, locked:false, content:function(){ - player.draw(trigger.targets.length); + var evt=lib.skill.dcjianying.getLastUsed(player,trigger.getParent()); + player.draw(trigger.targets.filter(target=>evt.targets.includes(target)).length); }, + locked:false, mod:{ aiOrder:function(player,card,num){ - var evt=lib.skill.dcjianying.getLastUsed(player); - if(!evt) return; - var targets=evt.targets; - if(!targets.length) return; - var select=get.select(_status.event.selectTarget); - if(select[0]==-1){ - var targetsx=game.filterPlayer(current=>player.canUse(card,current)); - if(targetsx.length!=targets.length) return; - } - else if(targets.length>=select[0]&&targets.length<=select[1]){ - var eff=0; - for(var i of targets){ - eff+=get.effect(i,card,player,player); - } - if(eff<0) return; - } - return num+10; + var evt=player.getLastUsed(); + if(evt&&evt.targets&&evt.targets.length&&game.hasPlayer(current=>{ + return evt.targets.includes(current)&&player.canUse(card,current)&&get.effect(current,card,player,player)>0; + })) return num+10; }, }, ai:{ - threaten:2.5, effect:{ player:function(card,player,target){ - if(player._dcdanyi_aiChecking) return; - player._dcdanyi_aiChecking=true; - var evt=lib.skill.dcjianying.getLastUsed(player),targets; - if(evt){ - targets=evt.targets; - var select=get.select(_status.event.selectTarget); - if(select[0]==-1){ - var targetsx=game.filterPlayer(current=>player.canUse(card,current)); - if(targetsx.length!=targets.length){ - delete player._dcdanyi_aiChecking; - return; - } - } - else if(targets.length>=select[0]&&targets.length<=select[1]){ - var eff=0; - for(var i of targets){ - eff+=get.effect(i,card,player,player); - } - if(eff<0){ - delete player._dcdanyi_aiChecking; - return; - } - } - } - delete player._dcdanyi_aiChecking; - if((targets||[]).includes(target)) return [1,1]; - } + var evt=player.getLastUsed(); + if(evt&&evt.targets.includes(target)) return [1.5,0]; + }, }, }, }, @@ -4436,14 +4398,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(ui.selected.targets.length){ if(ui.selected.targets[0].hp==target.hp) return false; } - return target.hp!=player.hp; + return target!=player; }, selectTarget:[1,2], complexTarget:true, multiline:true, content:function(){ 'step 0' - target.chooseToDiscard(get.translation(player)+'对你发动了【文灿】','是否弃置两张花色不同的牌?或者点击“取消”,令其本回合对你使用牌无次数限制','he',2,(card,player)=>{ + target.chooseToDiscard(get.translation(player)+'对你发动了【文灿】','是否弃置两张花色不同的牌?或者点击“取消”,令其本回合对你使用牌无距离和次数限制','he',2,(card,player)=>{ if(!ui.selected.cards.length) return true; var suit=get.suit(card,player); for(var i of ui.selected.cards){ @@ -4454,7 +4416,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(_status.event.nofear) return 0; return 5-get.value(card); }).set('nofear',player.countCards('hs',card=>{ - return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,target)<=0; + return get.tag(card,'damage')&&player.canUse(card,target,false)&&get.effect(target,card,player,target)<=0; })lib.skill.dcjingzao.filterTarget(null,player,current)); + filter:function(event,player){ + if(3+player.countMark('dcjingzao_add')-player.countMark('dcjingzao_ban')<=0) return false; + return game.hasPlayer(current=>lib.skill.dcjingzao.filterTarget(null,player,current)); }, filterTarget:function(card,player,target){ return player!=target&&!target.hasSkill('dcjingzao_temp'); @@ -5858,7 +5824,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' target.addTempSkill('dcjingzao_temp'); - var cards=game.cardsGotoOrdering(get.cards(3+player.countMark('dcjingzao_add'))).cards; + var cards=game.cardsGotoOrdering(get.cards(3+player.countMark('dcjingzao_add')-player.countMark('dcjingzao_ban'))).cards; event.cards=cards; game.log(player,'亮出了',event.cards); event.videoId=lib.status.videoId++; @@ -5909,6 +5875,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(cards2.length) player.gain(cards2,'gain2'); player.addTempSkill('dcjingzao_ban'); + player.addMark('dcjingzao_ban',cards2.length,false); } }, ai:{ @@ -5919,7 +5886,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ add:{charlotte:true,onremove:true}, - ban:{charlotte:true}, + ban:{charlotte:true,onremove:true}, temp:{charlotte:true} } }, @@ -5932,7 +5899,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return current.hasHistory('useCard',evt=>{ return evt.card.name==event.card.name&&evt!=event.getParent()&&evt.targets&&evt.targets.includes(player); }); - }); + })&&(event.card.name=='sha'||get.type(event.card)=='trick'); }, content:function(){ trigger.getParent().excluded.add(player); @@ -5943,7 +5910,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player===target) return; if(game.hasPlayer2(current=>{ return current.hasHistory('useCard',evt=>evt.card.name==card.name&&evt.targets&&evt.targets.includes(player)); - })) return 'zeroplayertarget'; + })&&(card.name=='sha'||get.type(card)=='trick')) return 'zeroplayertarget'; } } } @@ -13705,9 +13672,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcshouze_info:'锁定技。结束阶段,若你有“绞”,你弃1枚“绞”,随机获得弃牌堆中的一张黑色牌,失去1点体力。', chengbing:'程秉', dcjingzao:'经造', - dcjingzao_info:'出牌阶段每名角色限一次。你可以选择一名其他角色并亮出牌堆顶三张牌,其选择一项:1.弃置一张牌名与这些牌的其中一张牌名相同的牌,然后你〖经造〗本回合亮出的牌数+1;2.令你随机获得这些牌中每种牌名的牌各一张,然后你本回合不能再发动〖经造〗。', + dcjingzao_info:'出牌阶段每名角色限一次,你可以选择一名其他角色并亮出牌堆顶三张牌,其选择一项:1.弃置一张牌名与这些牌的其中一张牌名相同的牌,然后你本回合发动〖经造〗亮出的牌数+1;2.令你随机获得这些牌中每种牌名的牌各一张,然后你本回合发动〖经造〗亮出的牌数-X(X为你获得的牌数)。', dcenyu:'恩遇', - dcenyu_info:'锁定技。当你成为其他角色使用牌的目标后,若你本回合成为过此牌名的牌的目标,此牌对你无效。', + dcenyu_info:'锁定技。当你成为其他角色使用【杀】或普通锦囊牌的目标后,若你本回合成为过此牌名的牌的目标,此牌对你无效。', dc_zhouxuān:'周宣', dcwumei:'寤寐', dcwumei_info:'每轮限一次。回合开始时,你可以令一名角色记录场上所有角色的体力值并进行一个额外的回合,并将你的回合移至该回合后进行。该角色以此法进行的回合的结束阶段,将场上所有角色的体力值改为记录内的对应数值。', @@ -13776,9 +13743,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。', xizheng:'郤正', dcdanyi:'耽意', - dcdanyi_info:'当你使用牌指定第一个目标后,若此牌的目标与你使用的上一张牌目标相同,你可以摸X张牌(X为此牌目标数)。', + dcdanyi_info:'当你使用牌指定第一个目标后,你可以摸X张牌(X为此牌目标数与你使用的上一张牌相同的目标数)。', dcwencan:'文灿', - dcwencan_info:'出牌阶段限一次。你可以选择至多两名体力值不同且均与你的体力值不同的角色,这些角色依次选择一项:1.弃置两张花色不同的牌;2.本回合你对其使用牌无次数限制。', + dcwencan_info:'出牌阶段限一次。你可以选择至多两名体力值不同的其他角色,这些角色依次选择一项:1.弃置两张花色不同的牌;2.本回合你对其使用牌无距离和次数限制。', zhangjinyun:'张瑾云', dchuizhi:'蕙质', dchuizhi_info:'准备阶段,你可以选择是否弃置任意张手牌,然后将手牌摸至与全场手牌数最多的角色相同(至少摸一张,至多摸五张)。',