From 34782b5dd7ac27414d991c5e646dd877a27ad9f8 Mon Sep 17 00:00:00 2001 From: libccy Date: Sat, 25 Feb 2017 10:29:16 +0800 Subject: [PATCH] hs --- character/ow.js | 20 +- character/shenhua.js | 148 ++--- character/standard.js | 2 +- character/xianjian.js | 54 +- character/yijiang.js | 1 + game/game.js | 50 +- mode/guozhan.js | 1258 ++++++++++++++++++++++------------------- 7 files changed, 838 insertions(+), 695 deletions(-) diff --git a/character/ow.js b/character/ow.js index 2db2a80fc..48d44f2dd 100644 --- a/character/ow.js +++ b/character/ow.js @@ -19,7 +19,7 @@ character.ow={ ow_tuobiang:['male','shu',3,['paotai','maoding']], // ow_baolei:['male','qun',4,[]], - ow_banzang:['male','qun',4,['fengshi','yinbo']], + ow_banzang:['male','qun',4,['bfengshi','yinbo']], ow_laiyinhate:['male','qun',4,['zhongdun','mengji']], ow_luba:['male','shu',4,['liangou','xiyang']], // ow_wensidun:['male','shu',4,[]], @@ -424,7 +424,7 @@ character.ow={ } } }, - fengshi:{ + bfengshi:{ trigger:{player:'shaBegin'}, forced:true, alter:true, @@ -433,7 +433,7 @@ character.ow={ }, filter:function(event,player){ var num=0.2; - if(get.is.altered('fengshi')) num=0.15; + if(get.is.altered('bfengshi')) num=0.15; return Math.random()0){ - return 10+ai.get.attitude(_status.event.player,target); - } - if(player.maxHp-player.hp==1){ - return -1; - } - return 1; - }); - "step 1" - if(result.bool){ - player.logSkill('yinghun',result.targets); - event.target=result.targets[0]; - player.chooseControl('yinghun_true','yinghun_false',function(event,player){ - if(ai.get.attitude(player,event.target)>0) return 'yinghun_true'; - return 'yinghun_false'; - }) - } - else{ - event.finish(); - } - "step 2" - if(result.control=='yinghun_true'){ - event.target.draw(player.maxHp-player.hp); - event.target.chooseToDiscard(true,'he'); - } - else{ - event.target.draw(); - event.target.chooseToDiscard(player.maxHp-player.hp,true,'he'); - } - }, - ai:{ - threaten:function(player,target){ - if(target.hp==1) return 2; - if(target.hp==2) return 1.5; - return 0.5; - }, - maixie:true, - effect:{ - target:function(card,player,target){ - if(target.maxHp<=3) return; - if(get.tag(card,'damage')){ - if(target.hp==target.maxHp) return [0,1]; - } - if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0]; - } - } - } - }, yinghun:{ audio:2, audioname:['sunce'], @@ -2353,6 +2288,81 @@ character.shenhua={ ai:{ threaten:function(player,target){ if(target.hp==1||target.num('e')>=target.hp) return 2; + if(target.hp==target.maxHp) return 0.5; + if(target.hp==2) return 1.5; + return 0.5; + }, + maixie:true, + effect:{ + target:function(card,player,target){ + if(target.maxHp<=3) return; + if(get.tag(card,'damage')){ + if(target.hp==target.maxHp) return [0,1]; + } + if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0]; + } + } + } + }, + gzyinghun:{ + audio:'yinghun', + audioname:['sunce'], + trigger:{player:'phaseBegin'}, + filter:function(event,player){ + return player.hp0){ + return 10+ai.get.attitude(_status.event.player,target); + } + if(player.maxHp-player.hp==1){ + return -1; + } + return 1; + }); + "step 1" + if(result.bool){ + event.num=player.maxHp-player.hp; + player.logSkill(event.name,result.targets); + event.target=result.targets[0]; + if(event.num==1){ + event.directcontrol=true; + } + else{ + var str1='摸'+get.cnNumber(event.num,true)+'弃一'; + var str2='摸一弃'+get.cnNumber(event.num,true); + player.chooseControl(str1,str2,function(event,player){ + return _status.event.choice; + }).set('choice',ai.get.attitude(player,event.target)>0?str1:str2); + event.str=str1; + } + } + else{ + event.finish(); + } + "step 2" + if(event.directcontrol||result.control==event.str){ + event.target.draw(event.num); + event.target.chooseToDiscard(true,'he'); + } + else{ + event.target.draw(); + event.target.chooseToDiscard(event.num,true,'he'); + } + }, + ai:{ + threaten:function(player,target){ + if(target.hp==target.maxHp) return 0.5; + if(target.hp==1) return 2; if(target.hp==2) return 1.5; return 0.5; }, @@ -3536,7 +3546,7 @@ character.shenhua={ }); "step 1" if(result.bool){ - player.logSkill('tianxiang',result.targets); + player.logSkill(event.name,result.targets); trigger.untrigger(); trigger.player=result.targets[0]; trigger.player.addSkill('tianxiang2'); @@ -3628,7 +3638,7 @@ character.shenhua={ }); "step 1" if(result.bool){ - player.logSkill('xintianxiang',result.targets); + player.logSkill(event.name,result.targets); trigger.untrigger(); trigger.player=result.targets[0]; trigger.player.addSkill('xintianxiang2'); @@ -4149,6 +4159,8 @@ character.shenhua={ xinshensu_info:'你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张【杀】', yinghun:'英魂', yinghun_info:'准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值,若你装备区里牌的数量不小于你的体力值,则X改为你的体力上限)', + gzyinghun:'英魂', + gzyinghun_info:'准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)', tiaoxin:'挑衅', zhiji:'志继', @@ -4235,8 +4247,6 @@ character.shenhua={ duanliang1:'断粮', haoshi:'好施', dimeng:'缔盟', - yinghun_true:'摸X弃1', - yinghun_false:'摸1弃X', jiuchi:'酒池', roulin:'肉林', benghuai:'崩坏', diff --git a/character/standard.js b/character/standard.js index b8580e99b..1dc45ac05 100644 --- a/character/standard.js +++ b/character/standard.js @@ -1292,7 +1292,7 @@ character.standard={ "step 1" if(result.bool){ player.discard(result.cards); - player.logSkill('liuli',result.targets); + player.logSkill(event.name,result.targets); trigger.target=result.targets[0]; trigger.targets.remove(player); trigger.targets.push(result.targets[0]); diff --git a/character/xianjian.js b/character/xianjian.js index 9459b33aa..320572aea 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -13,7 +13,7 @@ character.xianjian={ pal_xuejian:['female','shu',3,['xshuangren','shenmu','duci']], pal_longkui:['female','qun',3,['fenxing','diewu','lingyu']], pal_zixuan:['female','wei',3,['shuiyun','wangyou','changnian']], - pal_changqing:['male','wei',4,['luanjian','tianfu']], + pal_changqing:['male','wei',4,['luanjian','ctianfu']], pal_nangonghuang:['male','wei',3,['zhaoyao','sheling','zhangmu']], pal_wenhui:['female','shu',4,['huxi','longxiang']], @@ -1271,7 +1271,7 @@ character.xianjian={ if(Math.random()<0.5) trigger.num++; } }, - tianfu:{ + ctianfu:{ enable:'phaseUse', filter:function(event,player){ return player.num('h','shan')>0; @@ -1281,17 +1281,17 @@ character.xianjian={ discard:false, prepare:'give', filterTarget:function(card,player,target){ - return target!=player&&!target.hasSkill('tianfu2'); + return target!=player&&!target.hasSkill('ctianfu2'); }, check:function(card){ if(_status.event.player.hp>=3) return 8-ai.get.value(card); return 7-ai.get.value(card); }, content:function(){ - target.storage.tianfu2=cards[0]; - target.storage.tianfu3=player; - game.addVideo('storage',target,['tianfu2',get.cardInfo(cards[0]),'card']); - target.addSkill('tianfu2'); + target.storage.ctianfu2=cards[0]; + target.storage.ctianfu3=player; + game.addVideo('storage',target,['ctianfu2',get.cardInfo(cards[0]),'card']); + target.addSkill('ctianfu2'); }, ai:{ order:2, @@ -1305,18 +1305,18 @@ character.xianjian={ expose:0.2 } }, - tianfu2:{ + ctianfu2:{ trigger:{source:'damageAfter'}, forced:true, mark:'card', filter:function(event,player){ - return player.storage.tianfu2&&player.storage.tianfu3; + return player.storage.ctianfu2&&player.storage.ctianfu3; }, content:function(){ "step 0" - if(player.storage.tianfu3&&player.storage.tianfu3.isAlive()){ - player.damage(player.storage.tianfu3); - player.storage.tianfu3.line(player,'thunder'); + if(player.storage.ctianfu3&&player.storage.ctianfu3.isAlive()){ + player.damage(player.storage.ctianfu3); + player.storage.ctianfu3.line(player,'thunder'); } else{ player.damage('nosource'); @@ -1327,26 +1327,26 @@ character.xianjian={ player.discard(he.randomGet()); } "step 2" - player.$throw(player.storage.tianfu2); - ui.discardPile.appendChild(player.storage.tianfu2); - delete player.storage.tianfu2; - delete player.storage.tianfu3; - player.removeSkill('tianfu2'); + player.$throw(player.storage.ctianfu2); + ui.discardPile.appendChild(player.storage.ctianfu2); + delete player.storage.ctianfu2; + delete player.storage.ctianfu3; + player.removeSkill('ctianfu2'); }, - group:'tianfu3', + group:'ctianfu3', intro:{ content:'card' } }, - tianfu3:{ + ctianfu3:{ trigger:{player:'dieBegin'}, forced:true, popup:false, content:function(){ - ui.discardPile.appendChild(player.storage.tianfu2); - delete player.storage.tianfu2; - delete player.storage.tianfu3; - player.removeSkill('tianfu2'); + ui.discardPile.appendChild(player.storage.ctianfu2); + delete player.storage.ctianfu2; + delete player.storage.ctianfu3; + player.removeSkill('ctianfu2'); } }, shuiyun:{ @@ -2541,10 +2541,10 @@ character.xianjian={ xfenxin_info_alter:'锁定技,每当你的体力值发生改变,你摸一张牌', luanjian:'乱剑', luanjian_info:'出牌阶段,你可以将两张杀当杀使用,此杀无视距离,可以指定任意名目标且有50%的机率伤害+1', - tianfu:'天符', - tianfu2:'天符', - tianfu3:'天符', - tianfu_info:'出牌阶段,你可以将一张闪置于一名其他角色的武将牌上,该角色在下一次造成伤害时受到来自你的一点雷属性伤害并随机弃置一张牌,然后移去此牌', + ctianfu:'天符', + ctianfu2:'天符', + ctianfu3:'天符', + ctianfu_info:'出牌阶段,你可以将一张闪置于一名其他角色的武将牌上,该角色在下一次造成伤害时受到来自你的一点雷属性伤害并随机弃置一张牌,然后移去此牌', shuiyun:'水蕴', shuiyun_bg:'蕴', shuiyun2:'水蕴', diff --git a/character/yijiang.js b/character/yijiang.js index 48a962655..96c3ef59d 100644 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -7766,6 +7766,7 @@ character.yijiang={ yaowu:'耀武', qianxi:'潜袭', qianxi2:'潜袭', + qianxi2_bg:'潜袭', fuli:'伏枥', jiefan:'解烦', juece:'绝策', diff --git a/game/game.js b/game/game.js index 6dfad85c9..e9c55c139 100644 --- a/game/game.js +++ b/game/game.js @@ -10284,20 +10284,26 @@ reinit:function(from,to,maxHp){ var info1=lib.character[from]; var info2=lib.character[to]; - if(this.name==from&&!this.classList.contains('unseen')){ - this.name=to; - this.sex=info2[0]; - this.node.avatar.setBackground(to,'character'); - this.node.name.innerHTML=get.slimName(to); - } - else if(this.name2==from){ + if(this.name2==from){ this.name2=to; - if(this.classList.contains('unseen')){ + if(this.classList.contains('unseen')&&!this.classList.contains('unseen2')){ this.sex=info2[0]; + this.name=to; } this.node.avatar2.setBackground(to,'character'); this.node.name2.innerHTML=get.slimName(to); } + else if(this.name==from||this.name1==from){ + if(this.name1==from){ + this.name1=to; + } + if(!this.classList.contains('unseen2')){ + this.name=to; + this.sex=info2[0]; + } + this.node.avatar.setBackground(to,'character'); + this.node.name.innerHTML=get.slimName(to); + } else{ return this; } @@ -22418,7 +22424,7 @@ players[i].$draw(num2); } }, - finishSkill:function(i){ + finishSkill:function(i,sub){ var j; var mode=get.mode(); var info=lib.skill[i]; @@ -22476,7 +22482,7 @@ var skill=lib.skill[info.inherit]; for(j in skill){ if(info[j]==undefined){ - if(j=='audio'){ + if(j=='audio'&&(typeof info[j]=='number'||typeof info[j]=='boolean')){ info[j]=info.inherit; } else{ @@ -22484,11 +22490,14 @@ } } } + if(lib.translate[i]==undefined){ + lib.translate[i]=lib.translate[info.inherit]; + } if(lib.translate[i+'_info']==undefined){ lib.translate[i+'_info']=lib.translate[info.inherit+'_info']; } } - if(info.subSkill){ + if(info.subSkill&&!sub){ for(var j in info.subSkill){ lib.skill[i+'_'+j]=info.subSkill[j]; if(info.subSkill[j].name){ @@ -22503,6 +22512,7 @@ if(info.subSkill[j].marktext){ lib.translate[i+'_'+j+'_bg']=info.subSkill[j].marktext; } + game.finishSkill(i+'_'+j,true); } } if(info.marktext){ @@ -22690,9 +22700,23 @@ else if(typeof arguments[i]=='object'){ str+=get.translation(arguments[i]); } - else if(typeof arguments[i]=='string'&&arguments[i][0]=='【'&&arguments[i][arguments[i].length-1]=='】'){ + else if(typeof arguments[i]=='string'){ if(lib.config.log_highlight){ - str+=''+get.translation(arguments[i])+''; + if(arguments[i][0]=='【'&&arguments[i][arguments[i].length-1]=='】'){ + str+=''+get.translation(arguments[i])+''; + } + else if(arguments[i][0]=='#'){ + var color=''; + switch(arguments[i][1]){ + case 'b':color='blue';break; + case 'y':color='yellow';break; + case 'g':color='green';break; + } + str+=''+arguments[i].slice(2)+''; + } + else{ + str+=get.translation(arguments[i]); + } } else{ str+=get.translation(arguments[i]); diff --git a/mode/guozhan.js b/mode/guozhan.js index 7bbb6f015..c4e8b53cb 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -194,7 +194,7 @@ mode.guozhan={ gz_daqiao:['female','wu',3,['guose','liuli']], gz_luxun:['male','wu',3,['qianxun','duoshi']], gz_sunshangxiang:['female','wu',3,['jieyin','gzxiaoji']], - gz_sunjian:['male','wu',4,['yinghun']], + gz_sunjian:['male','wu',4,['gzyinghun']], gz_xiaoqiao:['female','wu',3,['tianxiang','hongyan']], gz_taishici:['male','wu',4,['tianyi']], gz_zhoutai:['male','wu',4,['gzbuqu']], @@ -217,24 +217,622 @@ mode.guozhan={ gz_panfeng:['male','qun',4,['kuangfu']], gz_zoushi:['female','qun',3,['huoshui','qingcheng']], - gz_dengai:['male','wei',4,[]], - gz_caohong:['male','wei',4,[]], - gz_jiangfei:['male','shu',3,[]], - gz_jiangwei:['male','shu',4,[]], - gz_xusheng:['male','wu',4,[]], - gz_jiangqing:['male','wu',4,[]], + // gz_dengai:['male','wei',4,['tuntian','ziliang','gzjixi']], + // gz_caohong:['male','wei',4,['huyuan','heyi']], + // gz_jiangfei:['male','shu',3,['shengxi','gzshoucheng']], + // gz_jiangwei:['male','shu',4,['tiaoxin','yizhi','tianfu']], + // gz_xusheng:['male','wu',4,['yicheng']], + // gz_jiangqing:['male','wu',4,['shangyi','niaoxiang']], gz_hetaihou:['female','qun',3,['zhendu','qiluan']], gz_re_lidian:['male','wei',3,['xunxun','wangxi']], - gz_zangba:['male','wei',4,[]], - gz_madai:['male','shu',4,[]], - gz_mifuren:['female','shu',3,[]], - gz_sunce:['male','wu',4,[]], + // gz_zangba:['male','wei',4,['hengjiang']], + gz_madai:['male','shu',4,['mashu','gzqianxi']], + // gz_mifuren:['female','shu',3,['gzguixiu','gzcunsi']], + gz_sunce:['male','wu',4,['jiang','yingyang','hunshang']], gz_chendong:['male','wu',4,['duanxie','fenming']], - gz_sp_dongzhuo:['male','qun',4,[]], - gz_zhangren:['male','qun',4,[]], + // gz_sp_dongzhuo:['male','qun',4,['hengzheng','baoling']], + // gz_zhangren:['male','qun',4,['chuanxin','fengshi']], } }, + skill:{ + hunshang:{ + init:function(player){ + if(player.hasViceSkill('hunshang')){ + player.removeMaxHp(); + } + else{ + player.disableSkill('hunshang',['hunshang','hunshang_yingzi','hunshang_yinghun']); + player.awakenedSkills.add('hunshang'); + } + }, + group:['hunshang_yingzi','hunshang_yinghun'], + }, + hunshang_yingzi:{ + inherit:'yingzi', + filter:function(event,player){ + return player.hp==1&&!player.hasSkill('yingzi'); + } + }, + hunshang_yinghun:{ + inherit:'gzyinghun', + filter:function(event,player){ + return player.hp==1&&player.isDamaged()&&!player.hasSkill('gzyinghun'); + } + }, + yingyang:{ + + }, + gzqianxi:{ + audio:'qianxi', + trigger:{player:'phaseBegin'}, + content:function(){ + "step 0" + player.judge(); + "step 1" + event.color=result.color; + player.chooseTarget(function(card,player,target){ + return player!=target&&get.distance(player,target)<=1; + },true).set('ai',function(target){ + return -ai.get.attitude(_status.event.player,target); + }); + "step 2" + if(result.bool&&result.targets.length){ + result.targets[0].storage.qianxi2=event.color; + result.targets[0].addSkill('qianxi2'); + player.line(result.targets,'green'); + game.addVideo('storage',result.targets[0],['qianxi2',event.color]); + } + }, + }, + shuangren:{ + trigger:{player:'phaseUseBegin'}, + direct:true, + priority:15, + content:function(){ + 'step 0' + var goon; + if(player.needsToDiscard()>1){ + goon=player.hasCard(function(card){ + return card.number>10&&ai.get.value(card)<=5; + }); + } + else{ + goon=player.hasCard(function(card){ + return card.number>=9&&ai.get.value(card)<=5||ai.get.value(card)<=3; + }); + } + player.chooseTarget(get.prompt('shuangren'),function(card,player,target){ + return target!=player; + }).set('ai',function(target){ + var player=_status.event.player; + if(_status.event.goon&&ai.get.attitude(player,target)<0){ + return ai.get.effect(target,{name:'sha'},player,player); + } + return 0; + }).set('goon',goon); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('shuangren',target); + player.chooseToCompare(target); + } + else{ + event.finish(); + } + 'step 2' + if(result.bool){ + var target=event.target; + if(target.identity!='ye'&&target.identity!='unknown'&&game.hasPlayer(function(current){ + return target.identity==current.identity&&target!=current&&player.canUse('sha',current,false); + })){ + player.chooseTarget('对一名'+get.translation(target.identity)+'势力的角色使用一张杀',true,function(card,player,target){ + return target.identity==_status.event.identity; + }).set('ai',function(target){ + var player=_status.event.player; + return ai.get.effect(target,{name:'sha'},player,player); + }).set('identity',target.identity); + } + else{ + player.useCard({name:'sha'},target,false); + event.finish(); + } + } + else{ + trigger.finish(); + trigger.untrigger(); + event.finish(); + } + 'step 3' + if(result.bool&&result.targets&&result.targets.length){ + player.useCard({name:'sha'},result.targets[0],false); + } + } + }, + gzduanchang:{ + audio:'duanchang', + trigger:{player:'dieBegin'}, + forced:true, + silent:true, + filter:function(event,player){ + return event.source&&event.source.isIn()&&event.source!=player; + }, + content:function(){ + 'step 0' + player.chooseControl('主将','副将',function(){ + return Math.random()<0.5?'主将':'副将'; + }).set('prompt','令'+get.translation(trigger.source)+'失去一张武将牌的所有技能'); + 'step 1' + var skills; + if(result.control=='主将'){ + trigger.source.showCharacter(0); + trigger.source.node.avatar.classList.add('disabled'); + skills=lib.character[trigger.source.name]; + game.log(trigger.source,'失去了主将技能'); + } + else{ + trigger.source.showCharacter(1); + trigger.source.node.avatar2.classList.add('disabled'); + skills=lib.character[trigger.source.name2]; + game.log(trigger.source,'失去了副将技能'); + } + trigger.source.disableSkill('gzduanchang',skills); + }, + logTarget:'source', + ai:{ + threaten:function(player,target){ + if(target.hp==1) return 0.2; + return 1.5; + }, + effect:{ + target:function(card,player,target,current){ + if(!target.hasFriend()) return; + if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-2]; + } + } + } + }, + gzweimu:{ + audio:'weimu', + trigger:{target:'useCardToBefore'}, + forced:true, + priority:15, + check:function(event,player){ + return ai.get.effect(event.target,event.card,event.player,player)<0; + }, + filter:function(event,player){ + return get.type(event.card,'trick')=='trick'&&get.color(event.card)=='black'; + }, + content:function(){ + trigger.untrigger(); + trigger.finish(); + }, + ai:{ + effect:{ + target:function(card,player,target,current){ + if(get.type(card,'trick')=='trick'&&get.color(card)=='black') return 'zeroplayertarget'; + }, + } + } + }, + gzkongcheng:{ + audio:'kongcheng', + trigger:{target:'useCardToBefore'}, + forced:true, + priority:15, + check:function(event,player){ + return ai.get.effect(event.target,event.card,event.player,player)<0; + }, + filter:function(event,player){ + return player.num('h')==0&&(event.card.name=='sha'||event.card.name=='juedou'); + }, + content:function(){ + trigger.untrigger(); + trigger.finish(); + }, + ai:{ + effect:{ + target:function(card,player,target,current){ + if(target.num('h')==0&&(card.name=='sha'||card.name=='juedou')) return 'zeroplayertarget'; + }, + } + } + }, + gzxiaoji:{ + inherit:'xiaoji', + content:function(){ + player.draw(2); + } + }, + gzrende:{ + audio:'rende', + group:['gzrende1'], + enable:'phaseUse', + filterCard:true, + selectCard:[1,Infinity], + discard:false, + prepare:'give', + filterTarget:function(card,player,target){ + return player!=target; + }, + check:function(card){ + if(ui.selected.cards.length>1) return 0; + if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; + if(!ui.selected.cards.length&&card.name=='du') return 20; + var player=get.owner(card); + if(player.hp==player.maxHp||player.storage.gzrende<0||player.num('h')+player.storage.gzrende<=2){ + if(ui.selected.cards.length){ + return -1; + } + var players=game.filterPlayer(); + for(var i=0;i=3&& + ai.get.attitude(players[i],player)>=3){ + return 11-ai.get.value(card); + } + } + if(player.num('h')>player.hp) return 10-ai.get.value(card); + if(player.num('h')>2) return 6-ai.get.value(card); + return -1; + } + return 10-ai.get.value(card); + }, + content:function(){ + target.gain(cards,player); + if(typeof player.storage.gzrende!='number'){ + player.storage.gzrende=0; + } + if(player.storage.gzrende>=0){ + player.storage.gzrende+=cards.length; + if(player.storage.gzrende>=3){ + player.recover(); + player.storage.gzrende=-1; + } + } + }, + ai:{ + order:function(skill,player){ + if(player.hp==player.maxHp||player.storage.gzrende<0||player.num('h')+player.storage.gzrende<=2){ + return 1; + } + return 10; + }, + result:{ + target:function(player,target){ + if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ + return -10; + } + if(target.num('j','lebu')) return 0; + var nh=target.num('h'); + var np=player.num('h'); + if(player.hp==player.maxHp||player.storage.gzrende<0||player.num('h')+player.storage.gzrende<=2){ + if(nh>=np-1&&np<=player.hp&&!target.get('s').contains('haoshi')) return 0; + } + return Math.max(1,5-nh); + } + }, + effect:{ + target:function(card,player,target){ + if(player==target&&get.type(card)=='equip'){ + if(player.num('e',{subtype:get.subtype(card)})){ + var players=game.filterPlayer(); + for(var i=0;i0){ + return 0; + } + } + } + } + } + }, + threaten:0.8 + } + }, + gzrende1:{ + trigger:{player:'phaseUseBegin'}, + forced:true, + popup:false, + silent:true, + content:function(){ + player.storage.gzrende=0; + } + }, + gzzhiheng:{ + inherit:'zhiheng', + selectCard:function(){ + return [1,_status.event.player.maxHp]; + }, + prompt:'出牌阶段限一次,你可以弃置至多X张牌(X为你的体力上限),然后摸等量的牌' + }, + huoshui:{ + enable:'phaseUse', + unique:true, + forceunique:true, + filter:function(event,player){ + if(player.name1=='gz_zoushi') return player.classList.contains('unseen'); + return player.classList.contains('unseen2'); + }, + content:function(){ + if(player.name1=='gz_zoushi') player.showCharacter(0); + else player.showCharacter(1); + } + }, + _huoshui:{ + ai:{ + nomingzhi:true, + skillTagFilter:function(player){ + return _status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('huoshui'); + } + } + }, + qingcheng:{ + enable:'phaseUse', + filter:function(event,player){ + return player.num('he',{type:'equip'})&&game.hasPlayer(function(current){ + return current!=player&&!current.classList.contains('unseen')&&!current.classList.contains('unseen2'); + }); + }, + filterCard:{type:'equip'}, + position:'he', + filterTarget:function(card,player,target){ + return !target.classList.contains('unseen')&&!target.classList.contains('unseen2'); + }, + check:function(card){ + return 6-ai.get.value(card,_status.event.player); + }, + content:function(){ + 'step 0' + var choice='主将'; + var skills=lib.character[target.name2][3]; + for(var i=0;i=0) return 0; + if(player.hasCard(function(card){ + return get.tag(card,'damage')&&player.canUse(card,target,true,true); + })){ + if(target.maxHp>3) return -0.5; + return -1; + } + return 0; + } + } + } + }, + qingcheng_ai:{ + ai:{ + effect:{ + target:function(card){ + if(get.tag(card,'damage')) return 2; + } + } + } + }, + duoshi:{ + enable:'chooseToUse', + viewAs:{name:'yiyi'}, + usable:4, + filterCard:{color:'red'}, + viewAsFilter:function(player){ + return player.num('h',{color:'red'})>0; + }, + check:function(card){ + return 5-ai.get.value(card); + } + }, + gzxiaoguo:{ + inherit:'xiaoguo', + content:function(){ + "step 0" + var nono=(Math.abs(ai.get.attitude(player,trigger.player))<3); + if(ai.get.damageEffect(trigger.player,player,player)<=0){ + nono=true; + } + var next=player.chooseToDiscard(get.prompt('gzxiaoguo',trigger.player),{type:'basic'}); + next.set('ai',function(card){ + if(_status.event.nono) return 0; + return 8-ai.get.useful(card); + }); + next.set('logSkill',['gzxiaoguo',trigger.player]); + next.set('nono',nono); + "step 1" + if(result.bool){ + var nono=(ai.get.damageEffect(trigger.player,player,trigger.player)>=0); + trigger.player.chooseToDiscard('he',{type:'equip'}).set('ai',function(card){ + if(_status.event.nono){ + return 0; + } + if(_status.event.player.hp==1) return 10-ai.get.value(card); + return 9-ai.get.value(card); + }).set('nono',nono); + } + else{ + event.finish(); + } + "step 2" + if(!result.bool){ + trigger.player.damage(); + } + }, + }, + _mingzhi1:{ + trigger:{player:'phaseBegin'}, + priority:19, + forced:true, + popup:false, + content:function(){ + "step 0" + var choice=1; + for(var i=0;i=2||(popu==1&&game.players.length<=4)){ + return Math.random()<0.5?3:(Math.random()<0.5?2:1); + } + if(choice==0) return 0; + if(get.population(group)>0&&get.totalPopulation(group)+1<=get.population()/2){ + return Math.random()<0.2?(Math.random()<0.5?3:(Math.random()<0.5?2:1)):0; + } + var nming=0; + for(var i=0;i=2||(popu==1&&game.players.length<=4)){ + return true; + } + if(get.population(group)>0&&get.totalPopulation(group)+1<=get.population()/2){ + return Math.random()<0.2?true:false; + } + var nming=0; + for(var i=0;i1){ - goon=player.hasCard(function(card){ - return card.number>10&&ai.get.value(card)<=5; - }); - } - else{ - goon=player.hasCard(function(card){ - return card.number>=9&&ai.get.value(card)<=5||ai.get.value(card)<=3; - }); - } - player.chooseTarget(get.prompt('shuangren'),function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - if(_status.event.goon&&ai.get.attitude(player,target)<0){ - return ai.get.effect(target,{name:'sha'},player,player); - } - return 0; - }).set('goon',goon); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('shuangren',target); - player.chooseToCompare(target); - } - else{ - event.finish(); - } - 'step 2' - if(result.bool){ - var target=event.target; - if(target.identity!='ye'&&target.identity!='unknown'&&game.hasPlayer(function(current){ - return target.identity==current.identity&&target!=current&&player.canUse('sha',current,false); - })){ - player.chooseTarget('对一名'+get.translation(target.identity)+'势力的角色使用一张杀',true,function(card,player,target){ - return target.identity==_status.event.identity; - }).set('ai',function(target){ - var player=_status.event.player; - return ai.get.effect(target,{name:'sha'},player,player); - }).set('identity',target.identity); - } - else{ - player.useCard({name:'sha'},target,false); - event.finish(); - } - } - else{ - trigger.finish(); - trigger.untrigger(); - event.finish(); - } - 'step 3' - if(result.bool&&result.targets&&result.targets.length){ - player.useCard({name:'sha'},result.targets[0],false); - } - } - }, - gzduanchang:{ - audio:'duanchang', - trigger:{player:'dieBegin'}, - forced:true, - silent:true, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source!=player; - }, - content:function(){ - 'step 0' - player.chooseControl('主将','副将',function(){ - return Math.random()<0.5?'主将':'副将'; - }).set('prompt','令'+get.translation(trigger.source)+'失去一张武将牌的所有技能'); - 'step 1' - var skills; - if(result.control=='主将'){ - trigger.source.showCharacter(0); - trigger.source.node.avatar.classList.add('disabled'); - skills=lib.character[trigger.source.name]; - game.log(trigger.source,'失去了主将技能'); - } - else{ - trigger.source.showCharacter(1); - trigger.source.node.avatar2.classList.add('disabled'); - skills=lib.character[trigger.source.name2]; - game.log(trigger.source,'失去了副将技能'); - } - trigger.source.disableSkill('gzduanchang',skills); - }, - logTarget:'source', - ai:{ - threaten:function(player,target){ - if(target.hp==1) return 0.2; - return 1.5; - }, - effect:{ - target:function(card,player,target,current){ - if(!target.hasFriend()) return; - if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-2]; - } - } - } - }, - gzweimu:{ - audio:'weimu', - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - check:function(event,player){ - return ai.get.effect(event.target,event.card,event.player,player)<0; - }, - filter:function(event,player){ - return get.type(event.card,'trick')=='trick'&&get.color(event.card)=='black'; - }, - content:function(){ - trigger.untrigger(); - trigger.finish(); - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card,'trick')=='trick'&&get.color(card)=='black') return 'zeroplayertarget'; - }, - } - } - }, - gzkongcheng:{ - audio:'kongcheng', - trigger:{target:'useCardToBefore'}, - forced:true, - priority:15, - check:function(event,player){ - return ai.get.effect(event.target,event.card,event.player,player)<0; - }, - filter:function(event,player){ - return player.num('h')==0&&(event.card.name=='sha'||event.card.name=='juedou'); - }, - content:function(){ - trigger.untrigger(); - trigger.finish(); - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(target.num('h')==0&&(card.name=='sha'||card.name=='juedou')) return 'zeroplayertarget'; - }, - } - } - }, - gzxiaoji:{ - inherit:'xiaoji', - content:function(){ - player.draw(2); - } - }, - gzrende:{ - audio:'rende', - group:['gzrende1'], - enable:'phaseUse', - filterCard:true, - selectCard:[1,Infinity], - discard:false, - prepare:'give', - filterTarget:function(card,player,target){ - return player!=target; - }, - check:function(card){ - if(ui.selected.cards.length>1) return 0; - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; - if(!ui.selected.cards.length&&card.name=='du') return 20; - var player=get.owner(card); - if(player.hp==player.maxHp||player.storage.gzrende<0||player.num('h')+player.storage.gzrende<=2){ - if(ui.selected.cards.length){ - return -1; - } - var players=game.filterPlayer(); - for(var i=0;i=3&& - ai.get.attitude(players[i],player)>=3){ - return 11-ai.get.value(card); - } - } - if(player.num('h')>player.hp) return 10-ai.get.value(card); - if(player.num('h')>2) return 6-ai.get.value(card); - return -1; - } - return 10-ai.get.value(card); - }, - content:function(){ - target.gain(cards,player); - if(typeof player.storage.gzrende!='number'){ - player.storage.gzrende=0; - } - if(player.storage.gzrende>=0){ - player.storage.gzrende+=cards.length; - if(player.storage.gzrende>=3){ - player.recover(); - player.storage.gzrende=-1; - } - } - }, - ai:{ - order:function(skill,player){ - if(player.hp==player.maxHp||player.storage.gzrende<0||player.num('h')+player.storage.gzrende<=2){ - return 1; - } - return 10; - }, - result:{ - target:function(player,target){ - if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){ - return -10; - } - if(target.num('j','lebu')) return 0; - var nh=target.num('h'); - var np=player.num('h'); - if(player.hp==player.maxHp||player.storage.gzrende<0||player.num('h')+player.storage.gzrende<=2){ - if(nh>=np-1&&np<=player.hp&&!target.get('s').contains('haoshi')) return 0; - } - return Math.max(1,5-nh); - } - }, - effect:{ - target:function(card,player,target){ - if(player==target&&get.type(card)=='equip'){ - if(player.num('e',{subtype:get.subtype(card)})){ - var players=game.filterPlayer(); - for(var i=0;i0){ - return 0; - } - } - } - } - } - }, - threaten:0.8 - } - }, - gzrende1:{ - trigger:{player:'phaseUseBegin'}, - forced:true, - popup:false, - silent:true, - content:function(){ - player.storage.gzrende=0; - } - }, - gzzhiheng:{ - inherit:'zhiheng', - selectCard:function(){ - return [1,_status.event.player.maxHp]; - }, - prompt:'出牌阶段限一次,你可以弃置至多X张牌(X为你的体力上限),然后摸等量的牌' - }, - huoshui:{ - enable:'phaseUse', - unique:true, - forceunique:true, - filter:function(event,player){ - if(player.name1=='gz_zoushi') return player.classList.contains('unseen'); - return player.classList.contains('unseen2'); - }, - content:function(){ - if(player.name1=='gz_zoushi') player.showCharacter(0); - else player.showCharacter(1); - } - }, - _huoshui:{ - ai:{ - nomingzhi:true, - skillTagFilter:function(player){ - return _status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('huoshui'); - } - } - }, - qingcheng:{ - enable:'phaseUse', - filter:function(event,player){ - return player.num('he',{type:'equip'})&&game.hasPlayer(function(current){ - return current!=player&&!current.classList.contains('unseen')&&!current.classList.contains('unseen2'); - }); - }, - filterCard:{type:'equip'}, - position:'he', - filterTarget:function(card,player,target){ - return !target.classList.contains('unseen')&&!target.classList.contains('unseen2'); - }, - check:function(card){ - return 6-ai.get.value(card,_status.event.player); - }, - content:function(){ - 'step 0' - var choice='主将'; - var skills=lib.character[target.name2][3]; - for(var i=0;i=0) return 0; - if(player.hasCard(function(card){ - return get.tag(card,'damage')&&player.canUse(card,target,true,true); - })){ - if(target.maxHp>3) return -0.5; - return -1; - } - return 0; - } - } - } - }, - qingcheng_ai:{ - ai:{ - effect:{ - target:function(card){ - if(get.tag(card,'damage')) return 2; - } - } - } - }, - duoshi:{ - enable:'chooseToUse', - viewAs:{name:'yiyi'}, - usable:4, - filterCard:{color:'red'}, - viewAsFilter:function(player){ - return player.num('h',{color:'red'})>0; - }, - check:function(card){ - return 5-ai.get.value(card); - } - }, - gzxiaoguo:{ - inherit:'xiaoguo', - content:function(){ - "step 0" - var nono=(Math.abs(ai.get.attitude(player,trigger.player))<3); - if(ai.get.damageEffect(trigger.player,player,player)<=0){ - nono=true; - } - var next=player.chooseToDiscard(get.prompt('gzxiaoguo',trigger.player),{type:'basic'}); - next.set('ai',function(card){ - if(_status.event.nono) return 0; - return 8-ai.get.useful(card); - }); - next.set('logSkill',['gzxiaoguo',trigger.player]); - next.set('nono',nono); - "step 1" - if(result.bool){ - var nono=(ai.get.damageEffect(trigger.player,player,trigger.player)>=0); - trigger.player.chooseToDiscard('he',{type:'equip'}).set('ai',function(card){ - if(_status.event.nono){ - return 0; - } - if(_status.event.player.hp==1) return 10-ai.get.value(card); - return 9-ai.get.value(card); - }).set('nono',nono); - } - else{ - event.finish(); - } - "step 2" - if(!result.bool){ - trigger.player.damage(); - } - }, - }, - _mingzhi1:{ - trigger:{player:'phaseBegin'}, - priority:19, - forced:true, - popup:false, - content:function(){ - "step 0" - var choice=1; - for(var i=0;i=2||(popu==1&&game.players.length<=4)){ - return Math.random()<0.5?3:(Math.random()<0.5?2:1); - } - if(choice==0) return 0; - if(get.population(group)>0&&get.totalPopulation(group)+1<=get.population()/2){ - return Math.random()<0.2?(Math.random()<0.5?3:(Math.random()<0.5?2:1)):0; - } - var nming=0; - for(var i=0;i=2||(popu==1&&game.players.length<=4)){ - return true; - } - if(get.population(group)>0&&get.totalPopulation(group)+1<=get.population()/2){ - return Math.random()<0.2?true:false; - } - var nming=0; - for(var i=0;i