diff --git a/character/hearth.js b/character/hearth.js index 77c2e774a..63b66b637 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -58,7 +58,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hs_zhanzhenggushu:['male','wei',6,['biri']], hs_ronghejuren:['male','shu',8,['ronghuo']], hs_shanlingjuren:['male','wu',8,['luoshi']], - hs_aedwin:['male','wu',3,['lianzhan']], + hs_aedwin:['male','wu',4,['lianzhan']], hs_mijiaojisi:['female','wu',3,['kuixin']], hs_huzhixiannv:['female','wu',3,['jingmeng','qingliu']], hs_totemic:['male','wu',3,['peiyu']], diff --git a/character/refresh.js b/character/refresh.js index ab5587363..173541651 100644 --- a/character/refresh.js +++ b/character/refresh.js @@ -1202,6 +1202,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ game.trySkillAudio('zhaxiang',player); } + }, + ai:{ + maihp:true } }, zhaxiang2:{ diff --git a/character/shenhua.js b/character/shenhua.js index 1b08e4564..e1ac27133 100644 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -8,7 +8,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ caoren:['male','wei',4,['xinjushou','xinjiewei']], huangzhong:['male','shu',4,['xinliegong']], weiyan:['male','shu',4,['xinkuanggu','qimou']], - xiaoqiao:['female','wu',3,['xintianxiang','hongyan']], + xiaoqiao:['female','wu',3,['retianxiang','hongyan']], zhoutai:['male','wu',4,['buqu','fenji']], sp_zhangjiao:['male','qun',3,['releiji','guidao','huangtian'],['zhu']], // yuji:['male','qun',3,['guhuo']], @@ -2570,7 +2570,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, wansha:{ locked:true, - global:'wansha2' + global:'wansha2', + trigger:{global:'dying'}, + priority:15, + forced:true, + filter:function(event,player){ + return _status.currentPhase==player&&event.player!=player; + }, + content:function(){} }, wansha2:{ mod:{ @@ -3566,6 +3573,134 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.popup('tianxiang'); } }, + retianxiang:{ + audio:'tianxiang', + trigger:{player:'damageBefore'}, + direct:true, + filter:function(event,player){ + return player.countCards('he',{suit:'heart'})>0&&event.num>0; + }, + content:function(){ + "step 0" + player.chooseCardTarget({ + filterCard:function(card,player){ + return get.suit(card)=='heart'&&lib.filter.cardDiscardable(card,player); + }, + filterTarget:function(card,player,target){ + return player!=target; + }, + position:'he', + ai1:function(card){ + return 10-get.value(card); + }, + ai2:function(target){ + var att=get.attitude(_status.event.player,target); + var trigger=_status.event.getTrigger(); + var da=0; + if(_status.event.player.hp==1){ + da=10; + } + var eff=get.damageEffect(target,trigger.source,target); + if(att==0) return 0.1+da; + if(eff>=0&&att>0){ + return att+da; + } + if(att>0&&target.hp>1){ + if(target.maxHp-target.hp>=3) return att*1.1+da; + if(target.maxHp-target.hp>=2) return att*0.9+da; + } + return -att+da; + }, + prompt:get.prompt('retianxiang'), + prompt2:lib.translate.retianxiang_info + }); + "step 1" + if(result.bool){ + player.discard(result.cards,ui.special); + var target=result.targets[0]; + player.chooseControlList(true,function(event,player){ + var target=_status.event.target; + var att=get.attitude(player,target); + if(target.hasSkillTag('maihp')) att=-att; + if(att>0){ + return 0; + } + else{ + return 1; + } + }, + ['令'+get.translation(target)+'受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)', + '令'+get.translation(target)+'失去1点体力,然后获得'+get.translation(result.cards)]).set('target',target); + player.logSkill(event.name,target); + trigger.untrigger(); + trigger.finish(); + event.target=target; + event.card=result.cards[0]; + } + else{ + event.finish(); + } + "step 2" + if(typeof result.index=='number'){ + if(result.index){ + event.target.loseHp().type='retianxiang'; + event.target.addSkill('retianxiang3'); + event.target.storage.retianxiang3=event.card; + } + else{ + event.target.damage(trigger.source).type='retianxiang'; + event.target.addSkill('retianxiang2'); + if(get.position(event.card)=='s'){ + event.card.discard(); + } + } + } + }, + ai:{ + maixie_fake:true, + effect:{ + target:function(card,player,target){ + if(player.hasSkillTag('jueqing',false,target)) return; + if(get.tag(card,'damage')&&target.countCards('he')>1) return 0.7; + } + }, + } + }, + retianxiang3:{ + trigger:{player:'loseHpAfter'}, + forced:true, + popup:false, + filter:function(event){ + return event.type=='retianxiang'; + }, + vanish:true, + content:function(){ + player.gain(player.storage.retianxiang3,'gain2'); + player.removeSkill('retianxiang3'); + }, + onremove:function(player){ + var card=player.storage.retianxiang3; + if(get.position(card)=='s'){ + card.discard(); + } + delete player.storage.retianxiang3; + } + }, + retianxiang2:{ + trigger:{player:'damageAfter'}, + forced:true, + popup:false, + filter:function(event){ + return event.type=='retianxiang'; + }, + vanish:true, + content:function(){ + if(player.isDamaged()){ + player.draw(player.maxHp-player.hp); + } + player.removeSkill('retianxiang2'); + }, + }, xintianxiang:{ audio:'tianxiang', trigger:{player:'damageBefore'}, @@ -4181,6 +4316,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinqiangxi:'强袭', xinjushou:'据守', xinjiewei:'解围', + retianxiang:'天香', + retianxiang_info:'当你受到伤害时,你可以弃置一张红桃手牌,防止此次伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。', xinjiewei_info:'你可以将装备区里的牌当【无懈可击】使用;当你从背面翻至正面时,你可以弃置一张牌,然后移动场上的一张牌', xinjushou_info:'结束阶段,你可以翻面并摸四张牌,然后弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之', jixi_info:'出牌阶段,你可以把任意一张田当【顺手牵羊】使用', diff --git a/game/game.js b/game/game.js index 1aa5a94fd..2d4af30da 100644 --- a/game/game.js +++ b/game/game.js @@ -11919,7 +11919,7 @@ discard:function(){ "step 0" game.log(player,'弃置了',cards); - player.lose(cards); + player.lose(cards,event.position); if(event.animate!=false){ event.discardid=lib.status.videoId++; game.broadcastAll(function(player,cards,id){ @@ -15332,6 +15332,9 @@ else if(typeof arguments[i]=='boolean'){ next.animate=arguments[i]; } + else if(get.objtype(arguments[i])=='div'){ + next.position=arguments[i]; + } } if(next.cards==undefined) _status.event.next.remove(next); next.setContent('discard'); @@ -18478,9 +18481,9 @@ }, $skill:function(name,type,color,avatar){ if(typeof type!='string') type='legend'; - game.delay(2); if(!avatar){ this.playerfocus(1500); + game.delay(2); } else{ game.addVideo('playerfocus2'); @@ -18488,8 +18491,9 @@ ui.arena.classList.add('playerfocus'); setTimeout(function(){ ui.arena.classList.remove('playerfocus'); - },1500) + },1800) }); + game.delay(3); } var that=this; setTimeout(function(){ @@ -18676,19 +18680,16 @@ ui.create.div('','
'+str.split('').join('

')+'
',ui.create.div('.text',node)); node.firstChild.firstChild.style.backgroundImage=this.node.avatar.style.backgroundImage; node.dataset.nature=nature||'unknown'; - setTimeout(function(){ - // node.lastChild.firstChild.firstChild.classList.add('flashtext'); - var num=0; - var nodes=node.lastChild.firstChild.querySelectorAll('div'); - var interval=setInterval(function(){ - if(num1/3){ + return name; + } + else{ + var arr=['shen_caocao','shen_simayi','shen_guanyu','shen_zhugeliang','shen_zhaoyun','shen_zhouyu','shen_lvmeng','shen_lvbu']; + arr.removeArray(list); + return arr.randomGet(); + } + }, controlid:'shenwuzaishi', control:function(type,control){ if(type=='cancel'){ @@ -1478,6 +1501,276 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + boss_wuzang:{ + trigger:{player:'phaseDrawBegin'}, + forced:true, + content:function(){ + trigger.num+=Math.max(5,Math.floor(player.hp/2))-2; + }, + mod:{ + maxHandcard:function(player,num){ + return num-player.hp; + } + } + }, + boss_xiangde:{ + trigger:{player:'damageBegin'}, + forced:true, + filter:function(event,player){ + return event.source&&event.source.isIn()&&event.source!=player&&event.source.getEquip(1); + }, + content:function(){ + trigger.num++; + } + }, + boss_yinzei:{ + trigger:{player:'damageAfter'}, + forced:true, + logTarget:'source', + filter:function(event,player){ + return event.source&&event.source.isIn()&&event.source!=player&&event.source.countCards('he')&&!player.countCards('h'); + }, + content:function(){ + trigger.source.randomDiscard(); + } + }, + boss_zhue:{ + trigger:{global:'damageAfter'}, + forced:true, + filter:function(event,player){ + return event.source&&event.source.isIn()&&event.source!=player; + }, + logTarget:'source', + content:function(){ + game.asyncDraw([player,trigger.source]); + } + }, + boss_yandu:{ + trigger:{global:'phaseAfter'}, + filter:function(event,player){ + return event.player!=player&&!event.player.getStat('damage')&&event.player.countCards('he'); + }, + logTarget:'player', + forced:true, + content:function(){ + player.gainPlayerCard(trigger.player,true); + } + }, + boss_futai:{ + global:'boss_futai2', + trigger:{player:'phaseBegin'}, + logTarget:function(event,player){ + return game.filterPlayer(function(current){ + return current.isDamaged(); + }); + }, + forced:true, + content:function(){ + 'step 0' + var list=game.filterPlayer(function(current){ + return current.isDamaged(); + }).sortBySeat(); + event.list=list; + 'step 1' + if(event.list.length){ + event.list.shift().recover(); + event.redo(); + } + } + }, + boss_futai2:{ + mod:{ + cardSavable:function(card,player){ + if(card.name=='tao'&&game.hasPlayer(function(current){ + return current!=player&¤t.hasSkill('boss_futai')&&_status.currentPhase!=current; + })){ + return false; + } + }, + cardEnabled:function(card,player){ + if(card.name=='tao'&&game.hasPlayer(function(current){ + return current!=player&¤t.hasSkill('boss_futai')&&_status.currentPhase!=current; + })){ + return false; + } + }, + } + }, + boss_luanchang:{ + group:['boss_luanchang_begin','boss_luanchang_end'], + subSkill:{ + begin:{ + trigger:{player:'phaseBegin'}, + forced:true, + content:function(){ + var list=game.filterPlayer(function(current){ + return player.canUse('nanman',current); + }).sortBySeat(); + if(list.length){ + player.useCard({name:'nanman'},list); + } + } + }, + end:{ + trigger:{player:'phaseEnd'}, + forced:true, + content:function(){ + var list=game.filterPlayer(function(current){ + return player.canUse('wanjian',current); + }).sortBySeat(); + if(list.length){ + player.useCard({name:'wanjian'},list); + } + } + } + } + }, + boss_nitai:{ + group:['boss_nitai_in','boss_nitai_out'], + subSkill:{ + in:{ + trigger:{player:'damageBefore'}, + forced:true, + filter:function(event,player){ + return _status.currentPhase==player; + }, + content:function(){ + trigger.untrigger(); + trigger.finish(); + } + }, + out:{ + trigger:{player:'damageBegin'}, + forced:true, + filter:function(event,player){ + return _status.currentPhase!=player&&event.nature=='fire'; + }, + content:function(){ + trigger.num++; + } + } + } + }, + boss_minwan:{ + group:['boss_minwan_clear','boss_minwan_draw','boss_minwan_add'], + subSkill:{ + clear:{ + trigger:{player:'phaseAfter'}, + silent:true, + content:function(){ + delete player.storage.boss_minwan; + } + }, + draw:{ + trigger:{player:'useCard'}, + forced:true, + filter:function(event,player){ + return _status.currentPhase==player&&Array.isArray(player.storage.boss_minwan); + }, + content:function(){ + player.draw(); + } + }, + add:{ + trigger:{source:'damageAfter'}, + filter:function(event,player){ + return _status.currentPhase==player; + }, + forced:true, + content:function(){ + if(!player.storage.boss_minwan){ + player.storage.boss_minwan=[player]; + } + player.storage.boss_minwan.add(trigger.player); + } + } + }, + mod:{ + playerEnabled:function(card,player,target){ + if(_status.currentPhase==player&&Array.isArray(player.storage.boss_minwan)&&!player.storage.boss_minwan.contains(target)){ + return false; + } + } + } + }, + boss_tanyu:{ + trigger:{player:'phaseDiscardBefore'}, + forced:true, + content:function(){ + trigger.untrigger(); + trigger.finish(); + }, + group:'boss_tanyu_hp', + subSkill:{ + hp:{ + trigger:{player:'phaseEnd'}, + forced:true, + popup:false, + filter:function(event,player){ + return player.isMaxHandcard(); + }, + content:function(){ + player.loseHp(); + } + } + } + }, + boss_cangmu:{ + trigger:{player:'phaseDrawBegin'}, + forced:true, + content:function(){ + trigger.num+=game.countPlayer()-2; + } + }, + boss_jicai:{ + trigger:{global:'recoverAfter'}, + forced:true, + logTarget:'player', + content:function(){ + if(trigger.player==player){ + player.draw(2); + } + else{ + game.asyncDraw([player,trigger.player]); + } + } + }, + boss_xiongshou:{ + group:['boss_xiongshou_turn','boss_xiongshou_damage'], + subSkill:{ + damage:{ + trigger:{source:'damageBegin'}, + forced:true, + filter:function(event,player){ + return event.notLink()&&event.card&&event.card.name=='sha'&&event.player.hp