diff --git a/audio/skill/reganglie1 .mp3 b/audio/skill/reganglie1.mp3 similarity index 100% rename from audio/skill/reganglie1 .mp3 rename to audio/skill/reganglie1.mp3 diff --git a/audio/skill/rejianxiong.mp3 b/audio/skill/rejianxiong1.mp3 similarity index 100% rename from audio/skill/rejianxiong.mp3 rename to audio/skill/rejianxiong1.mp3 diff --git a/card/extra.js b/card/extra.js index 4fe4f7b46..a5d21fe18 100644 --- a/card/extra.js +++ b/card/extra.js @@ -124,6 +124,17 @@ card.extra={ }, target:function(player,target){ if(target.skills.contains('huogong2')||target.num('h')==0) return 0; + if(target==player){ + if(_status.event.filterCard({name:'huogong'})){ + return -1.5; + } + if(_status.event.skill){ + var viewAs=get.info(_status.event.skill).viewAs; + if(viewAs=='huogong') return -1.5; + if(viewAs&&viewAs.name=='huogong') return -1.5; + } + return 0; + } return -1.5; } }, diff --git a/card/shenqi.js b/card/shenqi.js index 4d5b85150..56f958658 100644 --- a/card/shenqi.js +++ b/card/shenqi.js @@ -175,6 +175,7 @@ card.shenqi={ shouna:{ trigger:{global:'discardAfter'}, filter:function(event,player){ + if(player.skills.contains('shouna2')) return false; if(_status.currentPhase==event.player) return false; if(event.player==player) return false; for(var i=0;i2) return 0; + var nh=target.num('h'); + var keep=false; + if(nh<=target.hp){ + keep=true; + } + else if(nh==target.hp+1&&target.hp>=3){ + keep=true; + } + if(target.hp>=2&&keep&&target.hasFriend()){ + if(target.hp>2) return 0; + if(target.hp==2){ + for(var i=0;i=3&&game.players[i].hp<=1){ + return 0; + } + } + } + } if(target.hp<0&&target!=player&&target.identity!='zhu') return 0; var att=ai.get.attitude(player,target); if(att<3&&att>=0) return 0; @@ -908,11 +925,15 @@ card.standard={ } else{ if(!card.expired){ + var target=player.next; + if(target.num('j','shandian')&&!target.next.num('j','shandian')){ + target=target.next; + } if(card.name!='shandian'){ - player.next.addJudge('shandian',card); + target.addJudge('shandian',card); } else{ - player.next.addJudge(card); + target.addJudge(card); } } else{ @@ -922,7 +943,16 @@ card.standard={ }, cancel:function(){ if(!card.expired){ - player.next.addJudge(card); + var target=player.next; + if(target.num('j','shandian')&&!target.next.num('j','shandian')){ + target=target.next; + } + if(card.name!='shandian'){ + target.addJudge('shandian',card); + } + else{ + target.addJudge(card); + } } else{ card.expired=false; @@ -1486,7 +1516,7 @@ card.standard={ ["spade",6,"qinggang"], ["spade",5,"qinglong"], ["spade",12,"zhangba"], - ["spade",5,"guanshi"], + ["diamond",5,"guanshi"], ["diamond",12,"fangtian"], ["heart",5,"qilin"], diff --git a/card/yibao.js b/card/yibao.js index 8a1def314..d3f4fab24 100644 --- a/card/yibao.js +++ b/card/yibao.js @@ -34,6 +34,10 @@ card.yibao={ } else{ if(!card.expired){ + var target=player.next; + if(target.num('j','huoshan')&&!target.next.num('j','huoshan')){ + target=target.next; + } if(card.name!='huoshan'){ player.next.addJudge('huoshan',card); } @@ -47,7 +51,21 @@ card.yibao={ } }, cancel:function(){ - player.next.addJudge(card); + if(!card.expired){ + var target=player.next; + if(target.num('j','huoshan')&&!target.next.num('j','huoshan')){ + target=target.next; + } + if(card.name!='huoshan'){ + player.next.addJudge('huoshan',card); + } + else{ + player.next.addJudge(card); + } + } + else{ + card.expired=false; + } }, ai:{ basic:{ @@ -131,11 +149,15 @@ card.yibao={ } else{ if(!card.expired){ + var target=player.next; + if(target.num('j','hongshui')&&!target.next.num('j','hongshui')){ + target=target.next; + } if(card.name!='hongshui'){ - player.next.addJudge('hongshui',card); + target.addJudge('hongshui',card); } else{ - player.next.addJudge(card); + target.addJudge(card); } } else{ @@ -144,7 +166,21 @@ card.yibao={ } }, cancel:function(){ - player.next.addJudge(card); + if(!card.expired){ + var target=player.next; + if(target.num('j','hongshui')&&!target.next.num('j','hongshui')){ + target=target.next; + } + if(card.name!='hongshui'){ + target.addJudge('hongshui',card); + } + else{ + target.addJudge(card); + } + } + else{ + card.expired=false; + } }, ai:{ basic:{ diff --git a/character/diy.js b/character/diy.js index 2f50a4741..1237758be 100644 --- a/character/diy.js +++ b/character/diy.js @@ -239,6 +239,7 @@ character.diy={ ai:{ skillTagFilter:function(player){ if(player.storage.guihan) return false; + if(player.hp>0) return false; }, save:true, result:{ diff --git a/character/fire.js b/character/fire.js index 0460b8842..b1939c146 100644 --- a/character/fire.js +++ b/character/fire.js @@ -136,6 +136,7 @@ character.fire={ ai:{ skillTagFilter:function(player){ if(player.storage.niepan) return false; + if(player.hp>0) return false; }, save:true, result:{ diff --git a/character/gujian.js b/character/gujian.js index 1da9cb560..b0d979cea 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -533,6 +533,10 @@ character.gujian={ }, ai:{ save:true, + skillTagFilter:function(player){ + if(player.storage.shahun) return false; + if(player.hp>0) return false; + }, result:{ player:3 } diff --git a/character/hearth.js b/character/hearth.js index 045bb236b..ffb761eac 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -1,51 +1,519 @@ 'use strict'; character.hearth={ character:{ - // hs_jaina:['female','wei',3,[],['fullskin']], - // hs_rexxar:['male','qun',4,[],['fullskin']], - // hs_uther:['male','qun',4,[],['fullskin']], - // hs_garrosh:['male','qun',4,[],['fullskin']], + hs_jaina:['female','wei',3,['huopu','bianxing','bingjia'],['fullskin']], + hs_rexxar:['male','qun',4,['shoulie','gongji'],['fullskin']], + hs_uther:['male','qun',4,['fengxian','jieming'],['fullskin']], + hs_garrosh:['male','qun',4,['zhanhou','qiangxi'],['fullskin']], hs_malfurion:['male','wu',4,['jihuo'],['fullskin']], - hs_guldan:['male','wei',3,['fenliu','hongxi'],['fullskin']], - // hs_anduin:['male','qun',4,[],['fullskin']], - hs_thrall:['male','qun',4,['tuteng','tzhenji'],['fullskin']], + hs_guldan:['male','qun',3,['fenliu','hongxi'],['fullskin']], + hs_anduin:['male','qun',3,['shengguang','shijie','anying'],['fullskin']], + hs_thrall:['male','wu',4,['tuteng','tzhenji'],['fullskin']], hs_waleera:['female','qun',3,['jianren','mengun','wlianji'],['fullskin']], - hs_medivh:['male','wei',3,['jingxiang','moying','xianzhi'],['fullskin']], - // hs_alleria:['male','qun',3,[],['fullskin']], - // hs_magni:['male','qun',3,['jingxiang'],['fullskin']], + hs_medivh:['male','wei',3,['jingxiang','moying','mdzhoufu'],['fullskin']], + hs_alleria:['male','wu',3,['fengxing','qiaodong','liegong'],['fullskin']], + hs_magni:['male','qun',4,['zhongjia','dunji'],['fullskin']], }, skill:{ - moying:{ - trigger:{player:'phaseEnd'}, + zhongjia:{ + trigger:{player:'damageEnd'}, + forced:true, + filter:function(event){ + return event.num>0; + }, + content:function(){ + player.changeHujia(); + }, + ai:{ + nohujia:true, + skillTagFilter:function(player){ + return player.hp>1; + }, + threaten:function(player,target){ + if(!target.hujia) return 0.8; + }, + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + if(player.skills.contains('jueqing')) return [1,-1]; + return 0.8; + } + } + } + } + }, + dunji:{ + enable:'phaseUse', filter:function(event,player){ - return !player.getStat('damage'); + return player.hujia?true:false; + }, + filterTarget:function(card,player,target){ + return player!=target; + }, + selectTarget:function(){ + return [1,_status.event.player.hujia]; + }, + content:function(){ + if(target==targets[0]){ + player.changeHujia(-player.hujia); + } + target.damage(); + }, + ai:{ + order:9, + result:{ + target:function(player,target){ + return ai.get.damageEffect(target,player,target)+0.5; + } + } + } + }, + fengxing:{ + trigger:{player:['useCard','respondAfter']}, + frequent:true, + filter:function(event){ + return event.card&&event.card.name=='sha'; + }, + content:function(){ + player.draw(); + } + }, + fengxian:{ + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + return target.num('h')>0; + }, + selectTarget:-1, + content:function(){ + target.chooseToDiscard(true); + }, + ai:{ + order:8, + result:{ + target:function(player,target){ + var nh=target.num('h'); + switch(nh){ + case 0:return 0; + case 1:return -1.5; + case 2:return -1.3; + case 3:return -1; + default:return -0.8; + } + } + } + } + }, + qiaodong:{ + enable:['chooseToRespond'], + filterCard:{type:'equip'}, + viewAs:{name:'shan'}, + position:'he', + prompt:'将一张装备牌当闪使用或打出', + check:function(){return 1}, + ai:{ + respondShan:true, + skillTagFilter:function(player){ + if(!player.num('he',{type:'equip'})) return false; + } + } + }, + zhanhou:{ + init:function(player){ + player.forcemin=true; + }, + enable:'phaseUse', + filterCard:{type:'equip'}, + check:function(){ + return 1; + }, + content:function(){ + player.changeHujia(); + }, + ai:{ + order:2, + result:{ + player:1 + } + }, + mod:{ + globalFrom:function(from,to,distance){ + return distance-from.hujia; + } + }, + }, + shijie:{ + trigger:{player:'phaseEnd'}, + direct:true, + filter:function(event,player){ + for(var i=0;i0; + }).ai=function(target){ + return 11-ai.get.attitude(player,target); + }; + 'step 1' + if(result.bool){ + player.logSkill('shijie',result.targets); + var target=result.targets[0]; + player.gain(target.get('h').randomGet()); + event.target=target; + target.$give(1,player); + game.delay(); + event.target.draw(); + } + }, + ai:{ + expose:0.1 + } + }, + shengguang:{ + enable:'phaseUse', + filterCard:{color:'red'}, + filter:function(event,player){ + return player.num('he',{color:'red'})>0; + }, + position:'he', + usable:1, + check:function(card){ + return 9-ai.get.value(card) + }, + filterTarget:function(card,player,target){ + if(player.storage.anying) return true; + if(target.hp>=target.maxHp) return false; + return true; + }, + content:function(){ + 'step 0' + if(player.storage.anying){ + target.loseHp(); + event.finish(); + } + else{ + target.recover(); + } + 'step 1' + if(target.hpplayer.hp) return 5; + return 2; + } + }, + threaten:2, + expose:0.2 + } + }, + xinci:{ + enable:'phaseUse', + filterCard:{color:'black'}, + filter:function(event,player){ + return player.num('he',{color:'black'})>0; + }, + position:'he', + usable:1, + mark:true, + intro:{ + content:'已进入暗影形态' + }, + check:function(card){ + return 9-ai.get.value(card) + }, + filterTarget:true, + content:function(){ + target.loseHp(); + }, + ai:{ + order:9, + result:{ + target:-1 + }, + threaten:2, + expose:0.2 + } + }, + anying:{ + unique:true, + enable:'phaseUse', + filter:function(event,player){ + return !player.storage.anying&&player.num('he',{color:'black'})>1; + }, + selectCard:2, + filterCard:{color:'black'}, + position:'he', + check:function(card){ + return 5-ai.get.value(card); + }, + content:function(){ + player.storage.anying=true; + player.removeSkill('shengguang'); + player.addSkill('xinci'); + }, + ai:{ + order:1, + result:{ + player:1 + } + } + }, + bianxing:{ + trigger:{global:'useCard'}, + filter:function(event,player){ + if(player.skills.contains('bianxing2')) return false; + if(event.player==player) return false; + if(_status.currentPhase!=event.player) return false; + if(!event.targets) return false; + if(event.targets.length!=1) return false; + var hs=player.get('h'); + for(var i=0;i=1){ + return true; + } + } + } + } + return false; }, direct:true, content:function(){ - "step 0" - player.chooseTarget('是否发动【魔影】?').ai=function(target){ - if(player.skills.contains('xianzhi')){ - return -ai.get.attitude(player,target); + 'step 0' + var eff=ai.get.effect(trigger.targets[0],trigger.card,trigger.player,player); + var att=ai.get.attitude(player,trigger.player); + player.chooseCard('是否发动【变形】?',function(card){ + if(card.name!=trigger.card.name&& + lib.filter.filterTarget(card,trigger.player,trigger.targets[0])){ + var select=get.select(get.info(card).selectTarget); + if(select[0]<=1&&select[1]>=1){ + return true; + } } - return 0; + return false; + }).ai=function(card){ + if(att>=0) return 0; + return ai.get.effect(trigger.targets[0],card,trigger.player,player)-eff; }; - "step 1" + 'step 1' if(result.bool){ - event.target=result.targets[0]; - event.target.judge(function(card){ - return get.color(card)=='red'?1:-1; - }); - player.logSkill('moying',event.target); + var card=result.cards[0]; + player.lose(result.cards); + event.cards=result.cards; + player.logSkill('bianxing',trigger.player); + game.delay(0.5); + trigger.untrigger(); + trigger.card=card; + trigger.cards=[card]; + player.addTempSkill('bianxing2','phaseAfter'); } else{ event.finish(); } - "step 2" - if(result.bool){ - event.target.draw(); + 'step 2' + player.$throw(event.cards); + game.delay(); + trigger.trigger('useCard'); + }, + ai:{ + expose:0.2, + threaten:1.8 + } + }, + bingjia:{ + enable:'phaseUse', + filter:function(event,player){ + return !player.skills.contains('bingjia2'); + }, + filterCard:{color:'black'}, + check:function(card){ + return 6-ai.get.value(card); + }, + discard:false, + prepare:function(cards,player){ + player.$give(1,player); + }, + content:function(){ + player.storage.bingjia=cards[0]; + player.addSkill('bingjia2'); + }, + ai:{ + order:1, + result:{ + player:1 + } + } + }, + bingjia2:{ + mark:true, + trigger:{target:'useCardToBegin'}, + forced:true, + filter:function(event,player){ + return event.player!=player&&event.card.number==player.storage.bingjia.number; + }, + content:function(){ + 'step 0' + player.showCards([player.storage.bingjia],get.translation(player)+'发动了【冰甲】'); + 'step 1' + ui.discardPile.appendChild(player.storage.bingjia); + delete player.storage.bingjia; + player.changeHujia(2); + player.removeSkill('bingjia2'); + }, + intro:{ + mark:function(dialog,content,player){ + if(player==game.me||player.isUnderControl()){ + dialog.add([player.storage.bingjia]); + } + else{ + return '已发动冰甲'; + } + }, + content:function(content,player){ + if(player==game.me||player.isUnderControl()){ + return get.translation(player.storage.bingjia); + } + return '已发动冰甲'; + } + } + }, + bianxing2:{}, + moying:{ + trigger:{player:'phaseBegin'}, + filter:function(){ + for(var i=0;i0; + }, + filterTarget:function(card,player,target){ + return player!=target&&!target.skills.contains('mdzhoufu2'); + }, + prepare:function(cards,player){ + player.$throw(cards); + }, + discard:false, + content:function(){ + target.$gain2(cards); + target.storage.mdzhoufu2=cards[0]; + target.addSkill('mdzhoufu2'); + target.storage.mdzhoufu3=player; + ui.special.appendChild(cards[0]); + }, + check:function(card){ + return 3-ai.get.value(card) + }, + ai:{ + expose:0.1, + order:1, + result:{ + player:1 + } + } + }, + mdzhoufu2:{ + trigger:{player:'judge'}, + forced:true, + priority:10, + mark:'card', + content:function(){ + "step 0" + ui.discardPile.appendChild(player.storage.mdzhoufu2); + player.$throw(player.storage.mdzhoufu2); + if(player.storage.mdzhoufu3.isAlive()){ + player.storage.mdzhoufu3.draw(); } else{ + game.delay(1.5); + } + "step 1" + player.judging=player.storage.mdzhoufu2; + trigger.position.appendChild(player.storage.mdzhoufu2); + // trigger.untrigger(); + game.log(get.translation(player)+'的判定牌改为'+get.translation(player.storage.mdzhoufu2)); + player.removeSkill('mdzhoufu2'); + delete player.storage.mdzhoufu2; + delete player.storage.mdzhoufu3; + }, + intro:{ + content:'card' + }, + }, + moying_old:{ + trigger:{player:'damageEnd',source:'damageEnd'}, + check:function(event,player){ + var target=(player==event.player)?event.source:event.player; + return ai.get.attitude(player,target)<0; + }, + filter:function(event,player){ + var target=(player==event.player)?event.source:event.player; + return target.isAlive(); + }, + prompt:function(event,player){ + var target=(player==event.player)?event.source:event.player; + return '是否对'+get.translation(target)+'发动【魔影】?'; + }, + content:function(){ + "step 0" + event.target=(player==trigger.player)?trigger.source:trigger.player; + event.target.judge(function(card){ + return get.color(card)=='black'?-1:0; + }); + "step 1" + if(result.color=='black'){ event.target.loseHp(); } }, @@ -56,7 +524,7 @@ character.hearth={ }, xianzhi:{ trigger:{global:'judgeBegin'}, - frequent:true, + direct:true, filter:function(){ return ui.cardPile.childNodes.length>1; }, @@ -77,6 +545,7 @@ character.hearth={ }; 'step 1' if(result.control=='调换顺序'){ + player.logSkill('xianzhi'); var card=ui.cardPile.firstChild; ui.cardPile.removeChild(card); ui.cardPile.insertBefore(card,ui.cardPile.firstChild.nextSibling); @@ -85,7 +554,9 @@ character.hearth={ }, ai:{ expose:0.1, - rejudge:0.5 + tag:{ + rejudge:0.5 + } } }, jingxiang:{ @@ -579,6 +1050,8 @@ character.hearth={ } }, translate:{ + hs_alleria:'奥蕾莉亚', + hs_magni:'麦格尼', hs_medivh:'麦迪文', hs_jaina:'吉安娜', hs_rexxar:'雷克萨', @@ -590,11 +1063,38 @@ character.hearth={ hs_thrall:'萨尔', hs_waleera:'瓦莉拉', - + fengxing:'风行', + fengxing_info:'每当你使用或打出一张杀,你可以摸一张牌', + xinci:'心刺', + xinci_info:'出牌阶段限一次,你可以弃置一张黑色牌令一名角色流失一点体力', + zhongjia:'重甲', + zhongjia_info:'锁定技,每当你受到一次伤害,你获得一点护甲值;当你的体力值大于1时,你的护甲不为你抵挡伤害', + dunji:'盾击', + dunji_info:'出牌阶段限,你可以失去你的所有护甲,并对等量的其他角色各造成一点伤害', + qiaodong:'巧动', + qiaodong_info:'你可以将一张装备牌当作当使用或打出', + fengxian:'奉献', + fengxian_info:'出牌阶段限一次,你可以令场上所有角色各弃置一张手牌', + zhanhou:'战吼', + zhanhou_info:'锁定技,你没有装备区,你可以弃置一张装备牌并获得一点护甲值;每有一点护甲值,你与其他角色的距离-1', + anying:'暗影', + anying_info:'限定技,出牌阶段,你可以弃置两张黑色牌,失去技能圣光,并获得技能心刺', + shijie:'视界', + shijie_info:'回合结束阶段,你可以获得一名其他角色的一张手牌,然后该角色摸一张牌', + shengguang:'圣光', + shengguang_info:'出牌阶段限一次,你可以弃置一张红色牌令一名角色回复一点体力,若其仍处于受伤状态则摸一张牌', + bingjia:'冰甲', + bingjia2:'冰甲', + bingjia_info:'出牌阶段,若你武将牌上没有牌,你可以将一张黑色手牌背面朝上置于你的武将牌上,当你成为其他角色的与此牌点数相同的牌的目标时,你将此牌置于弃牌堆,并获得两点护甲值', + bianxing:'变形', + bianxing_info:'当一其他角色于回合内使用卡牌指定了惟一目标后,你可以用一张与之不同名的手牌替代此牌(使用者及目标必须合理),每名角色的回合限一次', xianzhi:'先知', xianzhi_info:'任意一名角色进行判定前,你可以观看牌堆顶的两张牌,并可以将其调换顺序', + mdzhoufu:'诅咒', + mdzhoufu_info:'出牌阶段,你可以将一张黑色手牌置于一名其他角色的武将牌上,在其判定时以此牌作为判定结果;当受此技能影响的角色进行判定时,你摸一张牌', moying:'魔影', - moying_info:'回合结束阶段,若你本回合内没有造成伤害,可以指定一名角色进行判定,若为黑色,其流失一点体力,若为红色,其摸一张牌', + moying_info:'锁定技,回合开始阶段,若场上没有闪电,你将牌堆中的一张闪电置于你的判定区', + moying_old_info:'每当你造成或受到一次伤害,你可以令伤害目标或来源进行一次判定,若结果为黑色,其流失一点体力', jingxiang:'镜像', jingxiang_info:'每当你需要打出卡牌时,你可以观看一名随机角色的手牌并将其视为你的手牌打出', tuteng:'图腾', diff --git a/character/mountain.js b/character/mountain.js index 2a3511359..06afcf554 100644 --- a/character/mountain.js +++ b/character/mountain.js @@ -589,6 +589,10 @@ character.mountain={ player.removeSkill('hunzi'); }, ai:{ + threaten:function(player,target){ + if(target.hp==1) return 2; + return 0.5; + }, maixie:true, effect:{ target:function(card,player,target){ diff --git a/character/sp.js b/character/sp.js index 654181d2f..330950631 100644 --- a/character/sp.js +++ b/character/sp.js @@ -119,6 +119,9 @@ character.sp={ chouhai:{ trigger:{player:'damageBegin'}, forced:true, + check:function(){ + return false; + }, filter:function(event,player){ return player.num('h')==0; }, @@ -565,8 +568,12 @@ character.sp={ usable:1, filterCard:true, filterTarget:function(card,player,target){ - return player!=target; + return player!=target&&!target.skills.contains('zhoufu2'); }, + prepare:function(cards,player){ + player.$throw(cards); + }, + discard:false, content:function(){ target.$gain2(cards); target.storage.zhoufu2=cards[0]; @@ -578,6 +585,7 @@ character.sp={ return 3-ai.get.value(card) }, ai:{ + expose:0.1, order:1, result:{ player:1 @@ -596,6 +604,9 @@ character.sp={ if(player.storage.zhoufu3.isAlive()&&player.storage.zhoufu3.skills.contains('yingbin')){ player.storage.zhoufu3.draw(2); } + else{ + game.delay(1.5); + } "step 1" player.judging=player.storage.zhoufu2; trigger.position.appendChild(player.storage.zhoufu2); diff --git a/character/standard.js b/character/standard.js index 2b9a7551d..b5f61533e 100644 --- a/character/standard.js +++ b/character/standard.js @@ -607,6 +607,9 @@ character.standard={ }, position:'he', viewAs:{name:'sha'}, + viewAsFilter:function(player){ + if(!player.num('h',{color:'red'})) return false; + }, prompt:'将一张红色牌当杀使用或打出', check:function(card){return 4-ai.get.value(card)}, ai:{ @@ -759,6 +762,9 @@ character.standard={ enable:['chooseToUse','chooseToRespond'], filterCard:{name:'shan'}, viewAs:{name:'sha'}, + viewAsFilter:function(player){ + if(!player.num('h','shan')) return false; + }, prompt:'将一张闪当杀使用或打出', check:function(){return 1}, ai:{ @@ -768,6 +774,9 @@ character.standard={ } }, respondSha:true, + skillTagFilter:function(player){ + if(!player.num('h','shan')) return false; + }, order:4, useful:-1, value:-1 @@ -782,6 +791,9 @@ character.standard={ check:function(){return 1}, ai:{ respondShan:true, + skillTagFilter:function(player){ + if(!player.num('h','sha')) return false; + }, effect:{ target:function(card,player,target,current){ if(get.tag(card,'respondShan')&¤t<0) return 0.6 @@ -887,6 +899,9 @@ character.standard={ }, position:'he', viewAs:{name:'guohe'}, + viewAsFilter:function(player){ + if(!player.num('h',{color:'black'})) return false; + }, prompt:'将一张黑色牌当过河拆桥使用', check:function(card){return 4-ai.get.value(card)} }, @@ -1209,7 +1224,7 @@ character.standard={ order:9, result:{ target:function(player,target){ - if(target.hp==5) return 5; + if(target.hp==1) return 5; if(player==target&&player.num('h')>player.hp) return 5; return 2; } diff --git a/character/swd.js b/character/swd.js index c3a635778..5f5795303 100644 --- a/character/swd.js +++ b/character/swd.js @@ -897,43 +897,23 @@ character.swd={ }, fuyan:{ trigger:{player:'damageEnd'}, - frequent:true, + direct:true, filter:function(event){ return event.num>0; }, content:function(){ "step 0" - player.draw(); + player.chooseTarget('是否发动【覆岩】?',function(card,player,target){ + return !target.hujia; + }).ai=function(target){ + var eff=-ai.get.damageEffect(target,target,player); + return eff+(player==target?2:0); + }; "step 1" - if(player.num('he')){ - player.chooseCardTarget({ - position:'he', - prompt:'选择一张牌作为“岩”', - ai1:function(card){ - return 8-ai.get.value(card); - }, - ai2:function(target){ - var eff=-ai.get.damageEffect(target,target,player); - return eff+(player==target?2:0); - }, - filterCard:true, - filterTarget:function(card,player,target){ - return !target.skills.contains('fuyan2'); - } - }); - } - else{ - event.finish(); - } - "step 2" if(result.bool){ - player.line(result.targets); - player.lose(result.cards,ui.special); + player.logSkill('fuyan',result.targets); var target=result.targets[0]; - target.storage.fuyan2=result.cards[0]; - target.addSkill('fuyan2'); - player.$give(result.cards,target); - game.log(get.translation(player)+'将'+get.translation(result.cards)+'置于'+get.translation(target)+'的武将牌上'); + target.changeHujia(); } }, ai:{ @@ -3212,6 +3192,9 @@ character.swd={ return get.suit(card)=='heart'; }, viewAs:{name:'liuxinghuoyu'}, + viewAsFilter:function(player){ + if(!player.num('he',{suit:'heart'})) return false; + }, prompt:'将一张红桃手牌当作流星火羽使用', check:function(card){return 6-ai.get.value(card)}, ai:{ @@ -3252,6 +3235,9 @@ character.swd={ return get.color(card)=='black'; }, viewAs:{name:'dujian'}, + viewAsFilter:function(player){ + if(!player.num('h',{color:'black'})) return false; + }, prompt:'将一张黑色手牌当作毒箭使用', check:function(card){return 5-ai.get.value(card)}, ai:{ @@ -4236,13 +4222,9 @@ character.swd={ }; "step 1" if(result.bool){ - player.logSkill('daixing'); + player.changeHujia(result.cards.length); player.storage.daixing=result.cards.length; - player.markSkill('daixing'); - } - else{ - player.storage.daixing=0; - player.unmarkSkill('daixing'); + player.logSkill('daixing'); } }, ai:{ @@ -4262,24 +4244,14 @@ character.swd={ } }, daixing2:{ - trigger:{player:'damageBegin'}, - filter:function(event,player){ - return player.storage.daixing>0; - }, - priority:-20, - popup:false, + trigger:{player:'phaseBegin'}, forced:true, + popup:false, content:function(){ - if(trigger.num>=player.storage.daixing){ - trigger.num-=player.storage.daixing; + if(player.storage.daixing){ + player.changeHujia(-player.storage.daixing); player.storage.daixing=0; - player.unmarkSkill('daixing'); } - else{ - player.storage.daixing-=trigger.num; - trigger.num=0; - } - player.popup('daixing'); } }, swd_wuxie:{ @@ -7328,34 +7300,12 @@ character.swd={ trigger:{source:'damageEnd'}, forced:true, filter:function(event,player){ - return !player.storage.hudun; + return !player.hujia&&event.player!=player; }, content:function(){ - player.storage.hudun=true; - player.markSkill('hudun'); + player.changeHujia(); + player.update(); }, - init:function(player){ - player.storage.hudun=false; - }, - intro:{ - content:function(st){ - if(st) return '已开启'; - return '未开启'; - } - }, - group:'hudun2' - }, - hudun2:{ - trigger:{player:'damageBegin'}, - forced:true, - filter:function(event,player){ - return event.num>0&&player.storage.hudun; - }, - content:function(){ - trigger.num--; - player.storage.hudun=false; - player.unmarkSkill('hudun'); - } }, toudan:{ enable:'phaseUse', @@ -7383,6 +7333,7 @@ character.swd={ } lib.tempSortSeat=event.target; event.targets.sort(lib.sort.seat); + event.targets.unshift(player); delete lib.tempSortSeat; "step 1" if(event.targets.length){ @@ -7613,7 +7564,7 @@ character.swd={ huiqi:'回气', huiqi_info:'每当你受到一次伤害,可令一名角色摸X张牌,X为你已损失的体力值', toudan:'投弹', - toudan_info:'出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成一点火焰伤害,然后令距离该角色1以内的所有角色弃置一张牌', + toudan_info:'出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成一点火焰伤害,然后你与距离该角色1以内的所有角色各弃置一张牌', shending:'神丁', shending_info:'锁定技,若你没有宝物牌,视为装备了蓝格怪衣', hzhenwei:'镇卫', @@ -7623,7 +7574,7 @@ character.swd={ hudun:'护盾', hudun_bg:'盾', hudun2:'护盾', - hudun_info:'锁定技,当你造成一次伤害后,受到的下一次伤害-1', + hudun_info:'锁定技,当你对其他角色造成伤害后,若你没有护甲,你获得一点护甲值', mazui:'麻醉', mazui2:'麻醉', mazui_info:'出牌阶段限一次,你可以将一张黑色手牌置于一名角色的武将牌上,该角色造成的下一次伤害-1,然后获得此牌', @@ -7640,7 +7591,7 @@ character.swd={ zhenwei_info:'你可以将攻击范围内其他角色打出的卡牌交给除该角色外的任意一名角色', fuyan:'覆岩', fuyan2:'覆岩', - fuyan_info:'每当你受到一次伤害,可以摸一张牌,并将一张牌置于一名角色的武将牌上称为“岩”;当其受到伤害时,须将“岩”置于弃牌堆,然后令伤害-1', + fuyan_info:'每当你受到一次伤害,可以令一名没有护甲的角色获得一点护甲值', guaili:'怪力', guaili_info:'锁定技,你的杀造成的伤害+1,造成伤害后需弃置一张牌', pingshen:'凭神', @@ -7942,7 +7893,7 @@ character.swd={ yuhuo_info:'限定技,濒死阶段,你可以重置角色牌,减少一点体力上限,然后将体力回复至体力上限', yishan_info:'每当你受到一次伤害,你可以重新获得最近失去的两张牌', huanhun_info:'当一名角色进入濒死状态时,你可以弃置一张红色牌并令其进行一次判定,若结果为红色,其回复一点体力', - daixing_info:'回合结束阶段,你可以弃置至多X张牌,并抵挡等量伤害,效果在下一个回合结束阶段失效,X为现存角色数-1', + daixing_info:'回合结束阶段,你可以任意张牌并获得等量的护甲,这些护甲将在你的下个回合开始阶段消失', swd_wuxie_info:'锁定技,你不能成为其他角色的延时锦囊的目标', qingcheng_info:'回合开始阶段,你可以进行判定,若为红色则可以继续判定,判定结束后将判定成功的牌收入手牌', xianjiang_info:'出牌阶段,你可以将一张装备牌永久转化为任意一张其它装备牌,一张牌在一个阶段只能转化一次', diff --git a/character/xianjian.js b/character/xianjian.js index 589a33ae1..c07e4be79 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -526,8 +526,7 @@ character.xianjian={ } return false; }, - frequent:true, - popup:false, + direct:true, content:function(){ "step 0" if(trigger.delay==false) game.delay(); @@ -539,9 +538,16 @@ character.xianjian={ } } if(cards.length){ + player.chooseCardButton('聚宝:获得其中的一张非基本牌牌',cards); + + } + "step 2" + if(result.bool){ + var cards=result.links; + player.logSkill('jubao'); player.gain(cards); player.$gain2(cards); - game.log(get.translation(player)+'发动聚宝,获得了'+get.translation(cards)); + game.log(get.translation(player)+'获得了'+get.translation(cards)); } }, ai:{ @@ -1169,6 +1175,9 @@ character.xianjian={ }, position:'he', viewAs:{name:'shunshou'}, + viewAsFilter:function(player){ + if(!player.num('he',{suit:'club'})) return false; + }, prompt:'将一张装备牌当顺手牵羊使用', check:function(card){ var player=_status.currentPhase; @@ -1360,7 +1369,7 @@ character.xianjian={ sajin:'洒金', sajin_info:'出牌阶段,你可以弃置一张手牌并指定任意名角色进行判定,若判定花色与你弃置的牌相同,该角色回复一点体力', jubao:'聚宝', - jubao_info:'回合外,你可以将其他角色弃置的非基本牌收入手牌', + jubao_info:'当其他角色于你的回合外弃置非基本牌时,你可以获得其中的一张', guiyuan:'归元', guiyuan_info:'出牌阶段限一次,你可以弃置一张杀并回复一点体力', shuangren:'双刃', diff --git a/game/config.js b/game/config.js index f69e4868e..fc026c45f 100644 --- a/game/config.js +++ b/game/config.js @@ -13,7 +13,7 @@ window.config={ all:{ mode:['identity','guozhan','versus','boss','chess','stone'], layout:['default','newlayout'], - theme:['woodden','music'], + theme:['woodden','music','simple'], card_font:['xiaozhuan','huangcao','caoshu','xingshu'], double_hp:['hejiansan','pingjun','zuidazhi','zuixiaozhi','zonghe'], @@ -70,6 +70,7 @@ window.config={ white:'白色', woodden:'木纹', music:'音乐', + simple:'简约', newlayout:'新版', jeans:'牛仔', metro:'极简', diff --git a/game/game.js b/game/game.js index e78420a77..04ef547c8 100644 --- a/game/game.js +++ b/game/game.js @@ -291,6 +291,8 @@ diamond:"♦︎", spade:"♠︎", club:"♣︎", + ghujia:'护甲', + ghujia_bg:'甲', heart2:"红桃", diamond2:"方片", spade2:"黑桃", @@ -1108,7 +1110,10 @@ event.finish(); return; } - event.dialog=ui.create.dialog(get.translation(player.name)+'展示的牌',cards); + if(!event.str){ + event.str=get.translation(player.name)+'展示的牌'; + } + event.dialog=ui.create.dialog(event.str,cards); var str=get.translation(player)+'展示了'+get.translation(cards[0]); for(var i=1;i0&&player.hujia&&!player.hasSkillTag('nohujia')){ + if(num>=player.hujia){ + num-=player.hujia; + game.log(get.translation(player)+'的护甲抵挡了'+get.cnNumber(player.hujia)+'点伤害'); + player.hujia=0; + } + else{ + player.hujia-=num; + game.log(get.translation(player)+'的护甲抵挡了'+get.cnNumber(num)+'点伤害'); + num=0; + } + event.hujia=true; + player.update(); + } + event.num=num; if(lib.config.background_audio){ game.playAudio('effect','damage'+(num>1?'2':'')); } @@ -1667,25 +1687,30 @@ } } player.changeHp(-num,false); - if(player._damagetimeout!=source){ - player.$damage(source); - player._damagetimeout=source; - setTimeout(function(){ - delete player._damagetimeout; - },500); - } - if(player._damagepopup){ - player._damagepopup-=num; - player._damagenature=event.nature; + if(source){ + if(player._damagetimeout!=source){ + player.$damage(source); + player._damagetimeout=source; + setTimeout(function(){ + delete player._damagetimeout; + },500); + } + if(player._damagepopup){ + player._damagepopup-=num; + player._damagenature=event.nature; + } + else{ + player._damagepopup=-num; + player._damagenature=event.nature; + setTimeout(function(){ + player.popup(player._damagepopup,player._damagenature); + delete player._damagepopup; + delete player._damagenature; + },300); + } } else{ - player._damagepopup=-num; - player._damagenature=event.nature; - setTimeout(function(){ - player.popup(player._damagepopup,player._damagenature); - delete player._damagepopup; - delete player._damagenature; - },300); + player.$damage(); } event.trigger('damage'); "step 1" @@ -2031,6 +2056,7 @@ this.group=info[1]; this.hp=info[2]; this.maxHp=info[2]; + this.hujia=0; this.node.intro.innerHTML=lib.config.intro; if(lib.config.touchscreen){ lib.setLongPress(this,ui.click.intro); @@ -2111,6 +2137,7 @@ delete this.group; delete this.hp; delete this.maxHp; + delete this.hujia; this.skills.length=0; this.node.identity.style.backgroundColor=''; this.node.intro.innerHTML=''; @@ -2146,6 +2173,12 @@ if(this.hp>=this.maxHp) this.hp=this.maxHp; var hp=this.node.hp; hp.style.transition='none'; + if(this.hujia){ + this.markSkill('ghujia'); + } + else{ + this.unmarkSkill('ghujia'); + } if(lib.config.layout=='default'&&this.maxHp>14){ hp.innerHTML=this.hp+'/'+this.maxHp; hp.classList.add('text'); @@ -2459,6 +2492,19 @@ return cards; } }, + changeHujia:function(num){ + if(typeof num!='number'){ + num=1; + } + this.hujia+=num; + if(num>0){ + game.log(get.translation(this)+'获得了'+get.cnNumber(num)+'点护甲值'); + } + if(this.hujia<0){ + this.hujia=0; + } + this.update(); + }, setIdentity:function(identity){ if(!identity) identity=this.identity; this.node.identity.firstChild.innerHTML=get.translation(identity); @@ -2985,9 +3031,10 @@ next.player=this; next.content=lib.element.playerproto.showHandcards; }, - showCards:function(cards){ + showCards:function(cards,str){ var next=game.createEvent('showCards'); next.player=this; + next.str=str; if(get.itemtype(cards)=='card') next.cards=[cards]; else if(get.itemtype(cards)=='cards') next.cards=cards; else _status.event.next.remove(next); @@ -4871,6 +4918,13 @@ name:'混乱' } }, + ghujia:{ + intro:{ + content:function(content,player){ + return '已有'+get.cnNumber(player.hujia)+'点护甲值'; + } + } + }, _recoverCheck:{ trigger:{player:'recoverBefore'}, forced:true, @@ -5823,6 +5877,7 @@ if(enable){ if(info.filter&&info.filter(event,player)==false) enable=false; if(info.viewAs&&event.filterCard&&!event.filterCard(info.viewAs,player)) enable=false; + if(info.viewAs&&info.viewAsFilter&&info.viewAsFilter(player)==false) enable=false; if(event.aiexclude.contains(skills2[i])) enable=false; if(info.usable&&get.skillCount(skills2[i])>=info.usable) enable=false; } diff --git a/image/character/fullskin/hs_rexxar.jpg b/image/character/fullskin/hs_rexxar.jpg index de363b115..c54687ec1 100644 Binary files a/image/character/fullskin/hs_rexxar.jpg and b/image/character/fullskin/hs_rexxar.jpg differ diff --git a/layout/default/layout.css b/layout/default/layout.css index 66e27d3eb..a0c8eea27 100644 --- a/layout/default/layout.css +++ b/layout/default/layout.css @@ -465,6 +465,7 @@ div:hover>.intro{opacity: 1;} } .dialog.scroll1>.bar.top{opacity:1} .dialog.scroll2>.bar.bottom{opacity:1} +.dialog.slim{top:300px;bottom:auto;min-height: none} /*.dialog.scroll1{box-shadow:0 -10px 10px -9px rgba(0,0,0,0.1),0 -10px 0 -9px rgba(0,0,0,0.05);} .dialog.scroll2{box-shadow:0 10px 10px -9px rgba(0,0,0,0.1),0 10px 0 -9px rgba(0,0,0,0.05)} .dialog.scroll1.scroll2{box-shadow:0 -10px 10px -9px rgba(0,0,0,0.1),0 -10px 0 -9px rgba(0,0,0,0.05), diff --git a/layout/newlayout/layout.css b/layout/newlayout/layout.css index 160bf8186..1313887d8 100644 --- a/layout/newlayout/layout.css +++ b/layout/newlayout/layout.css @@ -49,7 +49,7 @@ } .player.fullskin2 .avatar, .player.fullskin2 .avatar2{ - width:64px; + width:63px; background-position:50%; } .player.fullskin2 .avatar{ @@ -439,7 +439,8 @@ } .popup{z-index:6} .dialog.scroll1, -.dialog.scroll2{ +.dialog.scroll2, +.dialog.withbg{ background: rgba(0,0,0,0.2); box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px; border-radius:8px; diff --git a/mode/chess.js b/mode/chess.js index 48391e71a..09285435e 100644 --- a/mode/chess.js +++ b/mode/chess.js @@ -1341,7 +1341,7 @@ mode.chess={ }, content:function(){ "step 0" - player.chooseToMove(1,'是否发动【翩仪】?'); + player.chooseToMove(2,'是否发动【翩仪】?'); "step 1" if(result.bool){ player.logSkill('pianyi'); @@ -1763,7 +1763,7 @@ mode.chess={ // chess_lusu:['male','wu',3,['']], // chess_luxun:['male','wu',3,['']], // chess_ganning:['male','wu',3,['']], - chess_taishici:['male','wu',4,['guanchuan','pojun']], + chess_taishici:['male','wu',4,['gongji','guanchuan','pojun']], // // chess_lvbu:['male','qun',3,['']], chess_sunshangxiang:['female','wu',3,['lingdong','lianshe','gongji']], diff --git a/theme/.DS_Store b/theme/.DS_Store deleted file mode 100644 index 12b4fd0df..000000000 Binary files a/theme/.DS_Store and /dev/null differ diff --git a/theme/music/style.css b/theme/music/style.css index 824833574..65f533ec6 100644 --- a/theme/music/style.css +++ b/theme/music/style.css @@ -22,7 +22,7 @@ html{ .card{ color:white; } -.card.fullskin,#arena>.card:not(*:empty){ +.card:not(*:empty){ color:rgb(77, 60, 51); text-shadow:none; background: url('wood3.png'); diff --git a/theme/simple/card.png b/theme/simple/card.png new file mode 100644 index 000000000..1ab9be738 Binary files /dev/null and b/theme/simple/card.png differ diff --git a/theme/simple/grid.png b/theme/simple/grid.png new file mode 100644 index 000000000..ab1454032 Binary files /dev/null and b/theme/simple/grid.png differ diff --git a/theme/simple/style.css b/theme/simple/style.css new file mode 100644 index 000000000..340314c2d --- /dev/null +++ b/theme/simple/style.css @@ -0,0 +1,42 @@ +html{ + color: white; + text-shadow: black 0 0 2px; + background: url('../../image/background/huangtian_bg.jpg'); +} +#system>div>div,#mebg,.control,.player,.card,.avatar,.avatar2,.button,#window>.dialog.popped, +.player.unseen .equips:not(*:empty){ + box-shadow: rgba(0, 0, 0, 0.4) 0 0 0 1px, rgba(0, 0, 0, 0.2) 0 3px 10px; + background-image: linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.4)); + border-radius: 8px; +} +#window>.dialog.popped{ + border-radius: 6px; +} +.control,#system>div>div,.judges>div,.marks>div, +.player.unseen .equips:not(*:empty){ + border-radius:4px; +} +.card{ + color:white; +} +.card:not(*:empty){ + color:rgb(77, 60, 51); + text-shadow:none; + background: url('card.png'); + background-size:cover; +} +#me>div>.card,#arena>.card:not(*:empty){ + box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.45) 0 3px 10px; +} +.fire{ + color: rgb(255,119,63); +} +.thunder{ + color: rgb(117,186,255); +} +.poison{ + color: rgb(104,221,127); +} +.brown{ + color: rgb(195,161,223); +} diff --git a/theme/simple/wood.png b/theme/simple/wood.png new file mode 100644 index 000000000..3991afda8 Binary files /dev/null and b/theme/simple/wood.png differ diff --git a/theme/simple/wood3.png b/theme/simple/wood3.png new file mode 100644 index 000000000..89bad8f81 Binary files /dev/null and b/theme/simple/wood3.png differ