diff --git a/card/sp.js b/card/sp.js index 790373c09..d752403a2 100644 --- a/card/sp.js +++ b/card/sp.js @@ -240,32 +240,6 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, skills:['yinyueqiang'] }, - - du:{ - type:'basic', - fullskin:true, - toself:true, - ai:{ - value:-5, - useful:6, - result:{ - player:function(player,target){ - if(player.hasSkillTag('usedu')) return 5; - return -1; - } - }, - order:7.5 - }, - enable:true, - modTarget:true, - global:'g_du', - filterTarget:function(card,player,target){ - return target==player; - }, - delay:false, - content:function(){}, - selectTarget:-1 - }, shengdong:{ audio:true, fullskin:true, @@ -601,30 +575,6 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } } }, - g_du:{ - cardSkill:true, - trigger:{player:'loseEnd'}, - popup:false, - forced:true, - filter:function(event,player){ - if(!event.visible) return false; - if(player.hasSkillTag('nodu')) return false; - if(event.hs){ - for(var i=0;i1){ next.set('prompt2','(共需使用'+event.shanRequired+'张闪)'); } + else if(event.card.nature=='stab'){ + next.set('prompt2','(在此之后仍需弃置一张手牌)'); + } next.set('ai1',function(card){ var target=_status.event.player; var evt=_status.event.getParent(); @@ -172,6 +175,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(event.shanRequired>0){ event.goto(1); } + else if(event.card.nature=='stab'&&target.countCards('h')>0){ + event.responded=result; + event.goto(4); + } else{ event.trigger('shaMiss'); event.responded=result; @@ -187,6 +194,28 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event.result={bool:false} event.trigger('shaUnhirt'); } + event.finish(); + "step 4" + target.chooseToDiscard('刺杀:请弃置一张牌,否则此【杀】依然造成伤害').set('ai',function(card){ + var target=_status.event.player; + var evt=_status.event.getParent(); + var bool=true; + if(get.damageEffect(target,evt.player,target,evt.card.nature)>=0) bool=false; + if(bool){ + return 8-get.useful(card); + } + return 0; + }); + "step 5" + if((!result||!result.bool)&&!event.unhurt){ + target.damage(get.nature(event.card),event.baseDamage+event.extraDamage); + event.result={bool:true} + event.trigger('shaDamage'); + } + else{ + event.result={bool:false} + event.trigger('shaUnhirt'); + } }, ai:{ yingbian:function(card,player,targets,viewer){ @@ -1995,9 +2024,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, filter:function(event,player){ if(event.card.name!='sha') return false; - if(player.sex=='male'&&event.target.sex=='female') return true; - if(player.sex=='female'&&event.target.sex=='male') return true; - return false; + return player.differentSexFrom(event.target); }, content:function(){ "step 0" @@ -2675,6 +2702,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ sha:'杀', huosha:'火杀', leisha:'雷杀', + icesha:'冰杀', + kamisha:'神杀', + cisha:'刺杀', shan:'闪', tao:'桃', bagua:'八卦阵', diff --git a/card/yongjian.js b/card/yongjian.js new file mode 100644 index 000000000..a8d5f32fb --- /dev/null +++ b/card/yongjian.js @@ -0,0 +1,733 @@ +'use strict'; +game.import('card',function(lib,game,ui,get,ai,_status){ + return { + name:'yongjian', + connect:true, + card:{ + du:{ + type:'basic', + fullskin:true, + global:['g_du','g_du_give'], + content:function(){}, + ai:{ + value:-5, + useful:6, + result:{ + player:function(player,target){ + if(player.hasSkillTag('usedu')) return 5; + return -1; + } + }, + order:7.5 + }, + }, + guaguliaodu:{ + type:'trick', + fullskin:true, + enable:true, + filterTarget:function(card,player,target){ + return target.isDamaged(); + }, + content:function(){ + 'step 0' + target.recover(); + 'step 1' + if(target.hasCard(function(card){ + return _status.connectMode||get.name(card,target)=='du'; + },'h')) target.chooseToDiscard('h',{name:'du'},'是否弃置一张【毒】?(不失去体力)').set('ai',()=>1); + }, + ai:{ + order:2, + tag:{ + recover:1, + }, + result:{ + target:1.5, + } + }, + }, + chenghuodajie:{ + type:'trick', + fullskin:true, + enable:true, + filterTarget:function(card,player,target){ + return target!=player&&target.countCards('h')>0; + }, + content:function(){ + 'step 0' + if(typeof event.baseDamage!='number') event.baseDamage=1; + if(!target.countCards('h')||!player.isIn()) event.finish(); + else player.choosePlayerCard(target,'h',true); + 'step 1' + if(result.bool){ + event.show_card=result.cards[0],str=get.translation(player); + player.showCards(event.show_card); + target.chooseControl().set('choiceList',[ + '令'+str+'获得'+get.translation(event.show_card), + '受到'+str+'造成的'+event.baseDamage+'点伤害', + ]).set('ai',function(){ + var evt=_status.event.getParent(),player=evt.target,source=evt.player,card=evt.show_card; + if(get.damageEffect(player,source,player)>0) return 1; + if(get.attitude(player,source)*get.value(card,source)>=0) return 0; + if(card.name=='tao') return 1; + return get.value(card,player)>(6+(Math.max(player.maxHp,3)-player.hp)*1.5)?1:0; + }); + } + else event.finish(); + 'step 2' + if(result.index==0) player.gain(event.show_card,target,'give'); + else target.damage(); + }, + ai:{ + order:6, + tag:{ + damage:1, + loseCard:1, + gain:1, + }, + result:{ + player:0.1, + target:-1.2, + }, + }, + }, + tuixinzhifu:{ + type:'trick', + fullskin:true, + enable:true, + filterTarget:function(card,player,target){ + return target!=player&&target.countGainableCards(player,'hej')>0; + }, + range:{global:1}, + content:function(){ + 'step 0' + player.gainPlayerCard(target,'hej',true,[1,2]); + 'step 1' + if(result.bool&&target.isIn()){ + var num=result.cards.length,hs=player.getCards('h'); + if(!hs.length) event.finish(); + else if(hs.length0&&card!=target.getEquip('jinhe'); + })>0)?-0.3:0.3)*Math.sqrt(player.countCards('h')); + return ((target.countCards('ej',function(card){ + if(get.position(card)=='e') return get.value(card,target)<=0; + var cardj=card.viewAs?{name:card.viewAs}:card; + return get.effect(target,cardj,target,player)<0; + })>0)?1.5:-0.3)*Math.sqrt(player.countCards('h')); + }, + }, + }, + }, + yitianjian:{ + type:'equip', + subtype:'equip1', + fullskin:true, + distance:{attackFrom:-1}, + skills:['yitianjian'], + ai:{ + equipValue:1.5, + basic:{ + equipValue:1.5, + }, + } + }, + qixingbaodao:{ + type:'equip', + subtype:'equip1', + distance:{attackFrom:-1}, + fullskin:true, + skills:['qixingbaodao'], + selectTarget:[-1,-2], + ai:{ + order:9, + value:function(card,player){ + if(player.getEquip(1)==card) return 0; + return 4; + }, + equipValue:function(card,player){ + if(player.getCards('e').contains(card)) return 0; + return -get.value(player.getCards('e')); + }, + basic:{ + equipValue:5, + }, + result:{ + keepAI:true, + target:function(player,target){ + var cards=target.getCards('e'),js=target.getCards('j'); + var val=get.value(cards,target); + for(var card of js) val-=get.effect(target,card.viewAs?{name:card.viewAs}:card,target,target) + return -val; + }, + }, + }, + }, + duanjian:{ + type:'equip', + subtype:'equip1', + fullskin:true, + distance:{attackFrom:1}, + selectTarget:[-1,-2], + ai:{ + order:9, + equipValue:function(card,player){ + if(get.position(card)=='e') return -2; + return 2; + }, + value:function(card,player){ + if(player.getEquip(1)==card) return -3; + return 3; + }, + basic:{ + equipValue:5, + }, + result:{ + keepAI:true, + target:function(player,target){ + var val=2.5; + var val2=0; + var card=target.getEquip(1); + if(card){ + val2=get.value(card,target); + if(val2<0) return 0; + } + return -val-val2; + }, + }, + }, + }, + serafuku:{ + type:'equip', + subtype:'equip2', + fullskin:true, + skills:['serafuku'], + selectTarget:[-1,-2], + ai:{ + order:9, + equipValue:function(card,player){ + if(get.position(card)=='e') return -2; + return 2; + }, + value:function(card,player){ + if(player.getEquip(2)==card) return -3; + return 3; + }, + basic:{ + equipValue:5, + }, + result:{ + keepAI:true, + target:function(player,target){ + var val=(target.hasSex('male')?2.5:0); + var val2=0; + var card=target.getEquip(1); + if(card){ + val2=get.value(card,target); + if(val2<0) return 0; + } + return -val-val2; + }, + }, + }, + }, + yinfengyi:{ + type:'equip', + subtype:'equip2', + fullskin:true, + skills:['yinfengyi'], + selectTarget:[-1,-2], + ai:{ + order:9, + equipValue:function(card,player){ + if(get.position(card)=='e') return -1; + return 1; + }, + value:function(card,player){ + if(player.getEquip(2)==card) return -2.5; + return 2.5; + }, + basic:{ + equipValue:5, + }, + result:{ + keepAI:true, + target:function(player,target){ + var val=2; + var val2=0; + var card=target.getEquip(2); + if(card){ + val2=get.value(card,target); + if(val2<0) return 0; + } + return -val-val2; + }, + }, + }, + }, + yonglv:{ + type:'equip', + subtype:'equip4', + fullskin:true, + selectTarget:[-1,-2], + distance:{ + globalFrom:-1, + globalTo:-Infinity, + }, + ai:{ + order:9, + equipValue:0, + value:function(card,player){ + if(player.getEquip(2)==card) return 0; + return 0.5; + }, + basic:{ + equipValue:0, + }, + }, + }, + zhanxiang:{ + type:'equip', + subtype:'equip3', + fullskin:true, + distance:{globalTo:1}, + skills:['zhanxiang'], + ai:{ + equipValue:3.5, + basic:{ + equipValue:3.5, + }, + } + }, + xinge:{ + type:'equip', + subtype:'equip5', + fullskin:true, + skills:['xinge'], + ai:{ + equipValue:2, + basic:{ + equipValue:2, + }, + } + }, + }, + skill:{ + yitianjian:{ + audio:true, + trigger:{source:'damageSource'}, + direct:true, + equipSkill:true, + filter:function(event,player){ + return event.card&&event.card.name=='sha'&&event.getParent().name=='sha'&&player.countCards('h')>0; + }, + content:function(){ + 'step 0' + player.chooseToDiscard('h',get.prompt('yitianjian'),'弃置一张手牌并回复1点体力').set('ai',(card)=>7-get.value(card)).logSkill='yitianjian'; + 'step 1' + if(result.bool) player.recover(); + }, + }, + serafuku:{ + audio:true, + trigger:{target:'useCardToTargeted'}, + forced:true, + equipSkill:true, + filter:function(event,player){ + return event.card.name=='sha'&&player.hasSex('male'); + }, + content:function(){ + 'step 0' + player.judge(function(card){ + return get.color(card)=='black'?-2:0; + }).judge2=function(result){ + return result.bool==false?true:false; + }; + 'step 1' + if(result.bool===false){ + var map=trigger.customArgs,id=player.playerid; + if(!map[id]) map[id]={}; + if(!map[id].extraDamage) map[id].extraDamage=0; + map[id].extraDamage++; + game.log(trigger.card,'对',player,'的伤害+1'); + } + }, + }, + yinfengyi:{ + audio:true, + equipSkill:true, + forced:true, + trigger:{player:['damageBegin3','loseHpBegin']}, + filter:function(event,player){ + if(event.name=='damage') return event.card&&get.type2(event.card)=='trick'; + return event.type=='du'; + }, + content:function(){ + trigger.num++; + }, + }, + zhanxiang:{ + audio:true, + equipSkill:true, + forced:true, + trigger:{target:'_yongjian_zengyuBegin'}, + content:function(){ + trigger._zengyu_denied=true; + game.log(player,'拒绝了',trigger.player,'发起的赠予'); + }, + ai:{ + refuseGifts:true, + }, + }, + xinge:{ + audio:true, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return player.countCards('h')>0; + }, + filterCard:true, + position:'h', + filterTarget:lib.filter.notMe, + discard:false, + lose:false, + delay:false, + content:function(){ + target.gain(cards,player,'giveAuto'); + }, + }, + qixingbaodao:{ + trigger:{player:'equipAfter'}, + forced:true, + equipSkill:true, + filter:function(event,player){ + return event.card.name=='qixingbaodao'&&player.hasCard(function(card){ + return card!=event.card; + },'ej'); + }, + content:function(){ + var cards=player.getCards('ej',function(card){ + return card!=trigger.card&&lib.filter.cardDiscardable(card,player,'qixingbaodao'); + }); + if(cards.length) player.discard(cards); + }, + }, + g_du:{ + trigger:{ + player:['loseAfter','compare'], + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter'], + target:'compare', + }, + cardSkill:true, + filter:function(event,player,name){ + if(name=='compare'){ + if(player==event.player){ + if(event.iwhile>0) return false; + return event.card1.name=='du'; + } + return event.card2.name=='du'; + } + if(event.name!='equip'&&event.name!='addJudge'&&!event.visible) return false; + var evt=event.getl(player); + if(!evt||!evt.hs||!evt.hs.filter(function(i){ + return get.name(i,player)=='du'; + }).length) return false; + for(var i of lib.skill.g_du.whiteListFilter){ + if(i(event,player)) return false; + } + return true; + }, + whiteListFilter:[ + (event)=>event.getParent().name=='g_du_give', + (event)=>event.getParent(3).name=='guaguliaodu', + ], + forced:true, + popup:false, + content:function(){ + 'step 0' + if(trigger.delay===false) game.delayx(); + 'step 1' + game.log(player,'触发了','#g【毒】','的效果'); + var num=1; + if(typeof trigger.getl=='function'){ + num=trigger.getl(player).hs.filter(function(i){ + return get.name(i,player)=='du'; + }).length; + } + player.loseHp(num).type='du'; + }, + }, + g_du_give:{ + trigger:{ + player:'gainAfter', + global:'phaseBefore', + }, + cardSkill:true, + direct:true, + filter:function(event,player){ + if(event.name=='phase'){ + if(game.phaseNumber!=0) return false; + if(!player._start_cards) return false; + var hs=player.getCards('h'); + for(var card of player._start_cards){ + if(get.name(card,player)=='du'&&hs.contains(card)) return true; + } + } + else{ + if(event.getParent().name!='draw') return false; + var hs=player.getCards('h'); + for(var card of event.cards){ + if(get.name(card,player)=='du'&&hs.contains(card)) return true; + } + } + return false; + }, + content:function(){ + 'step 0' + var hs=player.getCards('h'); + if(trigger.name=='phase'){ + event.cards=player._start_cards.filter(function(card){ + return (get.name(card,player)=='du'&&hs.contains(card)); + }); + } + else{ + event.cards=trigger.cards.filter(function(card){ + return (get.name(card,player)=='du'&&hs.contains(card)); + }); + } + if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); + event.given_map={}; + 'step 1' + player.chooseCardTarget({ + filterCard:function(card){ + return _status.event.cards.contains(card); + }, + filterTarget:lib.filter.notMe, + selectCard:[1,cards.length], + cards:event.cards, + prompt:'是否发动【赠毒】?', + prompt2:'将本次获得的【毒】交给其他角色', + ai1:function(card){ + if(!ui.selected.cards.length) return 1; + return 0; + }, + ai2:function(target){ + return -get.attitude(_status.event.player,target); + }, + }); + 'step 2' + if(result.bool){ + event.given=true; + var res=result.cards,target=result.targets[0].playerid; + player.addGaintag(res,'du_given'); + cards.removeArray(res); + if(!event.given_map[target]) event.given_map[target]=[]; + event.given_map[target].addArray(res); + if(cards.length) event.goto(1); + } + else if(!event.given){ + if(_status.connectMode){ + game.broadcastAll(function(){delete _status.noclearcountdown}); + game.stopCountChoose(); + } + event.finish(); + } + 'step 3' + if(_status.connectMode){ + game.broadcastAll(function(){delete _status.noclearcountdown}); + game.stopCountChoose(); + } + var logs=[]; + for(var i in event.given_map){ + var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; + logs.push(source); + source.gain(event.given_map[i],player,'give'); + } + logs.sortBySeat(); + event.next.sort(function(a,b){ + return lib.sort.seat(a.player,b.player); + }); + player.logSkill('g_du_give',logs); + player.removeGaintag('du_given'); + }, + ai:{expose:0.1}, + }, + _yongjian_zengyu:{ + enable:'phaseUse', + filter:function(event,player){ + return player.hasCard((card)=>lib.skill._yongjian_zengyu.filterCard(card),'h'); + }, + filterCard:function(card){ + return get.cardtag(card,'gifts'); + }, + filterTarget:function(card,player,target){ + if(player==target) return false; + var card=ui.selected.cards[0]; + if(get.type(card,false)=='equip'){ + return target.canEquip(card,true); + } + return true; + }, + discard:false, + lose:false, + delay:false, + check:function(card){ + var player=_status.event.player; + if(get.cardtag(card,'gifts')&&get.type(card,false)=='equip'&&game.hasPlayer(function(current){ + return current!=player&¤t.canEquip(card,true)&&!current.hasSkillTag('refuseGifts')&&get.effect(current,card,player,player)>0; + })) return 2; + if(!player.needsToDiscard()) return 0; + return 1+Math.random(); + }, + content:function(){ + 'step 0' + if(event._zengyu_denied){ + player.$throw(cards[0],1000); + player.lose(cards,ui.discardPile,'visible'); + } + else{ + if(get.type(cards[0],false)=='equip'){ + player.$give(cards[0],target,false); + game.delay(0.5); + target.equip(cards[0]); + } + else{ + target.gain(cards,player,'give'); + event.finish(); + } + } + 'step 1' + game.delayx(); + }, + ai:{ + order:function(item,player){ + if(player.hasCard(function(card){ + return get.cardtag(card,'gifts')&&get.type(card,false)=='equip'&&game.hasPlayer(function(current){ + return current!=player&¤t.canEquip(card,true)&&!current.hasSkillTag('refuseGifts')&&get.effect(current,card,player,player)>0; + }); + },'h')) return 7; + return 0.51; + }, + result:{ + target:function(player,target){ + var card=ui.selected.cards[0]; + if(!card||target.hasSkillTag('refuseGifts')) return 0; + if(get.type(card,false)=='equip') return get.effect(target,card,target,target); + if(card.name=='du') return player.hp>target.hp?-1:0; + if(target.hasSkillTag('nogain')) return 0; + return Math.max(1,get.value(card,player)-get.value(card,target)); + }, + }, + }, + }, + }, + translate:{ + gifts_tag:'赠', + du:'毒', + du_info:'①当此牌正面向上离开你的手牌区,或作为你的拼点牌而亮出时,你失去1点体力。②当你因摸牌或分发起始手牌而获得【毒】后,你可将其分配给其他角色(正面朝上移动,且不触发〖毒①〗)。', + g_du:'毒', + g_du_give:'赠毒', + du_given:'已分配', + guaguliaodu:'刮骨疗毒', + guaguliaodu_info:'出牌阶段,对一名已受伤的角色使用。目标角色回复1点体力,然后其可以弃置一张【毒】(不触发〖毒①〗失去体力的效果)。', + chenghuodajie:'趁火打劫', + chenghuodajie_info:'出牌阶段,对一名有手牌的其他角色使用。你展示其一张手牌,然后令其选择一项:①将此牌交给你。②你对其造成1点伤害。', + tuixinzhifu:'推心置腹', + tuixinzhifu_info:'出牌阶段,对一名距离为1的其他角色使用。你获得其区域内的至多两张牌,然后交给其等量的牌。', + yitianjian:'倚天剑', + yitianjian_info:'当你因执行【杀】的效果而造成伤害后,你可弃置一张手牌,然后回复1点体力。', + qixingbaodao:'七星宝刀', + qixingbaodao_info:'锁定技。当此牌进入你的装备区后,你弃置装备区和判定区内的所有其他牌。', + duanjian:'断剑', + duanjian_info:'这是一把坏掉的武器…', + duanjian_append:'不要因为手快而装给自己。', + serafuku:'水手服', + serafuku_info:'锁定技。当你成为【杀】的目标后,若你的性别包含男性,则你进行判定:若结果为黑色,则此牌对你的伤害值基数+1。', + serafuku_append:'セーラー服だからです、
结论!
', + yinfengyi:'引蜂衣', + yinfengyi_info:'锁定技。当你受到渠道为锦囊牌的伤害时,此伤害+1。当你因〖毒①〗而失去体力时,失去体力的量值+1。', + yonglv:'庸驴', + yonglv_info:'锁定技。其他角色至你的距离视为1。', + yonglv_append:'它旁边的就是王仲宣。', + zhanxiang:'战象', + zhanxiang_info:'锁定技。当你成为〖赠予〗的目标后,你将此次赠予的效果改为“将赠予牌移动至弃牌堆”。', + xinge:'信鸽', + xinge_info:'出牌阶段限一次。你可以将一张牌交给一名其他角色。', + xinge_append:'咕咕咕。', + + _yongjian_zengyu:'赠予', + _yongjian_zengyu_info:'出牌阶段,你可将一张拥有“赠”标签的手牌区装备牌置于一名其他角色的装备区内,或将一张拥有“赠”标签的手牌区非装备牌正面朝上交给一名其他角色。', + }, + list:[ + ['spade',1,'guaguliaodu'], + ['spade',2,'qixingbaodao',null,['gifts']], + ['spade',3,'shunshou',null,['gifts']], + ['spade',4,'du',null,['gifts']], + ['spade',5,'du',null,['gifts']], + ['spade',6,'sha','stab'], + ['spade',7,'sha','stab'], + ['spade',8,'sha','stab'], + ['spade',9,'du',null,['gifts']], + ['spade',10,'du',null,['gifts']], + ['spade',11,'wuxie'], + ['spade',12,'chenghuodajie'], + ['spade',13,'chenghuodajie'], + + ['heart',1,'guaguliaodu'], + ['heart',2,'shan',null,['gifts']], + ['heart',3,'wugu',null,['gifts']], + ['heart',4,'xinge',null,['gifts']], + ['heart',5,'sha',null,['gifts']], + ['heart',6,'chenghuodajie'], + ['heart',7,'tao'], + ['heart',8,'tao'], + ['heart',9,'serafuku',null,['gifts']], + ['heart',10,'sha',null,['gifts']], + ['heart',11,'sha',null,['gifts']], + ['heart',12,'sha',null,['gifts']], + ['heart',13,'zhanxiang',null,['gifts']], + + ['club',1,'duanjian',null,['gifts']], + ['club',2,'sha','stab'], + ['club',3,'yinfengyi',null,['gifts']], + ['club',4,'du'], + ['club',5,'yitianjian'], + ['club',6,'sha','stab'], + ['club',7,'sha','stab'], + ['club',8,'sha','stab'], + ['club',9,'sha','stab'], + ['club',10,'sha','stab'], + ['club',11,'wuxie'], + ['club',12,'wuxie'], + ['club',13,'yonglv',null,['gifts']], + + ['diamond',1,'juedou',null,['gifts']], + ['diamond',2,'shan'], + ['diamond',3,'kaihua',null,['gifts']], + ['diamond',4,'kaihua',null,['gifts']], + ['diamond',5,'shan'], + ['diamond',6,'shan'], + ['diamond',7,'shan'], + ['diamond',8,'shan'], + ['diamond',9,'tuixinzhifu'], + ['diamond',10,'tuixinzhifu'], + ['diamond',11,'tao',null,['gifts']], + ['diamond',12,'shan'], + ['diamond',13,'','stab'], + ], + } +}); diff --git a/card/zhulu.js b/card/zhulu.js index e06b3e3fe..43b062f3d 100644 --- a/card/zhulu.js +++ b/card/zhulu.js @@ -346,6 +346,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ keepAI:true, target:function(player,target){ var cards=target.getCards('e'); + if(cards.length==1&&cards[0].name=='nvzhuang') return 0; var val=get.value(cards,target); if(val>0) return -val; return 0; @@ -841,26 +842,26 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, translate:{ jinhe:'锦盒', - jinhe_info:'当你使用【锦盒】时,你将原有的与此牌对应的「礼」置入弃牌堆(若有),然后观看牌堆顶的两张牌并将其中一张置于游戏外与此牌对应,称之为「礼」。
出牌阶段,你可以将与此牌对应的「礼」置入弃牌堆,然后弃置【锦盒】以及所有与「礼」花色相同的手牌。当此牌因其他原因进入弃牌堆后,你将与此牌对应的「礼」置入弃牌堆并弃置所有手牌。', + jinhe_info:'此牌的使用目标为其他角色。当你使用【锦盒】时,你将原有的与此牌对应的「礼」置入弃牌堆(若有),然后观看牌堆顶的两张牌并将其中一张置于游戏外与此牌对应,称之为「礼」。
出牌阶段,你可以将与此牌对应的「礼」置入弃牌堆,然后弃置【锦盒】以及所有与「礼」花色相同的手牌。当此牌因其他原因进入弃牌堆后,你将与此牌对应的「礼」置入弃牌堆并弃置所有手牌。', jinhe_skill:'锦盒', jinhe_lose:'锦盒', yexingyi:'夜行衣', yexingyi_info:'锁定技,你不是黑色锦囊牌的合法目标。', nvzhuang:'女装', - nvzhuang_info:'锁定技,当此牌进入或离开你的装备区时,若你的性别为男性,你弃置一张不为此牌的牌。', + nvzhuang_info:'此牌的使用目标为其他角色。锁定技,当此牌进入或离开你的装备区时,若你的性别为男性,你弃置一张不为此牌的牌。', yinfengjia:'引蜂甲', - yinfengjia_info:'锁定技,当你受到锦囊牌造成的伤害时,此伤害+1。', + yinfengjia_info:'此牌的使用目标为其他角色。锁定技,当你受到锦囊牌造成的伤害时,此伤害+1。', yinfengjia_skill:'引蜂甲', zheji:'折戟', - zheji_info:'这是一把坏掉的武器...', + zheji_info:'此牌的使用目标为其他角色。这是一把坏掉的武器...', wufengjian:'无锋剑', - wufengjian_info:'锁定技,当你使用【杀】时,你弃置一张不为装备区内【无锋剑】的牌。', + wufengjian_info:'此牌的使用目标为其他角色。锁定技,当你使用【杀】时,你弃置一张不为装备区内【无锋剑】的牌。', wufengjian_skill:'无锋剑', yajiaoqiang_skill:'涯角枪', yajiaoqiang:'涯角枪', yajiaoqiang_info:'当你于一名其他角色的回合内第一次使用的黑色牌结算完成后,你可以获得此牌对应的所有实体牌。', numa:'驽马', - numa_info:'锁定技,当此牌进入你的装备区时,你弃置装备区内的所有其他牌。', + numa_info:'此牌的使用目标为其他角色。锁定技,当此牌进入你的装备区时,你弃置装备区内的所有其他牌。', caochuan:'草船借箭', caochuan_info:'当带有「伤害」标签的基本牌或普通锦囊牌对你生效前,对此牌使用。抵消此牌对你产生的效果。当此牌结算完成后,你获得此牌对应的所有实体牌。', jiejia:'解甲归田', @@ -869,7 +870,6 @@ game.import('card',function(lib,game,ui,get,ai,_status){ kaihua_info:'出牌阶段,对包含你自己在内的一名角色使用。目标角色弃置一至两张牌,然后摸等量的牌。若其以此法弃置了装备牌,则多摸一张牌。', zhulu_card:'逐鹿天下', zhulu_card_info:'出牌阶段,对所有角色使用。你从牌堆和弃牌堆亮出等同于目标角色数的装备牌,每名目标角色将其中一张牌置于自己的装备区。', - gifts_tag:'赠', }, list:[ ['diamond',3,'jiejia'], @@ -878,30 +878,30 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ['diamond',6,'sha'], ['diamond',8,'shan'], ['diamond',9,'kaihua'], - ['diamond',10,'yinfengjia',null,['gifts']], + ['diamond',10,'yinfengjia'], ['diamond',11,'sha'], ['club',3,'jiejia'], ['club',4,'sha','thunder'], - ['club',5,'zheji',null,['gifts']], + ['club',5,'zheji'], ['club',6,'jiu'], ['club',8,'jiu'], ['club',9,'zhulu_card'], - ['club',10,'jinhe',null,['gifts']], + ['club',10,'jinhe'], ['club',11,'sha'], ['heart',3,'sha','fire'], ['heart',4,'shan'], - ['heart',5,'numa',null,['gifts']], + ['heart',5,'numa'], ['heart',6,'tao'], ['heart',8,'shan'], ['heart',9,'kaihua'], - ['heart',10,'nvzhuang',null,['gifts']], + ['heart',10,'nvzhuang'], ['heart',11,'kaihua'], ['spade',3,'caochuan'], ['spade',4,'sha','thunder'], - ['spade',5,'wufengjian',null,['gifts']], + ['spade',5,'wufengjian'], ['spade',6,'caochuan'], ['spade',8,'sha'], ['spade',9,'sha'], diff --git a/character/diy.js b/character/diy.js index 36b501ff9..64f6f5772 100755 --- a/character/diy.js +++ b/character/diy.js @@ -28,13 +28,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_harukakanata:['female','key',3,['haruka_shuangche']], key_inari:['female','key',2,['inari_baiwei','inari_huhun']], key_shiina:['female','key',3,['shiina_qingshen','shiina_feiyan']], - key_sunohara:['unknown','key','3/4',['sunohara_chengshuang','sunohara_tiaoyin','sunohara_jianren']], + key_sunohara:['double','key','3/4',['sunohara_chengshuang','sunohara_tiaoyin','sunohara_jianren']], key_rin:['female','key',3,['rin_baoqiu']], key_sasami:['female','key',3,['sasami_miaobian']], key_akane:['female','key',3,['akane_jugu','akane_quanqing','akane_yifu'],['zhu']], key_doruji:['female','key',16,['doruji_feiqu']], key_yuiko:['female','key',3,['yuiko_fenglun','yuiko_dilve']], - key_riki:['female','key',3,['riki_spwenji','riki_nvzhuang','riki_mengzhong']], + key_riki:['double','key',3,['riki_spwenji','riki_nvzhuang','riki_mengzhong']], key_hisako:['female','key',3,['hisako_yinbao','hisako_zhuanyun']], key_hinata:['male','key',4,['hinata_qiulve','hinata_ehou']], key_noda:['male','key',4,['noda_fengcheng','noda_xunxin']], @@ -629,11 +629,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mia_qianmeng:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, dutySkill:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ 'step 0' player.draw(); @@ -1646,7 +1649,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.cards2=result.cards; 'step 2' target.$give(event.cards2,player,false); - target.loseToSpecial(event.cards2,'asara_yingwei',player); + target.loseToSpecial(event.cards2,'asara_yingwei',player).visible=true; var card1=cards[0],card2=event.cards2[0]; if(card1.suit==card2.suit) player.draw(2); if(card1.number==card2.number) player.recover(); @@ -2991,11 +2994,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, shiroha_yuzhao:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, charlotte:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ player.markAuto('shiroha_yuzhao',game.cardsGotoSpecial(get.cards(game.countGroup())).cards); }, @@ -3336,11 +3342,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, kotori_yumo:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, charlotte:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ var list=['wei','shu','wu','qun','jin']; for(var i of list){ @@ -3655,7 +3664,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:['gainAfter','equipAfter','addJudgeAfter','loseAsyncAfter'], }, filterTarget:function(card,player,target){ - return target!=player&&(target.sex=='female'||target.sex=='male'&&target.countCards('hej')>0); + return target!=player&&(target.hasSex('female')||target.countCards('hej')>0); }, filter:function(event,player){ var evt=event.getl(player); @@ -3682,7 +3691,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool&&result.targets&&result.targets.length){ var target=result.targets[0]; player.line(target,'green'); - if(target.sex=='female') target.loseHp(); + if(target.hasSex('female')) target.loseHp(); else player.discardPlayerCard(target,2,'hej',true); } else event.finish(); @@ -3925,10 +3934,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, akiko_dongcha:{ - trigger:{global:'gameDrawAfter'}, + trigger:{global:'phaseBefore'}, forced:true, filter:function(event,player){ - return get.mode()=='identity'; + return get.mode()=='identity'&&game.phaseNumber==0; }, content:function(){ var func=function(){ @@ -4085,10 +4094,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, miki_shenqiang:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ player.equip(game.createCard2('miki_hydrogladiator','club',6)); player.equip(game.createCard2('miki_binoculars','diamond',6)); @@ -4516,11 +4528,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kamome_yangfan:{ trigger:{ player:['loseAfter','enterGame'], - global:['equipAfter','addJudgeAfter','gameDrawAfter','gainAfter','loseAsyncAfter'], + global:['equipAfter','addJudgeAfter','phaseBefore','gainAfter','loseAsyncAfter'], }, forced:true, filter:function(event,player){ - if(typeof event.getl!='function') return true; + if(typeof event.getl!='function') return (event.name!='phase'||game.phaseNumber==0); var evt=event.getl(player); return evt&&evt.player==player&&evt.es&&evt.es.length; }, @@ -5410,7 +5422,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'damageBegin1'}, forced:true, filter:function(event,player){ - return event.source&&event.source.sex=='male'&&event.player.sex=='male'; + return event.source&&event.source.sameSexAs(event.player) }, content:function(){ player.draw(); @@ -6551,8 +6563,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return num+player.maxHp; } }, - trigger:{global:'gameDrawAfter',player:'enterGame'}, + trigger:{global:'phaseBefore',player:'enterGame'}, forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ player.draw(player.maxHp); } @@ -6803,11 +6818,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, sunohara_chengshuang:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, group:'sunohara_chengshuang_phase', forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ 'step 0' var evt=event.getParent('phase'); @@ -6819,12 +6837,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.sex=sex; if(player.marks&&player.marks.sunohara_chengshuang) player.marks.sunohara_chengshuang.firstChild.innerHTML=sex=='male'?'♂':'♀'; },player,sex); - game.log(player,'将性别变更为','#g'+get.translation(sex)); + game.log(player,'将性别变更为','#g'+get.translation(sex)+'性'); }, mark:true, intro:{ content:function(storage,player){ - if(player.sex=='unknown') return '当前性别未确定'; + if(player.sex=='unknown'||player.sex=='double') return '当前性别未确定'; return '当前性别:'+get.translation(player.sex); }, }, @@ -6838,12 +6856,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return game.phaseNumber>1; }, prompt2:function(event,player){ - if(player.sex=='unknown') return '选择自己的性别'; + if(player.sex=='unknown'||player.sex=='double') return '选择自己的性别'; return '将自己的性别变更为'+(player.sex=='male'?'女性':'男性'); }, content:function(){ 'step 0' - if(player.sex=='unknown') player.chooseControl('male','female').set('prompt','成双:请选择自己的性别'); + if(player.sex=='unknown'||player.sex=='double') player.chooseControl('male','female').set('prompt','成双:请选择自己的性别'); else event._result={control:player.sex=='male'?'female':'male'}; 'step 1' var sex=result.control; @@ -6851,7 +6869,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.sex=sex; if(player.marks&&player.marks.sunohara_chengshuang) player.marks.sunohara_chengshuang.firstChild.innerHTML=sex=='male'?'♂':'♀'; },player,sex); - game.log(player,'将性别变更为','#g'+get.translation(sex)); + game.log(player,'将性别变更为','#g'+get.translation(sex)+'性'); }, }, sunohara_tiaoyin:{ @@ -6880,7 +6898,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ contentAfter:function(){ var bool=false; for(var i=0;i0)?1:-2; }, @@ -6907,7 +6925,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - event.num=(!trigger.source||trigger.source.isDead()||trigger.source.sex!=player.sex)?3:1; + event.num=(!trigger.source||trigger.source.isDead()||trigger.source.differentSexFrom(player))?3:1; player.chooseTarget(get.prompt('sunohara_jianren'),'令一名角色摸'+get.cnNumber(event.num)+'张牌。').set('ai',function(target){ var att=get.attitude(player,target); if(att<=0) return 0; @@ -14491,7 +14509,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return true; }, filterTarget:function(card,player,target){ - return target.sex=='male'&&player!=target; + return target.hasSex('male')&&player!=target; }, content:function(){ "step 0" @@ -15323,7 +15341,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ riki_spwenji:'问计', riki_spwenji_info:'出牌阶段开始时,你可以令一名其他角色交给你一张牌。你于本回合内使用与该牌名称相同的牌时不能被其他角色响应。', riki_nvzhuang:'女装', - riki_nvzhuang_info:'锁定技,此武将牌的性别视为女性。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。', + riki_nvzhuang_info:'锁定技,此武将牌视为包含女性性别。结束阶段,若你:有手牌,你摸一张牌;没有手牌,你摸两张牌。', riki_mengzhong:'梦终', riki_mengzhong_info:'觉醒技,准备阶段,若你已因〖问计〗获得了三张或更多的牌,则你加1点体力上限并回复1点体力,失去〖问计〗并获得〖重振〗。', riki_chongzhen:'重振', @@ -15383,7 +15401,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kanade_benzhan:'奔战', kanade_benzhan_info:'当你使用或打出牌响应其他角色,或其他角色使用或打出牌响应你后,若此牌为:基本牌,你可令一名角色弃置两张牌或令一名角色摸两张牌;非基本牌,你可对一名角色造成1点伤害或令一名其他角色回复1点体力。', mio_tuifu:'推腐', - mio_tuifu_info:'锁定技,当一名男性角色对一名男性角色造成伤害时,你摸一张牌。', + mio_tuifu_info:'锁定技,当一名角色对一名同性角色造成伤害时,你摸一张牌。', mio_tishen:'替身', mio_tishen_info:'限定技,准备阶段,你可以将体力值回复至体力上限并摸等同于回复量的牌,然后将武将牌替换为【西园美鸟】。', midori_nonghuan:'弄幻', @@ -15443,7 +15461,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuu_lveduo_info:'每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。', yuu_lveduo_full_info:'每轮限一次,其他角色的回合开始时,若你本局游戏内未对其发动过〖掠夺〗且你的武将牌正面朝上,你可以将武将牌翻面并获得该角色本回合内的控制权。此回合结束时,你将武将牌翻回正面,获得该角色武将牌上所有的带有「Charlotte」标签的技能,且该角色失去这些技能。锁定技,若你的武将牌背面朝上,则你不能使用或打出牌。', ryoichi_baoyi:'爆衣', - ryoichi_baoyi_info:'锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①弃置一名其他男性角色区域内的两张牌。②令一名其他女性角色失去1点体力。', + ryoichi_baoyi_info:'锁定技,当你失去装备区内的一张牌后,你摸一张牌,然后选择一项:①令一名其他女性角色失去1点体力。②弃置一名其他非女性角色区域内的两张牌。', ryoichi_tuipi:'褪皮', ryoichi_tuipi_info:'锁定技,你不是【顺手牵羊】和【过河拆桥】的合法目标。你装备区的牌于弃牌阶段内计入手牌上限。', kotori_yumo:'驭魔', diff --git a/character/extra.js b/character/extra.js index 2c206fe55..6a683dbbb 100755 --- a/character/extra.js +++ b/character/extra.js @@ -607,12 +607,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dulie:{ audio:2, trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, filter:function(event,player){ - return game.players.length>1&&game.hasPlayer(function(current){ + return (event.name!='phase'||game.phaseNumber==0)&&game.players.length>1&&game.hasPlayer(function(current){ return current!=player&&!current.hasMark('dulie'); }); }, @@ -2286,11 +2286,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{ source:'damageSource', player:['damageEnd','enterGame'], - global:'gameDrawAfter', + global:'phaseBefore', }, forced:true, filter:function(event){ - return event.name!='damage'||event.num>0; + return (event.name!='damage'&&(event.name!='phase'||game.phaseNumber==0))||event.num>0; }, content:function(){ player.addMark('baonu',trigger.name=='damage'?trigger.num:2); @@ -2967,13 +2967,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qixing:{ audio:2, unique:true, - trigger:{global:'gameDrawAfter',player:'phaseZhunbeiBegin'}, - forced:true, - check:function(event,player){ - return player.hp<=1; + trigger:{ + global:'phaseBefore', + player:'enterGame', }, + forced:true, filter:function(event,player){ - return !player.storage.qixing; + return (event.name!='phase'||game.phaseNumber==0); }, content:function(){ "step 0" @@ -4001,11 +4001,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{ player:['linkBefore','enterGame'], - global:'gameDrawAfter', + global:'phaseBefore', }, forced:true, filter:function(event,player){ - return player.isLinked()==(event.name=='link'); + if(player.isLinked()) return false; + if(event.name=='link') return true; + return (event.name!='phase'||game.phaseNumber==0); }, content:function(){ if(trigger.name!='link') player.link(true); diff --git a/character/mobile.js b/character/mobile.js index e1ab675b5..7155f0607 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -578,7 +578,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skill:{ //新刘璋 jutu:{ - audio:2, + audio:'xiusheng', trigger:{player:'phaseZhunbeiBegin'}, forced:true, filter:function(event,player){ @@ -621,7 +621,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{combo:'jutu'}, }, yaohu:{ - audio:2, + audio:'yinlang', trigger:{player:'phaseBegin'}, direct:true, filter:function(event,player){ @@ -671,7 +671,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ round:{}, gain:{ - audio:'yaohu', + audio:'yinlang', trigger:{global:'phaseUseBegin'}, direct:true, filter:function(event,player){ @@ -1144,13 +1144,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ]).set('ai',function(){ if(player.countCards('hs',function(card){ return get.name(card)=='sha'&&player.hasValueTarget(card); - })>player.getCardUsable({name:'sha '})) return 0; + })>player.getCardUsable({name:'sha'})) return 0; return 1; }); 'step 1' if(result.control!='cancel2'){ player.logSkill('spyilie'); - game.log(player,'选择了【毅烈】的','#g'+result.control); + game.log(player,'选择了','#g【毅烈】','的','#y'+result.control); if(result.index%2==0) player.addTempSkill('spyilie_add','phaseUseEnd'); if(result.index>0) player.addTempSkill('spyilie_miss'); if(result.index==2) player.loseHp(); @@ -1373,7 +1373,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'damageBegin4'}, filter:function(event,player){ - return player.countCards('he',{type:'equip'})&&event.source&&event.source.sex=='male'; + return player.countCards('he',{type:'equip'})&&event.source&&event.source.hasSex('male'); }, direct:true, content:function(){ @@ -1711,7 +1711,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, usable:1, filter:function(event,player){ - return (event.card.name=='sha'||event.card.name=='juedou')&&(event.target.countGainableCards(player,'h')>0||player.hasCard(function(i){ + return (event.card.name=='sha'||event.card.name=='juedou')&&event.targets.length==1&& + (event.target.countGainableCards(player,'h')>0||player.hasCard(function(i){ return _status.connectMode||get.type(i,player)=='basic'&&lib.filter.cardDiscardable(i,player,'dbquedi'); },'h')); }, @@ -3561,11 +3562,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mjdingyi:{ audio:2, trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, locked:false, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, logTarget:function(){ return game.players; }, @@ -4654,13 +4658,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xunyi:{ audio:2, trigger:{ - global:['gameDrawAfter','dieAfter'], + global:['phaseBefore','dieAfter'], player:'enterGame', }, direct:true, filter:function(event,player){ if(event.name=='die') return event.player==player.storage.xunyi2; - return !player.storage.xunyi2; + return !player.storage.xunyi2&&(event.name!='phase'||game.phaseNumber==0); }, content:function(){ 'step 0' @@ -5793,10 +5797,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refubi:{ audio:'fubi', trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, direct:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ 'step 0' player.chooseTarget(get.prompt2('refubi'),lib.filter.notMe).set('ai',function(target){ @@ -6464,12 +6471,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, fubi:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, direct:true, skillAnimation:true, animationColor:'wood', + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ 'step 0' player.chooseTarget(get.prompt2('fubi'),lib.filter.notMe).set('ai',function(target){ @@ -7990,7 +8000,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tongqu:{ audio:2, trigger:{ - global:['gameDrawAfter','dying','phaseDrawBegin2'], + global:['phaseBefore','dying','phaseDrawBegin2'], player:['enterGame','phaseZhunbeiBegin'], }, direct:true, @@ -8000,7 +8010,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.name=='phaseZhunbei') return game.hasPlayer(function(current){ return !current.hasMark('tongqu'); }); - return !player.hasMark('tongqu'); + return !player.hasMark('tongqu')&&(event.name!='phase'||game.phaseNumber==0); }, content:function(){ 'step 0' @@ -9793,6 +9803,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ case 'thunder':name='leisha';break; case 'kami':name='kamisha';break; case 'ice':name='icesha';break; + case 'stab':name='cisha';break; } } list.add(name); @@ -9807,6 +9818,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ case 'thunder':name='leisha';break; case 'kami':name='kamisha';break; case 'ice':name='icesha';break; + case 'stab':name='cisha';break; } } list.add(name); @@ -10420,7 +10432,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', filter:function(event,player){ return game.hasPlayer(function(current){ - return current.sex=='male'; + return current.hasSex('male'); }) }, skillAnimation:true, @@ -10429,7 +10441,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addSkill('rexushen2'); player.awakenSkill('rexushen'); player.loseHp(game.countPlayer(function(current){ - return current.sex=='male'; + return current.hasSex('male'); })); }, ai:{ @@ -10437,7 +10449,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ result:{ player:function(player){ if(player.hp!=game.countPlayer(function(current){ - return current.sex=='male'; + return current.hasSex('male'); })) return 0; return game.hasPlayer(function(current){ return get.attitude(player,current)>4&¤t.countCards('h','tao') @@ -12865,7 +12877,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ player.logSkill('gnjinfan'); game.log(player,'将',result.cards,'放到了武将牌上'); - player.loseToSpecial(result.cards,'gnjinfan'); + player.loseToSpecial(result.cards,'gnjinfan').visible=true; } else event.finish(); 'step 2' diff --git a/character/rank.js b/character/rank.js index 37915dedc..a1098a6e8 100644 --- a/character/rank.js +++ b/character/rank.js @@ -710,6 +710,7 @@ window.noname_character_rank={ 'dufuren', 'yuanhuan', 'zhouyi', + 'yangzhi', ], b:[ 'diy_feishi', @@ -907,6 +908,7 @@ window.noname_character_rank={ 'duji', 'sp_chendong', 'sp_zongyu', + 'yangyan', ], bm:[ 'diy_xizhenxihong', @@ -1758,6 +1760,8 @@ window.noname_character_rank={ 'yuanhuan', 'zhouyi', 'fuqian', + 'yangyan', + 'yangzhi', ], junk:[ 'sunshao', diff --git a/character/refresh.js b/character/refresh.js index 5a1004652..141d80355 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -5813,11 +5813,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, rehuashen_init:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, popup:false, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ lib.skill.rehuashen.addHuashens(player,3); player.syncStorage('rehuashen'); @@ -7646,7 +7649,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, filterTarget:function(card,player,target){ - if(target.sex!='male') return false; + if(!target.hasSex('male')) return false; var card=ui.selected.cards[0]; if(!card) return false; if(get.position(card)=='e'&&!target.isEmpty(get.subtype(card))) return false; @@ -9225,7 +9228,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ delay:false, filter:function(event,player){ return game.hasPlayer(function(current){ - return current.sex=='male'; + return current.hasSex('male'); }); }, content:function(){ @@ -9250,7 +9253,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.showCards([event.card]); "step 2" player.chooseTarget(true,'选择一名男性角色送出'+get.translation(event.card),function(card,player,target){ - return target.sex=='male'; + return target.hasSex('male'); }).set('ai',function(target){ var att=get.attitude(_status.event.player,target); if(_status.event.neg) return -att; @@ -9266,7 +9269,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ result:{ player:function(player){ if(game.hasPlayer(function(current){ - return current.sex=='male'&&get.attitude(player,current)>0; + return current.hasSex('male')&&get.attitude(player,current)>0; })) return 2; return 0; }, @@ -10410,7 +10413,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gzquanji_info:'当你受到伤害后或当你使用牌指定唯一目标并对其造成伤害后,你可以摸一张牌,然后你将一张牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。', gzpaiyi:'排异', gzpaiyi_backup:'排异', - gzpaiyi_info:'出牌阶段限一次,你可以将移去一张“权”,然后选择一名角色并令其摸X张牌(X为“权”的数量且至多为7),若其手牌数不小于你,则你对其造成1点伤害且本技能于此回合内失效。', + gzpaiyi_info:'出牌阶段限一次。你可以移去一张“权”,然后选择一名角色并令其摸X张牌(X为“权”的数量且至多为7),若其手牌数不小于你,则你对其造成1点伤害。', ol_zhurong:'界祝融', changbiao:'长标', changbiao_info:'出牌阶段限一次,你可以将任意张手牌当做【杀】使用(无距离限制)。若你因此【杀】对目标角色造成过伤害,则你于出牌阶段结束时摸X张牌(X为此【杀】对应的实体牌数量)。', diff --git a/character/shenhua.js b/character/shenhua.js index 856de004e..36db6b137 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -1445,12 +1445,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name2:'橘', content:'当前有#个“橘”', }, - //mark:true, audio:2, trigger:{ - global:'gameDrawAfter' + global:'phaseBefore', + player:'enterGame', }, forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ player.addMark('nzry_huaiju',3); player.addSkill('nzry_huaiju_ai'); @@ -1458,7 +1461,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ group:['tachibana_effect'], }, //没错 这是个橘 - "tachibana_effect":{ + tachibana_effect:{ audio:'nzry_huaiju', trigger:{ global:['damageBegin4','phaseDrawBegin2'], @@ -1906,13 +1909,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 1:{ audio:2, trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, locked:false, filter:function(event,player){ - return !player.getStorage('nzry_mingren').length; + return !player.getStorage('nzry_mingren').length&&(event.name!='phase'||game.phaseNumber==0); }, content:function(){ 'step 0' @@ -4846,9 +4849,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(event.card.name!='sha') return false; if(player==event.player){ - return event.target.sex=='female'; + return event.target.hasSex('female'); } - return event.player.sex=='female'; + return event.player.hasSex('female'); }, check:function(event,player){ return player==event.player; @@ -4867,7 +4870,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ directHit_ai:true, skillTagFilter:function(player,tag,arg){ - if(arg.card.name!='sha'||arg.target.sex!='female'||arg.target.countCards('h','shan')>1) return false; + if(arg.card.name!='sha'||!arg.target.hasSex('female')||arg.target.countCards('h','shan')>1) return false; }, }, }, diff --git a/character/sp.js b/character/sp.js index 80c29491f..c0f5f993f 100755 --- a/character/sp.js +++ b/character/sp.js @@ -300,12 +300,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ type:'trick', enable:true, filterTarget:function(card,player,target){ - return target.countCards('h')&&target!=player&&target.sex=='male'; + return target.countCards('h')&&target!=player&&target.hasSex('male'); }, content:function(){ 'step 0' event.list=game.filterPlayer(function(current){ - return current!=player&¤t!=target&¤t.sex=='female'; + return current!=player&¤t!=target&¤t.hasSex('female'); }).sortBySeat(); 'step 1' if(target.countCards('h')&&event.list.length){ @@ -340,7 +340,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ result:{ target:function(player,target){ var num=game.countPlayer(function(current){ - return current!=player&¤t!=target&¤t.sex=='female'; + return current!=player&¤t!=target&¤t.hasSex('female'); }); var nh=target.countCards('h'); num=Math.min(num,nh); @@ -490,7 +490,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=result.targets[0]; event.target=target; player.logSkill('olfusong',target); - player.chooseControl('olfengzi','oljizhan').set('prompt','令'+get.translation(target)+'获得其中一个技能').set('ai',()=>(Math.random()>0.5?0:1)); + target.chooseControl('olfengzi','oljizhan').set('prompt','令'+get.translation(target)+'获得其中一个技能').set('ai',()=>(Math.random()>0.5?0:1)); } else event.finish(); 'step 2' @@ -1121,7 +1121,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return current.name1=='guansuo'||current.name2=='guansuo'; })){ player.chooseTarget(function(card,player,current){ - return current!=player&¤t.sex=='male'; + return current!=player&¤t.hasSex('male'); },'许身:是否令一名其他男性角色选择是否将其武将牌替换为“关索”?').set('ai',function(target){ return get.attitude(_status.event.player,target)-4; }); @@ -2340,7 +2340,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname:['machao','hansui','pangde'], trigger:{ player:'enterGame', - global:'gameDrawAfter', + global:'phaseBefore', + }, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); }, direct:true, content:function(){ @@ -3484,12 +3487,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cuorui:{ audio:2, trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, filter:function(event,player){ - return player.maxHp>0&&!get.is.single(); + return player.maxHp>0&&!get.is.single()&&(event.name!='phase'||game.phaseNumber==0); }, content:function(){ player.draw(Math.min(5,player.maxHp),false); @@ -4335,7 +4338,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget('请选择【星舞】的目标','弃置其装备区内的所有牌。然后对其造成两点伤害(目标为女性角色则改为1点)',true,lib.filter.notMe).set('ai',function(target){ return -get.attitude(_status.event.player,target)*Math.sqrt(4+target.countCards('e',function(card){ return get.value(card,target)>0; - }))*(target.sex=='female'?1:2); + }))*(target.hasSex('female')?1:2); }); 'step 7' if(result.bool&&result.targets&&result.targets.length){ @@ -4343,7 +4346,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.line(target,'green'); var num=target.countCards('e'); if(num) player.discardPlayerCard(target,'e',num,true); - target.damage(target.sex=='female'?1:2); + target.damage(target.hasSex('female')?1:2); } }, ai:{ @@ -4914,12 +4917,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, xianfu:{ trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, - filter:function(){ - return game.players.length>1; + filter:function(event){ + return game.players.length>1&&(event.name!='phase'||game.phaseNumber==0); }, audio:6, content:function(){ @@ -7506,8 +7509,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return num+player.maxHp; } }, - trigger:{global:'gameDrawAfter',player:'enterGame'}, + trigger:{global:'phaseBefore',player:'enterGame'}, forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ player.draw(player.maxHp); } @@ -7719,7 +7725,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget(get.prompt2('yongdi'),function(card,player,target){ - return (target.sex=='male'||target.name=='key_yuri')&&target!=player; + return (target.hasSex('male')||target.name=='key_yuri')&&target!=player; }).set('ai',function(target){ if(!_status.event.goon) return 0; var player=_status.event.player; @@ -8511,7 +8517,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mod:{ globalFrom:function(from,to,distance){ return distance-game.countPlayer(function(current){ - return current.sex=='female'; + return current.hasSex('female'); }); } } @@ -8949,7 +8955,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player; if(player.storage.xingwu.length==2){ if(!game.hasPlayer(function(current){ - return (current!=player&¤t.sex=='male'&& + return (current!=player&¤t.hasSex('male')&& get.damageEffect(current,player,player)>0&& get.attitude(player,current)<0) })) return 0; @@ -8978,7 +8984,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } player.unmarkSkill('xingwu'); player.chooseTarget(function(card,player,target){ - return target!=player&&target.sex=='male'; + return target!=player&&target.hasSex('male'); },'对一名男性角色造成两点伤害并弃置其装备区内的牌').set('ai',function(target){ var player=_status.event.player; if(get.attitude(player,target)>0) return -1; @@ -12092,7 +12098,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.storage.cunsi=false; }, filterTarget:function(card,player,target){ - return player!=target&&target.sex=='male'; + return player!=target&&target.hasSex('male'); }, content:function(){ "step 0" @@ -13405,7 +13411,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ - return player!=target&&target.sex=='male'; + return player!=target&&target.hasSex('male'); }, filterCard:true, position:'he', @@ -13987,11 +13993,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ init:{ audio:'xinfu_xionghuo', trigger:{ - global:"gameDrawAfter", + global:"phaseBefore", player:"enterGame", }, forced:true, locked:false, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ player.addMark("xionghuo",3); }, @@ -14582,7 +14591,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ popup:false, filter:function (event,player){ if(!event.card||event.card.name!='tao') return false; - if(!event.source||event.source.sex!='male') return false; + if(!event.source||!event.source.hasSex('male')) return false; if(!player.isDying()) return false; if(game.hasPlayer(function(current){ return current.name=='guansuo'||current.name2=='guansuo'; @@ -14675,10 +14684,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{ player:["loseAfter","enterGame"], - global:"gameDrawAfter", + global:"phaseBefore", }, filter:function (event,player){ - if(event.name!='lose') return true; + if(event.name!='lose') return (event.name!='phase'||game.phaseNumber==0); if(event.type!='discard') return false; for(var i=0;i【'+get.translation(lib.translate[i+'_ab']||get.translation(i).slice(0,2))+'】
'+get.skillInfoTranslation(i,player)+'
'; })).set('displayIndex',false).set('prompt','选择获得一个技能'); 'step 2' var skill=result.control; - event.skills.remove(skill); - target.addAdditionalSkill('jinghe_'+player.playerid,skill); - target.popup(skill); - game.log(target,'获得了技能','#g【'+get.translation(skill)+'】'); - if(event.skills.length) event.goto(1); + if(skill!='cancel2'){ + event.skills.remove(skill); + target.addAdditionalSkill('jinghe_'+player.playerid,skill); + target.popup(skill); + game.log(target,'获得了技能','#g【'+get.translation(skill)+'】'); + } + if(event.num0; - }, + frequent:true, content:function(){ - trigger.player.draw(2); + player.draw(2); }, }, nhxianshou:{ @@ -453,6 +455,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.removeSkill('zhukou'); player.addSkill('yuyun'); }, + derivation:'yuyun', }, yuyun:{ trigger:{player:'phaseUseBegin'}, @@ -1372,7 +1375,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return game.hasPlayer((current)=>lib.skill.reqingcheng.filterTarget(null,player,current)); }, filterTarget:function(card,player,target){ - return target!=player&&target.sex=='male'&&target.countCards('h')0; }, content:function(){ @@ -8308,11 +8311,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pytianjiang:{ audio:2, trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:'enterGame', }, forced:true, locked:false, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, content:function(){ 'step 0' var i=0; @@ -9260,9 +9266,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '已选择了'+get.translation(group)+'势力' }, }, - trigger:{global:['gameDrawAfter','zhuUpdate']}, + trigger:{global:['phaseBefore','zhuUpdate']}, filter:function(event,player){ - return !player.storage.bingzhao&&player.hasZhuSkill('bingzhao'); + return !player.storage.bingzhao&&player.hasZhuSkill('bingzhao')&&(event.name!='phase'||game.phaseNumber==0); }, content:function(){ 'step 0' @@ -10277,12 +10283,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xinfu_dianhu":{ audio:2, trigger:{ - global:"gameDrawAfter", + global:"phaseBefore", player:"enterGame", }, forced:true, filter:function(){ - return game.players.length>1; + return game.players.length>1&&(event.name!='phase'||game.phaseNumber==0); }, content:function(){ 'step 0' diff --git a/character/standard.js b/character/standard.js index e4cf81cde..f1b06387d 100755 --- a/character/standard.js +++ b/character/standard.js @@ -2213,7 +2213,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 4-get.value(card) }, filterTarget:function(card,player,target){ - if(target.sex!='male') return false; + if(!target.hasSex('female')) return false; if(target.hp>=target.maxHp) return false; if(target==player) return false; return true; @@ -2268,7 +2268,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, filterTarget:function(card,player,target){ - if(target.sex!='male') return false; + if(!target.hasSex('male')) return false; var card=ui.selected.cards[0]; if(!card) return false; if(get.position(card)=='e'&&target.countCards('e',{subtype:get.subtype(card)})) return false; @@ -2352,7 +2352,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 4-get.value(card) }, filterTarget:function(card,player,target){ - if(target.sex!='male') return false; + if(!target.hasSex('male')) return false; if(target.hp>=target.maxHp) return false; if(target==player) return false; return true; @@ -2549,7 +2549,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ usable:1, filter:function(event,player){ return game.countPlayer(function(current){ - return current!=player&¤t.sex=='male'; + return current!=player&¤t.hasSex('male'); })>1; }, check:function(card){return 10-get.value(card)}, @@ -2557,7 +2557,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ position:'he', filterTarget:function(card,player,target){ if(player==target) return false; - if(target.sex!='male') return false; + if(!target.hasSex('male')) return false; if(ui.selected.targets.length==1){ return target.canUse({name:'juedou'},ui.selected.targets[0]); } diff --git a/character/yijiang.js b/character/yijiang.js index f3781535d..18d3ecc7a 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -1188,11 +1188,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ priority:10, audio:'zongzuo', filter:function(event,player){ - return !player.storage.xinzongzuo; + return game.phaseNumber==0; }, content:function(){ 'step 0' - player.storage.xinzongzuo=true; var num=game.countGroup(); player.gainMaxHp(num); event.num=num; @@ -3227,7 +3226,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{global:'phaseJieshuBegin'}, filter:function(event,player){ - return event.player!=player&&event.player.sex=='male'&&ui.cardPile.childElementCount<=player.hp*10; + return event.player!=player&&event.player.hasSex('male')&&ui.cardPile.childElementCount<=player.hp*10; }, check:function(event,player){ return get.attitude(player,event.player)<0&&get.effect(event.player,{name:'sha'},player,player)>0; @@ -4709,11 +4708,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ priority:10, audio:2, filter:function(event,player){ - return !player.storage.zongzuo; + return game.phaseNumber==0; }, content:function(){ 'step 0' - player.storage.zongzuo=true; var num=game.countGroup(); player.gainMaxHp(num); event.num=num; @@ -8042,7 +8040,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget(get.prompt('yanyu'),'令一名男性角色摸两张牌',function(card,player,target){ - return target.sex=='male'&&target!=player; + return target.hasSex('male')&&target!=player; }).set('ai',function(target){ return get.attitude(_status.event.player,target); }); @@ -9186,7 +9184,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'damageBegin3'}, filter:function(event,player){ - return player.countCards('he',{type:'equip'})&&event.source&&event.source.sex=='male'; + return player.countCards('he',{type:'equip'})&&event.source&&event.source.hasSex('male'); }, direct:true, content:function(){ @@ -9318,7 +9316,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{target:'useCardToTargeted'}, filter:function(event,player){ - return (event.card.name=='sha'||get.type(event.card)=='trick')&&event.player&&event.player.sex=='male'&&player.countCards('he',function(card){ + return (event.card.name=='sha'||get.type(event.card)=='trick')&&event.player&&event.player.hasSex('male')&&player.countCards('he',function(card){ return _status.connectMode||get.type(card)=='equip'; }); }, diff --git a/character/yingbian.js b/character/yingbian.js index 3a2a14384..f8d168d4e 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -4,6 +4,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'yingbian', connect:true, character:{ + yangzhi:['female','jin',3,['wanyi','maihuo']], + yangyan:['female','jin',3,['xuanbei','xianwan']], zuofen:['female','jin',3,['zhaosong','lisi'],['unseen']], ol_huaxin:['male','wei',3,['caozhao','olxibing']], zhongyan:['female','jin',3,['bolan','yifa']], @@ -28,9 +30,205 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yingbian_pack2:['jin_simashi','jin_xiahouhui','zhanghuyuechen','shibao','jin_yanghuiyu'], yingbian_pack3:['jin_simazhao','jin_wangyuanji','duyu','weiguan'], yingbian_pack4:['zhongyan'], + yingbian_pack5:['yangyan','yangzhi'], }, }, skill:{ + wanyi:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return player.hasCard(function(i){ + return get.is.yingbian(i); + },'hs'); + }, + chooseButton:{ + dialog:function(){ + return ui.create.dialog('婉嫕',[['zhujinqiyuan','chuqibuyi','shuiyanqijunx','dongzhuxianji'],'vcard'],'unseen'); + }, + filter:function(button,player){ + return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); + }, + check:function(button){ + return _status.event.player.getUseValue({name:button.link[2]}); + }, + backup:function(links){ + return { + audio:'wanyi', + popname:true, + viewAs:{ + name:links[0][2], + }, + filterCard:function(card){ + return get.is.yingbian(card); + }, + check:function(card){ + return 1/Math.max(1,get.value(card)); + }, + position:'hs', + } + }, + prompt:function(links){ + return '将一张应变牌当做'+get.translation(links[0][2])+'使用'; + }, + }, + subSkill:{backup:{}}, + ai:{order:8,result:{player:1}}, + }, + maihuo:{ + audio:2, + trigger:{target:'useCardToTargeted'}, + logTarget:'player', + filter:function(event,player){ + return event.card.name=='sha'&&event.card.isCard&&event.getParent(2).name!='maihuo_effect'&& + event.cards.filterInD().length>0&&event.targets.length==1&& + event.player.isIn()&&(!event.player.storage.maihuo_effect||!event.player.storage.maihuo_effect.length); + }, + check:function(event,player){ + return get.effect(player,event.card,event.player,player)<0; + }, + content:function(){ + trigger.excluded.add(player); + var target=trigger.player,cards=trigger.cards.filterInD(); + game.cardsGotoSpecial(cards); + target.markAuto('maihuo_effect',cards); + target.storage.maihuo_target=player; + target.addSkill('maihuo_effect') + }, + group:'maihuo_damage', + subSkill:{ + effect:{ + trigger:{player:'phaseUseBegin'}, + forced:true, + charlotte:true, + filter:function(event,player){ + if(!player.storage.maihuo_effect||!player.storage.maihuo_effect.length) return false; + var card=player.storage.maihuo_effect[0]; + if(card.name!='sha') card=get.autoViewAs({ + name:'sha', + isCard:true, + },player.storage.maihuo_effect); + var target=player.storage.maihuo_target; + if(!card||!target||!target.isIn()||!player.canUse(card,target,false)) return false; + return true; + }, + content:function(){ + var card=player.storage.maihuo_effect[0]; + if(card.name!='sha') card=get.autoViewAs({ + name:'sha', + isCard:true, + },player.storage.maihuo_effect); + var target=player.storage.maihuo_target; + player.useCard(card,target,player.storage.maihuo_effect,false); + delete player.storage.maihuo_effect; + player.removeSkill('maihuo_effect'); + }, + intro:{ + content:'cards', + onunmark:'throw', + }, + ai:{threaten:1.05}, + }, + damage:{ + trigger:{source:'damageSource'}, + forced:true, + locked:false, + filter:function(event,player){ + return event.player.hasSkill('maihuo_effect')&&event.player.storage.maihuo_effect&&event.player.storage.maihuo_effect.length>0; + }, + content:function(){ + trigger.player.removeSkill('maihuo_effect'); + game.delayx(); + }, + }, + }, + }, + xuanbei:{ + audio:2, + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, + forced:true, + locked:false, + content:function(){ + var cards=[]; + while(cards.length<2){ + var card=get.cardPile2(function(i){ + return get.is.yingbian(i)&&!cards.contains(i); + }); + if(!card) break; + else cards.push(card); + } + if(cards.length) player.gain(cards,'gain2'); + }, + group:'xuanbei_give', + subSkill:{ + give:{ + trigger:{player:'useCardAfter'}, + usable:1, + filter:function(event,player){ + return event.card.yingbian&&event.cards.filterInD().length>0; + }, + direct:true, + content:function(){ + 'step 0' + event.cards=trigger.cards.filterInD(); + player.chooseTarget(get.prompt('xuanbei'),'令一名其他角色获得'+get.translation(event.cards),lib.filter.notMe).set('ai',function(target){ + var att=get.attitude(_status.event.player,target); + if(att<3) return 0; + if(target.hasJudge('lebu')) att/=2; + if(target.hasSkillTag('nogain')) att/=10; + return att/(1+get.distance(player,target,'absolute')); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('xuanbei_give',target); + target.gain(cards,'gain2'); + } + else player.storage.counttrigger.xuanbei_give--; + }, + ai:{expose:0.1}, + }, + }, + }, + xianwan:{ + audio:2, + enable:'chooseToUse', + filter:function(event,player){ + return event.filterCard&&event.filterCard({ + name:'sha'+(player.isLinked()?'':'n'), + isCard:true, + },player,event); + }, + viewAs:function(cards,player){ + return { + name:'sha'+(player.isLinked()?'':'n'), + isCard:true, + }; + }, + filterCard:()=>false, + selectCard:-1, + prompt:'将武将牌横置并视为使用【杀】', + log:false, + check:()=>1, + precontent:function(){ + player.logSkill('xianwan'); + player.link(); + }, + ai:{ + order:2, + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag){ + return tag==('respondSha'+(player.isLinked()?'':'n')); + }, + }, + }, recaiwang:{ audio:'caiwang', inherit:'caiwang', @@ -960,6 +1158,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ var evt=event.getl(player); if(!evt||!evt.es||!evt.es.length) return false; + if(event.name=='equip'&&event.player==player) return false; for(var i of evt.es){ if(get.subtype(i,false)=='equip5') return true; } @@ -2232,14 +2431,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xijue:{ audio:2, trigger:{ - global:'gameDrawAfter', + global:'phaseBefore', player:['enterGame','showCharacterAfter'], }, forced:true, filter:function(event,player){ if(player._xijue) return false; if(get.mode()=='guozhan') return event.name=='showCharacter'&&event.toShow&&event.toShow.contains('gz_zhanghuyuechen'); - return event.name!='showCharacter'; + return (event.name!='showCharacter')&&(event.name!='phase'||game.phaseNumber==0); }, content:function(){ player.addMark('xijue',4); @@ -2498,6 +2697,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ weiguan:'卫瓘(220年-291年),字伯玉。河东郡安邑县(今山西省夏县)人。三国曹魏后期至西晋初年重臣、书法家,曹魏尚书卫觊之子。卫瓘出身官宦世家,年轻时仕官于曹魏,历任尚书郎、散骑常侍、侍中、廷尉等职。后以镇西军司、监军身份参与伐蜀战争。蜀汉亡后,与钟会一道逮捕邓艾;钟会谋反时,又成功平息叛乱,命田续杀邓艾父子。回师后转任督徐州诸军事、镇东将军,封菑阳侯。西晋建立后,历任青州、幽州刺史、征东大将军等职,成功化解北方边境威胁,因功进爵菑阳公。后入朝为尚书令、侍中,又升任司空,领太子少傅。后逊位,拜太保。晋惠帝即位后,与贾皇后对立,终在政变中满门遇害,享年七十二岁。卫瓘善隶书及章草。不仅兼工各体,还能学古人之长,是颇有创意的书法家。唐朝张怀瓘《书断》中评其章草为“神品”。', zhongyan:' 钟琰 (?—?年)颍川人,王浑之妻。生卒年不详,约魏末晋初间前后在世。王浑的妻子钟琰,是颍川人,为魏太傅钟繇的曾孙女,父亲钟徽,为黄门郎。她平时广泛阅读各种书籍,因此几岁的时候就能撰写文章。她聪慧弘雅,善于啸咏,她的礼仪法度,为中表所推崇,她写有文集五卷。', zuofen:'左芬(约253年-300年4月23日),出土墓志作左棻,字兰芝,齐国临淄(今山东临淄)人,西晋诗人。少好学,善属文。为晋武帝贵人。今存诗、赋、颂、赞、诔等20余篇,大都为应诏而作,《离思赋》最著名。原有集,已失传。', + yangyan:'杨艳(238年-274年8月25日),字琼芝,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第一任皇后,曹魏通事郎杨炳之女。自幼父母双亡,为舅舅赵俊所养,跟随继母段氏生活。聪明贤慧,善于书法,天生丽质,娴熟女红,嫁给了世子司马炎。泰始元年(265年),晋武帝即位,建立西晋。泰始二年(266年),杨艳受册为皇后,深得晋武帝宠幸,生下三子三女,包括晋惠帝司马衷。泰始十年(274年),去世,时年三十七,陪葬于峻阳陵,谥号武元皇后。', + yangzhi:'杨芷(259年-292年3月6日),字季兰,小字男胤,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第二任皇后,东汉太尉杨震幼子杨奉后裔,东汉末年东莱太守、蓩亭侯杨众曾孙女,西晋太傅杨骏与嫡妻庞氏之女,武元皇后杨艳堂妹。咸宁二年(276年),立为皇后,史称“婉嫕有妇德, 美映椒房”,得宠于晋武帝。生渤海殇王,早薨,之后再无生育。其父杨骏擅权引起皇后贾南风忌恨,贾南风联络汝南王司马亮、楚王司马玮发动政变,杀死杨骏,并唆使大臣上书状告杨芷谋反,让晋惠帝司马衷将其贬为庶人,押到金墉城居住。元康二年(292年),杨芷冻饿而死,谥号武悼皇后。', }, characterTitle:{}, perfectPair:{}, @@ -2654,11 +2855,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ recaiwang_hand:'才望', recaiwang_equip:'才望', recaiwang_judge:'才望', + yangyan:'杨艳', + xuanbei:'选备', + xuanbei_info:'①游戏开始时,你从牌堆中获得两张具有应变标签的牌。②每回合限一次。当你使用的满足应变效果的牌结算结束后,你可将此牌对应的所有实体牌交给一名其他角色。', + xianwan:'娴婉', + xianwan_info:'①当你需要使用【闪】时,若你的武将牌未横置,则你可以横置武将牌并视为使用【闪】。②当你需要使用【杀】时,若你的武将牌横置,则你可以横置武将牌并视为使用【杀】。', + yangzhi:'杨芷', + wanyi:'婉嫕', + wanyi_info:'出牌阶段,你可以将一张具有应变效果的牌当做【逐近弃远】/【出其不意】/【水淹七军】/【洞烛先机】使用。', + maihuo:'埋祸', + maihuo_info:'①当你成为其他角色使用【杀】的目标后,若此【杀】不为转化牌且有对应的实体牌且其武将牌上没有“祸”且你是此牌的唯一目标,则你可以令此牌对你无效,并将此【杀】置于其武将牌上,称为“祸”。②一名其他角色的出牌阶段开始时,若其武将牌上有“祸”,则其对你使用此“祸”。③当你对有“祸”的其他角色造成伤害后,你移去其“祸”。', yingbian_pack1:'文德武备·理', yingbian_pack2:'文德武备·备', yingbian_pack3:'文德武备·果', yingbian_pack4:'文德武备·戒', + yingbian_pack5:'文德武备·约', }, }; }); diff --git a/game/asset.js b/game/asset.js index dea1540dd..ce3422c46 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.110.9.4', + 'v1.9.110.10', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -4155,6 +4155,18 @@ window.noname_asset_list=[ 'image/card/toushiche.png', 'image/card/kano_paibingbuzhen.png', 'image/card/qizhengxiangsheng.png', + 'image/card/chenghuodajie.png', + 'image/card/cisha.png', + 'image/card/duanjian.png', + 'image/card/guaguliaodu.png', + 'image/card/qixingbaodao.png', + 'image/card/serafuku.png', + 'image/card/tuixinzhifu.png', + 'image/card/xinge.png', + 'image/card/yinfengyi.png', + 'image/card/yitianjian.png', + 'image/card/yonglv.png', + 'image/card/zhanxiang.png', 'image/character/shenpei.jpg', 'image/character/re_menghuo.jpg', @@ -4624,6 +4636,8 @@ window.noname_asset_list=[ 'image/character/tw_fuwan.jpg', 'image/character/yuanhuan.jpg', 'image/character/zhouyi.jpg', + 'image/character/yangyan.jpg', + 'image/character/yangzhi.jpg', 'image/character/baiwuchang.jpg', 'image/character/baosanniang.jpg', diff --git a/game/config.js b/game/config.js index c9f019328..efc5b9b22 100644 --- a/game/config.js +++ b/game/config.js @@ -22,7 +22,7 @@ window.config={ connect_zhinang_tricks:['guohe','wuxie','wuzhong','dongzhuxianji'], all:{ sgscharacters:['standard','shenhua','xinghuoliaoyuan','refresh','yijiang','sp','sp2','extra','old','mobile','tw','yingbian','offline'], - sgscards:['standard','extra','sp','guozhan','zhulu','yingbian'], + sgscards:['standard','extra','sp','guozhan','zhulu','yingbian','yongjian'], sgsmodes:['identity','guozhan','versus','doudizhu','single','brawl','connect'], stockmode:['identity','guozhan','versus','boss','doudizhu','single','chess','stone','connect','brawl','tafang'], stockextension:['boss','cardpile','coin','wuxing'], @@ -133,10 +133,10 @@ window.config={ right_click:'pause', sort:'type_sort', - cards:['standard','ex','extra','sp','classic','basic'], + cards:['standard','extra'], characters:['standard','shenhua','sp','sp2','yijiang','refresh','xinghuoliaoyuan','mobile','extra','yingbian'], connect_characters:['diy'], - connect_cards:['huanlekapai','guozhan','sp','zhulu','yingbian'], + connect_cards:['huanlekapai','guozhan','sp','zhulu','yingbian','yongjian'], plays:[], extensions:[], banned:[], diff --git a/game/game.js b/game/game.js index 161a62a43..274f99bd6 100644 --- a/game/game.js +++ b/game/game.js @@ -10230,6 +10230,7 @@ poison:"毒", kami:'神', ice:'冰', + stab:'刺', wei:'魏', shu:'蜀', wu:'吴', @@ -10402,8 +10403,8 @@ else if(typeof select=='function') range=select(card,player); game.checkMod(card,player,range,'selectTarget',player); } - if(info.notarget||range[1]==-1){ - if(!info.notarget&&range[1]==-1){ + if(info.notarget||range[1]<=-1){ + if(!info.notarget&&range[1]<=-1){ for(var i=0;i=8&&get.type(card)!='equip')?-10:0; - if(card.name=='du') addi+=5; + if(card.name=='du') addi-=3; var source=_status.event.source; var player=_status.event.player; var getn=function(card){ @@ -20119,7 +20147,7 @@ next._triggered=null; next.notrigger=true; } - else if(get.itemtype(arguments[i])=='nature'){ + else if(get.itemtype(arguments[i])=='nature'&&arguments[i]!='stab'){ next.nature=arguments[i]; } } @@ -21419,7 +21447,7 @@ this.popup(skill); game.log(this,'获得了技能','#g【'+get.translation(skill)+'】'); }, - addSkill:function(skill,checkConflict,nobroadcast){ + addSkill:function(skill,checkConflict,nobroadcast,addToSkills){ if(Array.isArray(skill)){ for(var i=0;i'; @@ -27959,7 +27995,7 @@ }, suit:['club','spade','diamond','heart'], group:['wei','shu','wu','qun','jin','shen'], - nature:['fire','thunder','poison','kami','ice'], + nature:['fire','thunder','poison','kami','ice','stab'], linked:['fire','thunder','kami','ice'], groupnature:{ shen:'thunder', @@ -32614,7 +32650,7 @@ if(ui.selected.buttons.lengthitem.offsetTop&&eyitem.offsetTop&&ey=range[0]){ ok=true; } - if(range[1]==-1){ + if(range[1]<=-1){ if(ui.selected.cards.length==0) return true; j=0; for(i=0;iplayer.hp) list.push('令其失去'+get.cnNumber(target.hp-player.hp)+'点体力'); if(!list.length) event.finish(); - else if(list.length==1) event.result={index:0}; + else if(list.length==1) event._result={index:0}; else player.chooseControl().set('choiceList',list).set('prompt','令'+get.translation(target)+'执行一项').set('ai',function(){ var player=_status.event.player,target=_status.event.getParent().target; return (target.hp-player.hp)>(Math.min(target.maxHp,target.countCards('h'))/2)?1:0;