noname/character/refresh.js

1562 lines
47 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
character.refresh={
connect:true,
character:{
re_caocao:['male','wei',4,['hujia','rejianxiong'],['zhu']],
re_simayi:['male','wei',3,['refankui','reguicai']],
re_guojia:['male','wei',3,['tiandu','reyiji']],
re_lidian:['male','wei',3,['xunxun','wangxi']],
re_zhangliao:['male','wei',4,['retuxi']],
re_xuzhu:['male','wei',4,['reluoyi']],
re_xiahoudun:['male','wei',4,['reganglie','qingjian']],
re_zhangfei:['male','shu',4,['paoxiao','retishen']],
re_zhaoyun:['male','shu',4,['longdan','reyajiao']],
re_guanyu:['male','shu',4,['wusheng','yijue']],
re_machao:['male','shu',4,['mashu','retieji']],
re_xushu:['male','shu',4,['zhuhai','qianxin']],
re_zhouyu:['male','wu',3,['reyingzi','refanjian']],
re_lvmeng:['male','wu',4,['keji','qinxue']],
re_ganning:['male','wu',4,['qixi','fenwei']],
re_luxun:['male','wu',3,['reqianxun','relianying']],
re_daqiao:['female','wu',3,['reguose','liuli']],
re_huanggai:['male','wu',4,['rekurou','zhaxiang']],
re_lvbu:['male','qun',5,['wushuang','liyu']],
re_gongsunzan:['male','qun',4,['qiaomeng','reyicong']],
re_huatuo:['male','qun',3,['chulao','jijiu']],
re_liubei:['male','shu',4,['rerende','jijiang'],['zhu']],
},
characterIntro:{
re_gongsunzan:'群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。',
re_lidian:'字曼成,曹操麾下将领。李典深明大义,不与人争功,崇尚学习与高贵儒雅,尊重博学之士,在军中被称为长者。李典有长者之风,官至破虏将军,三十六岁去世。魏文帝曹丕继位后追谥号为愍侯。',
},
skill:{
rerende:{
audio:2,
group:['rerende1'],
enable:'phaseUse',
filterCard:true,
selectCard:[1,Infinity],
discard:false,
prepare:'give2',
filterTarget:function(card,player,target){
if(player.storage.rerende2&&player.storage.rerende2.contains(target)) return false;
return player!=target;
},
onremove:['rerende','rerende2'],
check:function(card){
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(ui.selected.cards.length>=Math.max(2,player.countCards('h')-player.hp)) return 0;
if(player.hp==player.maxHp||player.storage.rerende<0||player.countCards('h')<=1){
var players=game.filterPlayer();
for(var i=0;i<players.length;i++){
if(players[i].get('s').contains('haoshi')&&
!players[i].isTurnedOver()&&
!players[i].num('j','lebu')&&
ai.get.attitude(player,players[i])>=3&&
ai.get.attitude(players[i],player)>=3){
return 11-ai.get.value(card);
}
}
if(player.countCards('h')>player.hp) return 10-ai.get.value(card);
if(player.countCards('h')>2) return 6-ai.get.value(card);
return -1;
}
return 10-ai.get.value(card);
},
content:function(){
'step 0'
if(!Array.isArray(player.storage.rerende2)){
player.storage.rerende2=[];
}
player.storage.rerende2.push(target);
target.gain(cards,player);
if(typeof player.storage.rerende!='number'){
player.storage.rerende=0;
}
if(player.storage.rerende>=0){
player.storage.rerende+=cards.length;
if(player.storage.rerende>=2){
var list=[];
if(lib.filter.cardUsable({name:'sha'},player,event.getParent('chooseToUse'))){
if(game.hasPlayer(function(current){
return player.canUse('sha',current);
})){
list.push(['基本','','sha']);
list.push(['基本','','sha','fire']);
list.push(['基本','','sha','thunder']);
}
}
if(player.canUse('tao',player,true,true)){
list.push(['基本','','tao']);
}
if(player.canUse('jiu',player,true,true)){
list.push(['基本','','jiu']);
}
if(list.length){
player.chooseButton(['是否视为使用一张基本牌?',[list,'vcard']]).set('ai',function(button){
var player=_status.event.player;
var card={name:button.link[2],nature:button.link[3]};
if(card.name=='tao'){
if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()){
return 5;
}
return 1;
}
if(card.name=='sha'){
if(game.hasPlayer(function(current){
return player.canUse(card,current)&&ai.get.effect(current,card,player,player)>0
})){
if(card.nature=='fire') return 2.95;
if(card.nature=='thunder') return 2.92;
return 2.9;
}
return 0;
}
if(card.name=='jiu'){
return 0.5;
}
return 0;
});
}
else{
event.finish();
}
player.storage.rerende=-1;
}
else{
event.finish();
}
}
else{
event.finish();
}
'step 1'
if(result&&result.bool&&result.links[0]){
var card={name:result.links[0][2],nature:result.links[0][3]};
if(card.name=='sha'){
event.fakecard=card;
player.chooseTarget(function(card,player,target){
return player.canUse(_status.event.fakecard,target,true,true);
},true,'选择出杀目标').set('ai',function(target){
var player=_status.event.player;
return ai.get.effect(target,_status.event.fakecard,player,player);
}).set('fakecard',card);
}
else{
player.useCard(card,player);
event.finish();
}
}
else{
event.finish();
}
'step 2'
if(result.bool&&result.targets&&result.targets.length){
player.useCard(event.fakecard,result.targets);
}
},
ai:{
order:function(skill,player){
if(player.hp<player.maxHp&&player.storage.rerende<2&&player.countCards('h')>1){
return 10;
}
return 4;
},
result:{
target:function(player,target){
if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){
if(target.hasSkillTag('nodu')) return 0;
return -10;
}
if(target.num('j','lebu')) return 0;
var nh=target.countCards('h');
var np=player.countCards('h');
if(player.hp==player.maxHp||player.storage.rerende<0||player.countCards('h')<=1){
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)})){
if(game.hasPlayer(function(current){
return current!=player&&ai.get.attitude(player,current)>0;
})){
return 0;
}
}
}
}
},
threaten:0.8
}
},
rerende1:{
trigger:{player:'phaseUseBegin'},
forced:true,
popup:false,
silent:true,
content:function(){
player.storage.rerende=0;
player.storage.rerende2=[];
}
},
liyu:{
audio:2,
trigger:{source:'damageEnd'},
forced:true,
filter:function(event,player){
return event.card&&event.card.name=='sha'&&event.player.isAlive()&&event.player.countCards('he')>0;
},
check:function(){
return false;
},
content:function(){
'step 0'
trigger.player.chooseTarget(function(card,player,target){
var evt=_status.event.getParent();
return evt.player.canUse({name:'juedou'},target)&&target!=_status.event.player;
},get.prompt('liyu')).set('ai',function(target){
var evt=_status.event.getParent();
return ai.get.effect(target,{name:'juedou'},evt.player,_status.event.player)-2;
});
'step 1'
if(result.bool){
player.gainPlayerCard(trigger.player,'he',true);
event.target=result.targets[0];
trigger.player.line(player,'green');
}
else{
event.finish();
}
'step 2'
if(event.target){
player.useCard({name:'juedou'},event.target);
}
}
},
reqicai:{
trigger:{player:'equipEnd'},
frequent:true,
content:function(){
player.draw();
},
mod:{
targetInRange:function(card,player,target,now){
var type=get.type(card);
if(type=='trick'||type=='delay') return true;
}
},
},
rejizhi:{
audio:2,
usable:3,
trigger:{player:'useCard'},
frequent:true,
filter:function(event){
var type=get.type(event.card,'trick');
return (type=='trick'||type=='equip')&&event.cards[0]&&event.cards[0]==event.card;
},
content:function(){
"step 0"
var cards=get.cards();
player.gain(cards,'gain2','log');
if(get.type(cards[0])!='basic'){
event.finish();
}
"step 1"
player.chooseToDiscard('h',true);
},
ai:{
threaten:1.4
}
},
retuxi:{
audio:2,
trigger:{player:'phaseDrawBefore'},
direct:true,
content:function(){
"step 0"
player.chooseTarget(get.prompt('retuxi'),[1,2],function(card,player,target){
return target.countCards('h')>0&&player!=target&&target.countCards('h')>=player.countCards('h');
},function(target){
var att=ai.get.attitude(_status.event.player,target);
if(target.hasSkill('tuntian')) return att/10;
return 1-att;
});
"step 1"
if(result.bool){
player.logSkill('retuxi',result.targets);
player.gainMultiple(result.targets);
trigger.num-=result.targets.length;
}
else{
event.finish();
}
"step 2"
if(trigger.num<=0) game.delay();
},
ai:{
threaten:1.6,
expose:0.2
}
},
reguicai:{
audio:2,
trigger:{global:'judge'},
direct:true,
filter:function(event,player){
return player.countCards('he')>0;
},
content:function(){
"step 0"
player.chooseCard(get.translation(trigger.player)+'的'+(trigger.judgestr||'')+'判定为'+
get.translation(trigger.player.judging[0])+''+get.prompt('reguicai'),'he').set('ai',function(card){
var trigger=_status.event.getTrigger();
var player=_status.event.player;
var judging=_status.event.judging;
var result=trigger.judge(card)-trigger.judge(judging);
var attitude=ai.get.attitude(player,trigger.player);
if(attitude==0||result==0) return 0;
if(attitude>0){
return result-ai.get.value(card)/2;
}
else{
return -result-ai.get.value(card)/2;
}
}).set('judging',trigger.player.judging[0]);
"step 1"
if(result.bool){
player.respond(result.cards,'highlight');
}
else{
event.finish();
}
"step 2"
if(result.bool){
player.logSkill('reguicai');
if(trigger.player.judging[0].clone){
trigger.player.judging[0].clone.classList.remove('thrownhighlight');
game.broadcast(function(card){
if(card.clone){
card.clone.classList.remove('thrownhighlight');
}
},trigger.player.judging[0]);
game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging[0].clone]));
}
ui.discardPile.appendChild(trigger.player.judging[0]);
trigger.player.judging[0]=result.cards[0];
if(!get.owner(result.cards[0],'judge')){
trigger.position.appendChild(result.cards[0]);
}
game.log(trigger.player,'的判定牌改为',result.cards[0]);
game.delay(2);
}
},
ai:{
tag:{
rejudge:1,
}
}
},
refankui:{
audio:2,
trigger:{player:'damageEnd'},
direct:true,
filter:function(event,player){
return (event.source&&event.source.countCards('he')&&event.num>0&&event.source!=player);
},
content:function(){
player.gainPlayerCard([1,trigger.num],get.prompt('fankui',trigger.source),trigger.source,ai.get.buttonValue,'he').set('logSkill',['refankui',trigger.source]);
},
ai:{
effect:{
target:function(card,player,target){
if(player.countCards('he')>1&&get.tag(card,'damage')){
if(player.hasSkillTag('jueqing')) return [1,-1.5];
if(ai.get.attitude(target,player)<0) return [1,1];
}
}
}
}
},
reluoyi:{
audio:2,
trigger:{player:'phaseDrawBegin'},
check:function(event,player){
if(player.num('h','sha')) return true;
return Math.random()<0.5;
},
content:function(){
"step 0"
player.addTempSkill('reluoyi2',{player:'phaseBefore'});
trigger.untrigger();
trigger.finish();
"step 1"
event.cards=get.cards(3);
player.showCards(event.cards,'裸衣');
"step 2"
for(var i=0;i<cards.length;i++){
if(get.type(cards[i])!='basic'&&cards[i].name!='juedou'&&
(get.type(cards[i])!='equip'||get.subtype(cards[i])!='equip1')){
ui.discardPile.appendChild(cards[i]);
cards.splice(i--,1);
}
}
player.gain(cards,'gain2');
}
},
reluoyi2:{
trigger:{source:'damageBegin'},
filter:function(event){
return event.card&&(event.card.name=='sha'||event.card.name=='juedou')&&event.notLink();
},
forced:true,
content:function(){
trigger.num++;
}
},
reganglie:{
audio:2,
trigger:{player:'damageEnd'},
filter:function(event,player){
return (event.source!=undefined&&event.num>0);
},
check:function(event,player){
return (ai.get.attitude(player,event.source)<=0);
},
logTarget:'source',
content:function(){
"step 0"
event.num=trigger.num;
"step 1"
player.judge(function(card){
if(get.color(card)=='red') return 2;
return 1;
})
"step 2"
if(result.judge==1&&trigger.source.countCards('he')){
player.discardPlayerCard(trigger.source,'he',true);
}
else{
if(result.judge==2){
trigger.source.damage();
}
}
event.num--;
if(event.num>0){
player.chooseBool('是否继续发动?');
}
else{
event.finish();
}
"step 3"
if(result.bool){
event.goto(1);
}
},
ai:{
expose:0.4
}
},
qinxue:{
skillAnimation:true,
audio:2,
unique:true,
derivation:'gongxin',
trigger:{player:'phaseBegin'},
forced:true,
filter:function(event,player){
if(player.storage.qinxue) return false;
if(player.countCards('h')>=player.hp+3) return true;
if(player.countCards('h')>=player.hp+2&&game.players.length+game.dead.length>=7) return true;
return false;
},
content:function(){
player.storage.qinxue=true;
player.loseMaxHp();
player.addSkill('gongxin');
player.awakenSkill('qinxue');
}
},
qingjian:{
audio:2,
unique:true,
trigger:{player:'gainAfter'},
direct:true,
usable:4,
filter:function(event,player){
if(event.parent.parent.name=='phaseDraw') return false;
return event.cards&&event.cards.length>0
},
content:function(){
"step 0"
event.cards=trigger.cards.slice(0);
"step 1"
player.chooseCardTarget({
filterCard:function(card){
return _status.event.getParent().cards.contains(card);
},
selectCard:[1,event.cards.length],
filterTarget:function(card,player,target){
return player!=target;
},
ai1:function(card){
if(ui.selected.cards.length>0) return -1;
if(card.name=='du') return 20;
return (_status.event.player.countCards('h')-_status.event.player.hp);
},
ai2:function(target){
var att=ai.get.attitude(_status.event.player,target);
if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){
if(target.hasSkillTag('nodu')) return 0;
return 1-att;
}
if(target.countCards('h')>_status.event.player.countCards('h')) return 0;
return att-4;
},
prompt:'请选择要送人的卡牌'
});
"step 2"
if(result.bool){
player.storage.qingjian++;
player.logSkill('qingjian',result.targets);
result.targets[0].gain(result.cards,player);
player.$give(result.cards.length,result.targets[0]);
for(var i=0;i<result.cards.length;i++){
event.cards.remove(result.cards[i]);
}
if(event.cards.length) event.goto(1);
}
else{
player.storage.counttrigger.qingjian--;
}
},
ai:{
expose:0.3
},
},
reyingzi:{
audio:2,
audioname:['sunce'],
trigger:{player:'phaseDrawBegin'},
forced:true,
content:function(){
trigger.num++;
},
ai:{
threaten:1.5
},
mod:{
maxHandcard:function(player,num){
if(player.hp<player.maxHp) return num+player.maxHp-player.hp;
}
}
},
refanjian:{
audio:2,
enable:'phaseUse',
usable:1,
filter:function(event,player){
return player.countCards('h')>0;
},
filterTarget:function(card,player,target){
return player!=target;
},
filterCard:true,
check:function(card){
return 8-ai.get.value(card);
},
discard:false,
prepare:'give',
content:function(){
"step 0"
target.storage.refanjian=cards[0];
target.gain(cards[0],player);
"step 1"
target.chooseControl('refanjian_card','refanjian_hp').ai=function(event,player){
var cards=player.get('he',{suit:get.suit(player.storage.refanjian)});
if(cards.length==1) return 0;
if(cards.length>=2){
for(var i=0;i<cards.length;i++){
if(get.tag(cards[i],'save')) return 1;
}
}
if(player.hp==1) return 0;
for(var i=0;i<cards.length;i++){
if(ai.get.value(cards[i])>=8) return 1;
}
if(cards.length>2&&player.hp>2) return 1;
if(cards.length>3) return 1;
return 0;
}
"step 2"
if(result.control=='refanjian_card'){
target.showHandcards();
}
else{
target.loseHp();
event.finish();
}
"step 3"
target.discard(target.get('he',{suit:get.suit(target.storage.refanjian)}))
delete target.storage.refanjian;
},
ai:{
order:9,
result:{
target:function(player,target){
return -target.countCards('he')-(player.num('h','du')?1:0);
}
},
threaten:2,
}
},
reqianxun:{
init:function(player){
player.storage.reqianxun2=[];
},
audio:2,
trigger:{target:'useCardToBegin',player:'judgeBefore'},
filter:function(event,player){
if(player.countCards('h')==0) return false;
if(event.parent.name=='phaseJudge'){
if(lib.skill.reqianxun.trigger.player=='judgeBefore'){
return true;
}
return event.result&&event.result.judge!=0;
}
if(event.name=='judge') return false;
if(event.targets&&event.targets.length>1) return false;
if(event.card&&get.type(event.card)=='trick'&&event.player!=player) return true;
},
content:function(){
player.storage.reqianxun2=player.storage.reqianxun2.concat(player.getCards('h'));
game.addVideo('storage',player,['reqianxun2',get.cardsInfo(player.storage.reqianxun2),'cards']);
player.lose(player.getCards('h'),ui.special);
player.addSkill('reqianxun2');
},
ai:{
effect:function(card,player,target){
if(!target.hasFriend()) return;
if(get.type(card,'trick')=='trick'&&ui.selected.targets.length==0) return [1,1];
},
},
},
reqianxun2:{
trigger:{global:'phaseAfter'},
forced:true,
audio:false,
content:function(){
player.gain(player.storage.reqianxun2);
player.removeSkill('reqianxun2');
player.storage.reqianxun2=[];
game.addVideo('storage',player,['reqianxun2',get.cardsInfo(player.storage.reqianxun2),'cards']);
},
mark:true,
intro:{
content:'cardCount'
}
},
relianying:{
audio:2,
trigger:{player:'loseEnd'},
direct:true,
filter:function(event,player){
if(player.countCards('h')) return false;
for(var i=0;i<event.cards.length;i++){
if(event.cards[i].original=='h') return true;
}
return false;
},
content:function(){
"step 0"
var num=0;
for(var i=0;i<trigger.cards.length;i++){
if(trigger.cards[i].original=='h') num++;
}
player.chooseTarget('选择发动连营的目标',[1,num]).ai=function(target){
var player=_status.event.player;
if(player==target) return ai.get.attitude(player,target)+10;
return ai.get.attitude(player,target);
}
"step 1"
if(result.bool){
player.logSkill('relianying',result.targets);
game.asyncDraw(result.targets);
}
},
ai:{
threaten:0.8,
effect:{
target:function(card){
if(card.name=='guohe'||card.name=='liuxinghuoyu') return 0.5;
}
},
noh:true,
}
},
retishen:{
audio:2,
unique:true,
mark:true,
skillAnimation:true,
trigger:{player:'phaseBegin'},
init:function(player){
player.storage.retishen=false;
},
filter:function(event,player){
if(player.storage.retishen) return false;
if(typeof player.storage.retishen2=='number'){
return player.hp<player.storage.retishen2;
}
return false;
},
check:function(event,player){
if(player.hp<=1) return true;
return player.hp<player.storage.retishen2-1;
},
content:function(){
player.awakenSkill('retishen');
player.recover(player.storage.retishen2-player.hp);
player.draw(player.storage.retishen2-player.hp);
player.storage.retishen=true;
},
intro:{
mark:function(dialog,content,player){
if(player.storage.retishen) return;
if(typeof player.storage.retishen2!='number'){
return '上回合体力:无';
}
return '上回合体力:'+player.storage.retishen2;
},
content:'limited'
},
group:['retishen2']
},
retishen2:{
trigger:{player:'phaseEnd'},
priority:-10,
forced:true,
popup:false,
silent:true,
content:function(){
player.storage.retishen2=player.hp;
game.broadcast(function(player){
player.storage.retishen2=player.hp;
},player);
game.addVideo('storage',player,['retishen2',player.storage.retishen2]);
},
intro:{
content:function(storage,player){
if(player.storage.retishen) return;
return '上回合体力:'+storage;
}
}
},
reyajiao:{
audio:2,
trigger:{player:['respond','useCard']},
frequent:true,
filter:function(event,player){
return player!=_status.currentPhase&&get.itemtype(event.cards)=='cards';
},
content:function(){
"step 0"
event.card=get.cards()[0];
game.broadcast(function(card){
ui.arena.classList.add('thrownhighlight');
card.copy('thrown','center','thrownhighlight',ui.arena).animate('start');
},event.card);
event.node=event.card.copy('thrown','center','thrownhighlight',ui.arena).animate('start');
ui.arena.classList.add('thrownhighlight');
game.addVideo('thrownhighlight1');
game.addVideo('centernode',null,get.cardInfo(event.card));
if(get.type(event.card,'trick')==get.type(trigger.card,'trick')){
player.chooseTarget('选择获得此牌的角色').set('ai',function(target){
var att=ai.get.attitude(_status.event.player,target);
if(_status.event.du){
if(target.hasSkillTag('nodu')) return 0;
return -att;
}
if(att>0){
return att+Math.max(0,5-target.countCards('h'));
}
return att;
}).set('du',event.card.name=='du');
}
else{
player.chooseBool('是否弃置'+get.translation(event.card)+'');
event.disbool=true;
}
game.delay(2);
"step 1"
if(event.disbool){
if(!result.bool){
game.log(player,'展示了',event.card);
ui.cardPile.insertBefore(event.card,ui.cardPile.firstChild);
}
else{
game.log(player,'展示并弃掉了',event.card);
ui.discardPile.appendChild(event.card);
}
game.addVideo('deletenode',player,[get.cardInfo(event.node)]);
event.node.delete();
game.broadcast(function(card){
ui.arena.classList.remove('thrownhighlight');
if(card.clone){
card.clone.delete();
}
},event.card);
}
else if(result.targets){
player.line(result.targets,'green');
result.targets[0].gain(event.card,'log');
event.node.moveDelete(result.targets[0]);
game.addVideo('gain2',result.targets[0],[get.cardInfo(event.node)]);
game.broadcast(function(card,target){
ui.arena.classList.remove('thrownhighlight');
if(card.clone){
card.clone.moveDelete(target);
}
},event.card,result.targets[0]);
}
else{
game.log(player,'展示并弃掉了',event.card);
ui.discardPile.appendChild(event.card);
game.addVideo('deletenode',player,[get.cardInfo(event.node)]);
event.node.delete();
game.broadcast(function(card){
ui.arena.classList.remove('thrownhighlight');
if(card.clone){
card.clone.delete();
}
},event.card);
}
game.addVideo('thrownhighlight2');
ui.arena.classList.remove('thrownhighlight');
},
ai:{
effect:{
target:function(card,player){
if(get.tag(card,'respond')&&player.countCards('h')>1) return [1,0.2];
}
}
}
},
rejianxiong:{
audio:2,
trigger:{player:'damageEnd'},
direct:true,
content:function(){
"step 0"
if(get.itemtype(trigger.cards)=='cards'&&get.position(trigger.cards[0])=='d'){
player.chooseControl('rejianxiong_mopai','rejianxiong_napai','cancel2').ai=function(){
var trigger=_status.event.getTrigger();
if(trigger.cards.length==1&&trigger.cards[0].name=='sha') return 0;
return 1;
};
}
else{
player.chooseControl('rejianxiong_mopai','cancel2');
}
"step 1"
if(result.control=='rejianxiong_napai'){
player.logSkill('rejianxiong');
player.gain(trigger.cards);
player.$gain2(trigger.cards);
}
else if(result.control=='rejianxiong_mopai'){
player.logSkill('rejianxiong');
player.draw();
}
},
ai:{
maixie:true,
maixie_hp:true,
effect:{
target:function(card,player,target){
if(player.hasSkillTag('jueqing')) return [1,-1];
if(get.tag(card,'damage')&&player!=target) return [1,0.6];
}
}
}
},
reyiji:{
audio:2,
trigger:{player:'damageEnd'},
frequent:true,
filter:function(event){
return (event.num>0)
},
content:function(){
"step 0"
event.num=1;
event.count=1;
"step 1"
player.gain(get.cards(2));
player.$draw(2);
"step 2"
player.chooseCardTarget({
filterCard:true,
selectCard:[1,2],
filterTarget:function(card,player,target){
return player!=target&&target!=event.temp;
},
ai1:function(card){
if(ui.selected.cards.length>0) return -1;
if(card.name=='du') return 20;
return (_status.event.player.countCards('h')-_status.event.player.hp);
},
ai2:function(target){
var att=ai.get.attitude(_status.event.player,target);
if(ui.selected.cards.length&&ui.selected.cards[0].name=='du'){
if(target.hasSkillTag('nodu')) return 0;
return 1-att;
}
return att-4;
},
prompt:'请选择要送人的卡牌'
});
"step 3"
if(result.bool){
player.lose(result.cards,ui.special);
if(result.targets[0].hasSkill('reyiji2')){
result.targets[0].storage.reyiji2=result.targets[0].storage.reyiji2.concat(result.cards);
}
else{
result.targets[0].addSkill('reyiji2');
result.targets[0].storage.reyiji2=result.cards;
}
player.$give(result.cards.length,result.targets[0]);
player.line(result.targets,'green');
game.addVideo('storage',result.targets[0],['reyiji2',get.cardsInfo(result.targets[0].storage.reyiji2),'cards']);
if(num==1){
event.temp=result.targets[0];
event.num++;
event.goto(2);
}
else if(event.count<trigger.num){
delete event.temp;
event.num=1;
event.count++;
event.goto(1);
}
}
else if(event.count<trigger.num){
delete event.temp;
event.num=1;
event.count++;
event.goto(1);
}
},
ai:{
maixie:true,
maixie_hp:true,
result:{
effect:function(card,player,target){
if(get.tag(card,'damage')){
if(player.hasSkillTag('jueqing')) return [1,-2];
if(player.hp>=4) return [1,get.tag(card,'damage')*2];
if(target.hp==3) return [1,get.tag(card,'damage')*1.5];
if(target.hp==2) return [1,get.tag(card,'damage')*0.5];
}
}
},
threaten:0.6
}
},
reyiji2:{
trigger:{player:'phaseDrawBegin'},
forced:true,
mark:true,
popup:'遗计拿牌',
audio:false,
content:function(){
player.$draw(player.storage.reyiji2.length);
player.gain(player.storage.reyiji2);
delete player.storage.reyiji2;
player.removeSkill('reyiji2');
game.delay();
},
intro:{
content:'cardCount'
}
},
yijue:{
audio:2,
enable:'phaseUse',
usable:1,
filterTarget:function(card,player,target){
return player!=target&&target.countCards('h');
},
filter:function(event,player){
return player.countCards('h')>0;
},
content:function(){
"step 0"
player.chooseToCompare(target).set('small',true);
"step 1"
if(result.bool){
if(!target.hasSkill('fengyin')){
target.addTempSkill('fengyin','phaseAfter');
}
target.addTempSkill('yijue2','phaseAfter');
event.finish();
}
else if(target.hp<target.maxHp){
player.chooseBool('是否让目标回复一点体力?').ai=function(event,player){
return ai.get.recoverEffect(target,player,player)>0;
};
}
else{
event.finish();
}
"step 2"
if(result.bool){
target.recover();
}
},
ai:{
result:{
target:function(player,target){
var hs=player.getCards('h');
if(hs.length<3) return 0;
var bool=false;
for(var i=0;i<hs.length;i++){
if(hs[i].number>=9&&ai.get.value(hs[i])<7){
bool=true;
break;
}
}
if(!bool) return 0;
if(target.countCards('h')>target.hp+1&&ai.get.recoverEffect(target)>0){
return 1;
}
if(player.canUse('sha',target)&&(player.num('h','sha')||player.num('he',{color:'red'}))){
return -2;
}
return -0.5;
}
},
order:9,
}
},
yijue2:{
mark:true,
mod:{
cardEnabled:function(){
return false;
},
cardUsable:function(){
return false;
},
cardRespondable:function(){
return false;
},
cardSavable:function(){
return false;
}
},
intro:{
content:'不能使用或打出卡牌'
}
},
retieji:{
audio:2,
trigger:{player:'shaBegin'},
check:function(event,player){
return ai.get.attitude(player,event.target)<0;
},
logTarget:'target',
content:function(){
"step 0"
player.judge(function(){return 0});
if(!trigger.target.hasSkill('fengyin')){
trigger.target.addTempSkill('fengyin','phaseAfter');
}
"step 1"
var suit=get.suit(result.card);
var target=trigger.target;
var num=target.num('h','shan');
target.chooseToDiscard('请弃置一张'+get.translation(suit)+'牌,否则不能使用闪抵消此杀','he',function(card){
return get.suit(card)==_status.event.suit;
}).set('ai',function(card){
var num=_status.event.num;
if(num==0) return 0;
if(card.name=='shan') return num>1?2:0;
return 8-ai.get.value(card);
}).set('num',num).set('suit',suit);
"step 2"
if(!result.bool){
trigger.directHit=true;
}
}
},
reyicong:{
mod:{
globalFrom:function(from,to,current){
if(from.hp>2) return current-1;
},
globalTo:function(from,to,current){
if(to.hp<=2) return current+1;
},
},
ai:{
threaten:0.8
}
},
qiaomeng:{
audio:2,
trigger:{source:'damageEnd'},
direct:true,
filter:function(event){
return event.card&&event.card.name=='sha'&&event.cards&&
get.color(event.cards)=='black'&&event.player.countCards('e');
},
content:function(){
"step 0"
player.choosePlayerCard('e',trigger.player);
"step 1"
if(result.bool){
player.logSkill('qiaomeng');
trigger.player.discard(result.links[0]);
event.card=result.links[0];
}
else{
event.finish();
}
"step 2"
if(get.position(card)=='d'){
if(get.subtype(card)=='equip3'||get.subtype(card)=='equip4'){
player.gain(card,trigger.player);
player.$gain2(card);
}
}
}
},
rekurou:{
audio:2,
enable:'phaseUse',
usable:1,
filterCard:true,
check:function(card){
return 8-ai.get.value(card);
},
position:'he',
content:function(){
player.loseHp();
},
ai:{
order:8,
result:{
player:function(player){
if(player.hp<=2) return player.countCards('h')==0?1:0;
if(player.num('h',{name:'sha',color:'red'})) return 1;
return player.countCards('h')<=player.hp?1:0;
}
},
effect:function(card,player){
if(get.tag(card,'damage')){
if(player.hasSkillTag('jueqing')) return [1,1];
return 1.2;
}
if(get.tag(card,'loseHp')){
if(player.hp<=1) return;
return [0,0];
}
}
}
},
zhaxiang:{
trigger:{player:'loseHpEnd'},
forced:true,
audio:2,
content:function(){
player.draw(3);
if(_status.currentPhase==player){
player.addTempSkill('zhaxiang2',{player:'phaseAfter'});
}
else{
game.trySkillAudio('zhaxiang',player);
}
}
},
zhaxiang2:{
mod:{
targetInRange:function(card,player,target,now){
if(card.name=='sha'&&get.color(card)=='red') return true;
},
cardUsable:function(card,player,num){
if(card.name=='sha') return num+1;
}
},
trigger:{player:'shaBegin'},
forced:true,
filter:function(event,player){
return event.card&&get.color(event.card)=='red';
},
content:function(){
trigger.directHit=true;
}
},
zhuhai:{
trigger:{global:'phaseEnd'},
direct:true,
filter:function(event,player){
return event.player.isAlive()&&event.player.getStat('damage')&&
lib.filter.targetEnabled({name:'sha'},player,event.player)&&player.hasSha();
},
content:function(){
player.chooseToUse({name:'sha'},'诛害:是否对'+get.translation(trigger.player)+'使用一张杀?',
trigger.player,-1).set('logSkill','zhuhai');
}
},
qianxin:{
skillAnimation:true,
audio:2,
unique:true,
trigger:{source:'damageAfter'},
forced:true,
derivation:'jianyan',
filter:function(event,player){
return player.hp<player.maxHp;
},
content:function(){
player.awakenSkill('qianxin');
player.addSkill('jianyan');
player.loseMaxHp();
}
},
jianyan:{
audio:2,
enable:'phaseUse',
usable:1,
filter:function(event,player){
return game.hasPlayer(function(current){
return current.sex=='male';
});
},
content:function(){
"step 0"
player.chooseControl(['red','black','basic','trick','equip']).set('ai',function(){
var player=_status.event.player;
if(player.num('shan')==0) return 'basic';
if(player.countCards('e')<=1) return 'equip';
if(player.countCards('h')>2) return 'trick';
return 'red';
});
"step 1"
var num=20;
var card;
event.cards=[];
while(num--){
card=get.cards(0);
event.cards.push(card);
if(get.color(card)==result.control) break;
else if(get.type(card,'trick')==result.control) break;
}
event.card=card;
player.showCards(event.cards);
player.chooseTarget(true,'选择一名男性角色送出'+get.translation(event.card),function(card,player,target){
return target.sex=='male';
});
"step 2"
player.line(result.targets,'green');
result.targets[0].$gain2(event.card);
for(var i=0;i<cards.length-1;i++){
ui.discardPile.appendChild(cards[i]);
}
game.delay(0,1000);
"step 3"
result.targets[0].gain(event.card,'log');
},
ai:{
order:9,
result:{
player:2
},
threaten:1.2
}
},
reguose:{
audio:1,
enable:'phaseUse',
usable:1,
discard:false,
filter:function(event,player){
return player.num('he',{suit:'diamond'})>0;
},
prepare:'throw',
position:'he',
filterCard:{suit:'diamond'},
filterTarget:function(card,player,target){
if(player==target) return false;
if(target.hasJudge('lebu')) return true;
return lib.filter.targetEnabled({name:'lebu'},player,target);
},
check:function(card){
return 7-ai.get.value(card);
},
content:function(){
if(target.hasJudge('lebu')){
target.discard(target.getJudge('lebu'));
}
else{
var next=player.useCard({name:'lebu'},target,cards);
next.animate=false;
next.audio=false;
}
player.draw();
},
ai:{
result:{
target:function(player,target){
if(target.hasJudge('lebu')) return -ai.get.effect(target,{name:'lebu'},player,target);
return ai.get.effect(target,{name:'lebu'},player,target);
}
},
order:9,
}
},
fenwei:{
skillAnimation:true,
audio:2,
unique:true,
mark:true,
trigger:{global:'useCard'},
priority:5,
filter:function(event,player){
if(get.type(event.card)!='trick') return false;
if(get.info(event.card).multitarget) return false;
if(event.targets.length<2) return false;
if(player.storage.fenwei) return false;
return true;
},
init:function(player){
player.storage.fenwei=false;
},
direct:true,
content:function(){
"step 0"
player.chooseTarget(get.prompt('fenwei'),
[1,trigger.targets.length],function(card,player,target){
return _status.event.getTrigger().targets.contains(target);
}).set('ai',function(target){
var trigger=_status.event.getTrigger();
if(game.phaseNumber>game.players.length*2&&trigger.targets.length>=game.players.length-1){
return -ai.get.effect(target,trigger.card,trigger.player,_status.event.player);
}
return -1;
});
"step 1"
if(result.bool){
player.awakenSkill('fenwei');
player.logSkill('fenwei',result.targets);
player.storage.fenwei=true;
for(var i=0;i<result.targets.length;i++){
trigger.targets.remove(result.targets[i]);
}
game.delay();
}
},
intro:{
content:'limited'
}
},
chulao:{
audio:2,
enable:'phaseUse',
usable:1,
filterTarget:function(card,player,target){
if(player==target) return false;
if(target.group=='unknown') return false;
for(var i=0;i<ui.selected.targets.length;i++){
if(ui.selected.targets[i].group==target.group) return false;
}
return target.countCards('he')>0;
},
filter:function(event,player){
return player.countCards('he')>0;
},
filterCard:true,
position:'he',
selectTarget:[1,Infinity],
check:function(card){
if(get.suit(card)=='spade') return 8-ai.get.value(card);
return 5-ai.get.value(card);
},
content:function(){
"step 0"
if(num==0&&get.suit(cards[0])=='spade') player.draw();
player.choosePlayerCard(targets[num],'he',true);
"step 1"
if(result.bool){
if(result.links.length) targets[num].discard(result.links[0]);
if(get.suit(result.links[0])=='spade') targets[num].draw();
}
},
ai:{
result:{
target:-1
},
threaten:1.2,
order:3
}
},
xunxun:{
audio:2,
trigger:{player:'phaseDrawBefore'},
check:function(event,player){
return !player.hasSkill('reyiji2');
},
content:function(){
"step 0"
trigger.untrigger();
trigger.finish();
event.cards=get.cards(4);
player.chooseCardButton(event.cards,2,'选择获得两张牌').set('ai',ai.get.buttonValue);
"step 1"
if(result.bool){
var choice=[];
for(var i=0;i<result.links.length;i++){
choice.push(result.links[i]);
cards.remove(result.links[i]);
}
for(var i=0;i<cards.length;i++){
ui.cardPile.appendChild(cards[i]);
}
player.gain(choice,'draw');
game.log(player,'获得了两张牌')
}
},
},
wangxi:{
audio:2,
trigger:{player:'damageEnd',source:'damageEnd'},
filter:function(event){
return event.num&&event.source&&event.player&&
event.player.isAlive()&&event.source.isAlive()&&event.source!=event.player;
},
check:function(event,player){
if(event.player==player) return ai.get.attitude(player,event.source)>-3;
return ai.get.attitude(player,event.player)>-3;
},
logTarget:function(event,player){
if(event.player==player) return event.source;
return event.player;
},
content:function(){
"step 0"
game.asyncDraw([trigger.player,trigger.source],trigger.num);
"step 1"
game.delay();
}
}
},
translate:{
re_zhangliao:'界张辽',
re_huangyueying:'新黄月英',
re_simayi:'界司马懿',
re_xuzhu:'界许褚',
re_xiahoudun:'界夏侯惇',
re_lvmeng:'界吕蒙',
re_zhouyu:'界周瑜',
re_luxun:'界陆逊',
re_zhaoyun:'界赵云',
re_guanyu:'界关羽',
re_zhangfei:'界张飞',
re_machao:'界马超',
re_caocao:'界曹操',
re_guojia:'界郭嘉',
re_lvbu:'界吕布',
re_xushu:'界徐庶',
re_huanggai:'界黄盖',
re_gongsunzan:'界公孙瓒',
re_daqiao:'界大乔',
re_ganning:'界甘宁',
re_huatuo:'界华佗',
re_lidian:'李典',
re_liubei:'界刘备',
qinxue:'勤学',
retuxi:'突袭',
reluoyi:'裸衣',
reluoyi2:'裸衣',
reganglie:'刚烈',
qingjian:'清俭',
reyingzi:'英姿',
refanjian:'反间',
refanjian_card:'弃牌',
refanjian_hp:'流失体力',
reqianxun:'谦逊',
reqianxun2:'谦逊',
relianying:'连营',
retishen:'替身',
retishen2:'替身',
reyajiao:'涯角',
rejianxiong:'奸雄',
rejianxiong_mopai:'摸牌',
rejianxiong_napai:'拿牌',
reyiji:'遗计',
reyiji2:'遗计',
yijue:'义绝',
yijue2:'义绝',
retieji:'铁骑',
refankui:'反馈',
reyicong:'义从',
qiaomeng:'趫猛',
rekurou:'苦肉',
zhaxiang:'诈降',
zhaxiang2:'诈降',
zhuhai:'诛害',
qianxin:'潜心',
jianyan:'荐言',
reguicai:'鬼才',
xunxun:'恂恂',
wangxi:'忘隙',
reguose:'国色',
fenwei:'奋威',
chulao:'除疠',
rejizhi:'集智',
liyu:'利驭',
rerende:'仁德',
rerende_info:'出牌阶段,你可以将至少一张手牌交给其他角色,然后你于此阶段内不能再以此法交给该角色牌;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌',
liyu_info:'当你使用【杀】对一名其他角色造成伤害后,该角色可令你获得其一张牌,若如此做,则视为你对其选择的另一名角色使用一张【决斗】',
rejizhi_info:'当你使用一张装备牌或锦囊牌时你可以摸一张牌并展示之若此牌是基本牌你须弃置一张手牌每回合限3次',
xunxun_info:'摸牌阶段,你可以改为观看牌堆顶的四张牌,然后获得其中的两张牌,将其余的牌以任意顺序置于牌堆底。',
wangxi_info:'每当你对其他角色造成1点伤害后或受到其他角色造成的1点伤害后你可与该角色各摸一张牌。',
reguose_info:'出牌阶段限一次,你可以选择一项:将一张方片花色牌当做【乐不思蜀】使用;或弃置一张方片花色牌并弃置场上的一张【乐不思蜀】。选择完成后,你摸一张牌。',
fenwei_info:'限定技,当一名角色使用的锦囊牌指定了至少两名角色为目标时,你可以令此牌对其中任意名角色无效。',
chulao_info:'出牌阶段限一次,若你有牌,你可以选择任意名势力各不相同的其他角色,你弃置你和这些角色的各一张牌。然后以此法弃置黑桃牌的角色各摸一张牌。',
reguicai_info:'在任意角色的判定牌生效前,你可以打出一张牌代替之',
zhuhai_info:'一名其他角色的结束阶段开始时,若该角色本回合造成过伤害,你可以对其使用一张【杀】。',
qianxin_info:'觉醒技当你造成一次伤害后若你已受伤你须减1点体力上限并获得技能“荐言”。',
jianyan_info:'出牌阶段限一次,你可以声明一种牌的类别或颜色,然后连续亮出牌堆顶的牌,直到亮出符合你声明的牌为止,选择一名男性角色,该角色获得此牌',
rekurou_info:'出牌阶段限一次你可以弃置一张牌然后失去1点体力。',
zhaxiang_info:'锁定技 每当你失去1点体力后你摸三张牌。然后若此时是你的出牌阶段则直到回合结束你使用红色【杀】无距离限制且不能被【闪】响应你可以额外使用一张【杀】。',
qiaomeng_info:'每当你使用黑色【杀】对一名角色造成伤害后,你可以弃置该角色装备区里的一张牌,若此牌是坐骑牌,你于此牌置入弃牌堆时获得之。',
reyicong_info:'锁定技只要你的体力值大于2点你的进攻距离+1只要你的体力值为2点或更低你的防御距离+1',
refankui_info:'每当你受到1点伤害后你可以获得伤害来源的一张牌。',
retieji_info:'当你使用【杀】指定一名角色为目标后,你可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。',
yijue_info:'出牌阶段限一次,你可以与一名其他角色拼点,若你赢,则直到回合结束,该角色不能使用或打出手牌且其非锁定技失效,若你没赢,你可令该角色回复一点体力。',
reyiji_info:'每当你受到1点伤害后你可以摸两张牌。然后你可以在至多两名角色的武将牌旁边分别扣置至多两张手牌这些角色的下个摸牌阶段开始时该角色获得其武将牌旁的这些牌。',
rejianxiong_info:'每当你受到伤害后,你可以选择一项:摸一张牌,或获得对你造成伤害的牌。',
reyajiao_info:'每当你于回合外使用或打出一张手牌时,你可以亮出牌堆顶的一张牌,若此牌与你此次使用或打出的牌类别相同,你可以将之交给任意一名角色;若不同则你可以将之置入弃牌堆。',
retishen_info:'限定技准备阶段开始时你可以将体力回复至等同于你上回合结束时的体力值然后你每以此法回复1点体力便摸一张牌。',
reqianxun_info:'每当一张延时类锦囊牌或其他角色使用的普通锦囊牌生效时,若你是此牌的唯一目标,你可以将所有手牌置于你的武将牌上,若如此做,此回合结束时,你获得你武将牌上的所有牌。',
relianying_info:'当你失去最后的手牌时你可以令至多X名角色各摸一张牌X为你此次失去的手牌数。',
reyingzi_info:'锁定技,摸牌阶段摸牌时,你额外摸一张牌;你的手牌上限不会因体力值的减少而减少。',
refanjian_info:'出牌阶段限一次,你可以展示一张手牌并将此牌交给一名其他角色。然后该角色选择一项:展示其手牌并弃置所有与此牌花色相同的牌,或失去一点体力。',
qingjian_info:'每当你于摸牌阶段外获得牌时,你可以将其中任意牌以任意顺序交给其他角色,每回合最多发动四次',
qinxue_info:'觉醒技准备阶段开始时若你的手牌数比体力值多3人数不少于7时改为2或更多你须减一点体力上限并获得技能【攻心】',
retuxi_info:'摸牌阶段摸牌时,你可以少摸任意张牌,然后选择等量的手牌数大于或等于你的其他角色,获得这些角色的各一张手牌。',
reluoyi_info:'你可以跳过摸牌阶段,然后展示牌堆顶的三张牌,获得其中的基本牌、武器牌和【决斗】,若如此做,直到你的下回合开始,你为伤害来源的【杀】或【决斗】造成的伤害+1。',
reganglie_info:'每当你受到1点伤害后可进行一次判定若结果为红色你对伤害来源造成1点伤害若结果为黑色你弃置其一张牌。'
},
}