noname/card/zhulu.js

844 lines
24 KiB
JavaScript
Raw Normal View History

2020-03-05 13:10:37 +00:00
'use strict';
game.import('card',function(lib,game,ui,get,ai,_status){
return {
name:'zhulu',
connect:true,
card:{
zhulu_card:{
audio:true,
fullskin:true,
type:'trick',
enable:true,
cardcolor:'red',
selectTarget:-1,
filterTarget:true,
contentBefore:function(){
"step 0"
if(get.is.versus()){
player.chooseControl('顺时针','逆时针',function(event,player){
if(player.next.side==player.side) return '逆时针';
return '顺时针';
}).set('prompt','选择'+get.translation(card)+'的结算方向');
}
else{
event.goto(2);
}
"step 1"
if(result&&result.control=='顺时针'){
var evt=event.getParent();
evt.fixedSeat=true;
evt.targets.sortBySeat();
evt.targets.reverse();
if(evt.targets[evt.targets.length-1]==player){
evt.targets.unshift(evt.targets.pop());
}
}
"step 2"
ui.clear();
var num;
if(event.targets){
num=event.targets.length;
}
else{
num=game.countPlayer();
}
var cards=[];
for(var i=0;i<num;i++){
var cardx=get.cardPile(function(card){
return get.type(card)=='equip'&&!cards.contains(card);
});
if(cardx) cards.push(cardx);
};
if(!cards.length){
event.finish();
event.getParent().excluded.addArray(game.players);
return;
}
game.cardsGotoOrdering(cards).relatedEvent=event.getParent();
var dialog=ui.create.dialog('逐鹿天下',cards,true);
_status.dieClose.push(dialog);
dialog.videoId=lib.status.videoId++;
game.addVideo('cardDialog',null,['逐鹿天下',get.cardsInfo(cards),dialog.videoId]);
event.getParent().preResult=dialog.videoId;
game.broadcast(function(cards,id){
var dialog=ui.create.dialog('逐鹿天下',cards,true);
_status.dieClose.push(dialog);
dialog.videoId=id;
},cards,dialog.videoId);
game.log(event.card,'亮出了',cards);
},
content:function(){
"step 0"
for(var i=0;i<ui.dialogs.length;i++){
if(ui.dialogs[i].videoId==event.preResult){
event.dialog=ui.dialogs[i];break;
}
}
if(!event.dialog){
event.finish();
return;
}
var equips=[];
for(var i=0;i<event.dialog.buttons.length;i++){
var card=event.dialog.buttons[i].link;
2020-05-16 05:03:13 +00:00
if(!target.isDisabled(get.subtype(card))) equips.push(card);
2020-03-05 13:10:37 +00:00
}
if(equips.length>1){
var next=target.chooseButton(true,function(button){
var player=_status.event.player;
return get.effect(player,button.link,player,player);
});
next.set('equips',equips);
next.set('filterButton',function(button){
return _status.event.equips.contains(button.link);
});
next.set('dialog',event.preResult);
next.set('closeDialog',false);
next.set('dialogdisplay',true);
}
else if(equips.length){
event.directButton=equips[0];
}
else event.finish();
"step 1"
var dialog=event.dialog;
var card;
if(event.directButton){
card=event.directButton;
}
else{
card=result.links[0];
}
var button;
for(var i=0;i<dialog.buttons.length;i++){
if(dialog.buttons[i].link==card){
button=dialog.buttons[i];
2020-06-13 04:51:36 +00:00
button.querySelector('.info').innerHTML=function(target){
if(target._tempTranslate) return target._tempTranslate;
var name=target.name;
if(lib.translate[name+'_ab']) return lib.translate[name+'_ab'];
return get.translation(name);
}(target);
2020-03-05 13:10:37 +00:00
dialog.buttons.remove(button);
break;
}
}
var capt=get.translation(target)+'选择了'+get.translation(button.link);
if(card){
target.equip(card);
target.$gain2(card);
game.broadcast(function(card,id,name,capt){
var dialog=get.idDialog(id);
if(dialog){
dialog.content.firstChild.innerHTML=capt;
for(var i=0;i<dialog.buttons.length;i++){
if(dialog.buttons[i].link==card){
dialog.buttons[i].querySelector('.info').innerHTML=name;
dialog.buttons.splice(i--,1);
break;
}
}
}
2020-06-13 04:51:36 +00:00
},card,dialog.videoId,function(target){
if(target._tempTranslate) return target._tempTranslate;
var name=target.name;
if(lib.translate[name+'_ab']) return lib.translate[name+'_ab'];
return get.translation(name);
}(target),capt);
2020-03-05 13:10:37 +00:00
}
dialog.content.firstChild.innerHTML=capt;
game.addVideo('dialogCapt',null,[dialog.videoId,dialog.content.firstChild.innerHTML]);
game.log(target,'选择了',button.link);
game.delay();
},
contentAfter:function(){
for(var i=0;i<ui.dialogs.length;i++){
if(ui.dialogs[i].videoId==event.preResult){
var dialog=ui.dialogs[i];
dialog.close();
_status.dieClose.remove(dialog);
break;
}
}
game.broadcast(function(id){
var dialog=get.idDialog(id);
if(dialog){
dialog.close();
_status.dieClose.remove(dialog);
}
},event.preResult);
game.addVideo('cardDialog',null,event.preResult);
},
ai:{
wuxie:function(){
if(Math.random()<0.5) return 0;
},
basic:{
order:3,
useful:1,
},
result:{
target:function(player,target){
if(get.is.versus()){
if(target==player) return 1.5;
return 1;
}
if(player.hasUnknown(2)){
return 0;
}
return 2-2*get.distance(player,target,'absolute')/game.countPlayer();
}
},
tag:{
draw:1,
multitarget:1
}
}
},
kaihua:{
enable:true,
fullskin:true,
type:'trick',
selectTarget:-1,
toself:true,
filterTarget:function(card,player,target){
return target==player;
},
modTarget:true,
content:function(){
'step 0'
if(!target.countCards('he')){
event.finish();return;
}
target.chooseToDiscard(true,'he',[1,2]).set('ai',function(card){
if(!ui.selected.cards.length&&get.type(card)=='equip') return 8-get.value(card);
return 6-get.value(card);
});
'step 1'
if(result.bool&&result.cards){
var bool=0;
for(var i=0;i<result.cards.length;i++){
if(get.type(result.cards[i])=='equip'){bool=1;break}
}
target.draw(result.cards.length+bool);
}
},
ai:{
wuxie:function(){
return 0;
},
basic:{
useful:3,
value:3,
order:5
},
result:{
target:function(player,target){
var hs=target.getCards('h');
if(hs.length<=1){
if(target==player&&(hs.length==0||hs[0].name=='kaihua')){
return 0;
}
return 0.3;
}
return Math.sqrt(target.countCards('he'));
},
},
tag:{
loseCard:1,
discard:1,
norepeat:1
}
},
},
jiejia:{
fullskin:true,
type:'trick',
enable:true,
filterTarget:function(card,player,target){
return target.countCards('e')>0;
},
content:function(){
var es=target.getCards('e');
if(es.length) target.gain(es,'gain2','log');
},
ai:{
order:10,
tag:{
gain:1,
loseCard:1,
},
basic:{
useful:0.5,
value:0.5,
},
result:{
target:function(player,target){
2020-03-25 12:27:23 +00:00
var e5=target.getEquip(5);
if(e5&&e5.name=='muniu'&&e5.cards&&e5.cards.length>1) return -1;
if(target.countCards('e',function(card){
2020-03-30 11:56:37 +00:00
return get.value(card,target)<=0;
2020-03-25 12:27:23 +00:00
})||target.hasSkillTag('noe')) return 1;
2020-03-05 13:10:37 +00:00
return 0;
},
},
},
},
caochuan:{
fullskin:true,
type:'trick',
wuxieable:true,
global:['caochuan_skill'],
notarget:true,
content:function(){
var evt2=event.getParent(3)._trigger;
evt2.cancel();
var evt=evt2.getParent();
var next=game.createEvent('caochuan_gain');
_status.event.next.remove(next);
evt.after.push(next);
next.player=player;
next.setContent(function(){
var cards=event.getParent().cards.filterInD();
if(cards.length) player.gain(cards,'gain2','log');
});
},
ai:{
basic:{
useful:[6,4],
value:[6,4],
},
result:{player:1},
},
},
numa:{
fullskin:true,
type:'equip',
subtype:'equip4',
filterTarget:lib.filter.notMe,
selectTarget:1,
toself:false,
onEquip:function(){
var cards=player.getCards('e',function(cardz){
return cardz!=card;
});
if(cards.length) player.discard(cards);
},
ai:{
order:9,
equipValue:function(card,player){
if(get.position(card)=='e') return 0;
return 1;
},
basic:{
equipValue:5,
},
result:{
2020-03-10 03:43:11 +00:00
keepAI:true,
2020-03-05 13:10:37 +00:00
target:function(player,target){
var card=target.getCards('e');
var val=get.value(card);
if(val>0) return -val;
return 0;
},
},
},
},
yajiaoqiang:{
fullskin:true,
type:'equip',
subtype:'equip1',
distance:{attackFrom:-2},
skills:['yajiaoqiang_skill'],
ai:{
equipValue:function(card,player){
var skills=['longdan','kanpo','rekanpo','qingguo','reqingguo'];
for(var i=0;i<skills.length;i++){
if(player.hasSkill(skills[i])) return 5;
}
return 2;
},
basic:{
equipValue:5,
},
},
},
wufengjian:{
fullskin:true,
type:'equip',
subtype:'equip1',
filterTarget:lib.filter.notMe,
selectTarget:1,
toself:false,
skills:['wufengjian_skill'],
ai:{
order:9,
equipValue:function(card,player){
if(get.position(card)=='e') return -2;
return 1;
},
basic:{
equipValue:5,
},
result:{
2020-03-10 03:43:11 +00:00
keepAI:true,
2020-03-05 13:10:37 +00:00
target:function(player,target){
var val=2.5;
var card=target.getEquip(2);
if(card) val+=get.value(card);
return -val;
},
},
},
},
zheji:{
fullskin:true,
type:'equip',
subtype:'equip1',
filterTarget:lib.filter.notMe,
selectTarget:1,
toself:false,
distance:{attackFrom:1},
ai:{
order:9,
equipValue:function(card,player){
if(get.position(card)=='e') return -2;
return 1;
},
basic:{
equipValue:5,
},
result:{
2020-03-10 03:43:11 +00:00
keepAI:true,
2020-03-05 13:10:37 +00:00
target:function(player,target){
var val=2.5;
var card=target.getEquip(2);
if(card) val+=get.value(card);
return -val;
},
},
},
},
yinfengjia:{
fullskin:true,
type:'equip',
subtype:'equip2',
filterTarget:lib.filter.notMe,
selectTarget:1,
toself:false,
skills:['yinfengjia_skill'],
ai:{
order:9,
equipValue:function(card,player){
if(get.position(card)=='e') return -1;
return 1;
},
basic:{
equipValue:5,
},
result:{
2020-03-10 03:43:11 +00:00
keepAI:true,
2020-03-05 13:10:37 +00:00
target:function(player,target){
var val=2;
var card=target.getEquip(2);
if(card) val+=get.value(card);
return -val;
},
},
},
},
nvzhuang:{
fullskin:true,
type:'equip',
subtype:'equip2',
filterTarget:lib.filter.notMe,
selectTarget:1,
toself:false,
loseDelay:false,
onEquip:function(){
if(player.sex=='male'&&player.countCards('he',function(cardx){
return cardx!=card;
})) player.chooseToDiscard(true,function(card){
return card!=_status.event.card;
},'he').set('card',card);
},
onLose:function(){
if(player.sex!='male') return;
var next=game.createEvent('nvzhuang_lose');
event.next.remove(next);
event.getParent().after.push(next);
next.player=player;
next.card=card;
next.setContent(function(){
if(player.countCards('he')){
player.popup('nvzhuang');
player.chooseToDiscard(true,'he');
}
});
},
ai:{
order:9.5,
equipValue:function(card,player){
2020-03-25 12:27:23 +00:00
if(get.position(card)=='e'){
if(player.sex!='male') return 0;
var num=player.countCards('he',function(cardx){
return cardx!=card;
});
if(num==0) return 0;
return 4/num;
}
2020-03-05 13:10:37 +00:00
return 1;
},
basic:{
equipValue:5,
},
result:{
2020-03-10 03:43:11 +00:00
keepAI:true,
2020-03-05 13:10:37 +00:00
target:function(player,target){
if(target.sex=='male'){
var val=0;
var card=target.getEquip(2);
if(card) val=get.value(card);
2020-03-25 12:27:23 +00:00
var num=target.countCards('he',function(cardx){
return cardx!=card
});
if(num>0) val+=4/num;
return -val;
2020-03-05 13:10:37 +00:00
}
return 0;
},
},
}
},
yexingyi:{
fullskin:true,
type:'equip',
subtype:'equip2',
skills:['yexingyi_skill'],
ai:{
equipValue:4,
basic:{
equipValue:4,
},
}
},
jinhe:{
fullskin:true,
type:'equip',
subtype:'equip5',
filterTarget:lib.filter.notMe,
selectTarget:1,
toself:false,
skills:['jinhe_skill'],
global:['jinhe_lose'],
loseDelay:false,
onEquip:function(){
"step 0"
player.markSkill('jinhe_skill');
if(event.getParent(2).name!='jinhe') event.finish();
else{
event.target=player;
event.player=event.getParent(2).player;
}
"step 1"
var id=card.cardid;
event.cardid=id;
if(!_status.jinhe) _status.jinhe={};
if(_status.jinhe[id]){
game.cardsDiscard(_status.jinhe[id].card);
delete _status.jinhe[id];
}
var cards2=get.cards(2);
event.cards2=cards2;
player.chooseButton(['选择一张牌作为「礼」',cards2],true);
"step 2"
var id=event.cardid;
_status.jinhe[id]={
player:player,
card:result.links[0],
};
game.broadcast(function(jinhe){
_status.jinhe=jinhe;
},_status.jinhe);
game.cardsGotoSpecial(result.links[0]);
event.cards2.remove(result.links[0]);
event.cards2[0].fix();
ui.cardPile.insertBefore(event.cards2[0],ui.cardPile.firstChild);
game.updateRoundNumber();
target.markSkill('jinhe_skill');
},
onLose:function(){
player.unmarkSkill('jinhe_skill');
var id=card.cardid;
if((event.getParent(2)&&event.getParent(2).name!='swapEquip')&&get.position(card)!='d'&&event.parent.type!='equip'&&_status.jinhe&&_status.jinhe[id]){
var card2=_status.jinhe[id].card;
player.$throw(card2,1000);
game.log(card,'掉落了',card2);
game.cardsDiscard(card2);
delete _status.jinhe[id];
}
},
ai:{
order:9.5,
equipValue:function(card,player){
if(get.position(card)!='e') return 5;
if(_status.jinhe&&_status.jinhe[card.cardid]&&(_status.event.name=='discardPlayerCard'||_status.event.name=='chooseToDiscard')) return 2*player.countCards('h');
return 0;
},
basic:{
equipValue:5,
},
result:{
2020-03-10 03:43:11 +00:00
keepAI:true,
2020-09-30 07:46:55 +00:00
target:function(player,target,cardx){
if(_status.jinhe&&_status.jinhe[cardx.cardid]) return -0.5-2*target.countCards('h');
var card=target.getEquip(5);
if(!card) return 0;
return -get.value(card,target);
},
target_use:function(player,target){
2020-03-25 12:27:23 +00:00
return -0.5-2*target.countCards('h');
2020-03-05 13:10:37 +00:00
},
},
}
},
},
skill:{
jinhe_lose:{
trigger:{player:'loseEnd'},
equipSkill:true,
forced:true,
filter:function(event,player){
if(event.type!='discard'||!_status.jinhe||event.getParent(2).name=='jinhe_skill'&&event.getParent(2).player==player) return false;
for(var i=0;i<event.es.length;i++){
if(event.es[i].name=='jinhe'&&_status.jinhe[event.es[i].cardid]) return true;
}
return false;
},
content:function(){
"step 0"
for(var i=0;i<trigger.es.length;i++){
if(trigger.es[i].name=='jinhe'&&_status.jinhe[trigger.es[i].cardid]){
var card=_status.jinhe[trigger.es[i].cardid].card;
game.cardsDiscard(card);
player.$throw(card);
game.log(card,'进入了弃牌堆');
delete _status.jinhe[trigger.es[i].cardid];
};
}
game.broadcastAll(function(jinhe){
_status.jinhe=jinhe;
},_status.jinhe);
"step 1"
var hs=player.getCards('h');
if(hs.length) player.discard(hs);
"step 2"
game.broadcastAll(ui.clear);
},
},
jinhe_skill:{
equipSkill:true,
intro:{
mark:function(dialog,storage,player){
var card=player.getEquip('jinhe');
if(card&&_status.jinhe&&_status.jinhe[card.cardid]){
if(_status.jinhe[card.cardid].player==game.me||_status.jinhe[card.cardid].player.isUnderControl()) dialog.addAuto([_status.jinhe[card.cardid].card]);
else return '共有一张「礼」';
}
else return '没有牌';
},
},
mark:true,
marktext:'礼',
enable:'phaseUse',
filter:function(event,player){
if(!_status.jinhe) return false;
var card=player.getEquip(5);
return card&&card.name=='jinhe'&&_status.jinhe[card.cardid]!=undefined;
},
prepare:function(cards,player){
var card=player.getEquip(5);
if(card&&card.name=='jinhe'&&_status.jinhe[card.cardid]){
var tothrow=_status.jinhe[card.cardid].card;
player.$throw(tothrow);
game.log(player,'将',tothrow,'置入了弃牌堆');
}
},
content:function(){
"step 0"
var card=player.getEquip(5);
if(card&&card.name=='jinhe'&&_status.jinhe[card.cardid]){
game.cardsDiscard(_status.jinhe[card.cardid].card);
event.suit=get.suit(_status.jinhe[card.cardid].card);
delete _status.jinhe[card.cardid];
game.broadcastAll(function(jinhe){
_status.jinhe=jinhe;
},_status.jinhe);
}
else event.finish();
"step 1"
var cards=player.getCards('he',function(card){
if(get.position(card)=='h') return get.suit(card)==event.suit;
return get.position(card)=='e'&&card.name=='jinhe';
});
if(cards.length) player.discard(cards);
"step 2"
game.broadcastAll(ui.clear);
},
},
yexingyi_skill:{
equipSkill:true,
mod:{
targetEnabled:function(card,player,target){
if(get.color(card)=='black'&&get.type(card,'trick')=='trick'&&!target.hasSkillTag('unequip2')&&!player.hasSkillTag('unequip',false,{
name:card?card.name:null,
target:target,
card:card
})) return false;
},
},
},
yinfengjia_skill:{
trigger:{player:'damageBegin3'},
forced:true,
equipSkill:true,
filter:function(event,player){
if(get.type(event.card,'trick')!='trick') return false;
if(player.hasSkillTag('unequip2')) return false;
if(event.source&&event.source.hasSkillTag('unequip',false,{
name:event.card?event.card.name:null,
target:player,
card:event.card
})) return false;
return true;
},
content:function(){trigger.num++},
},
wufengjian_skill:{
trigger:{player:'useCard'},
forced:true,
filter:function(event,player){
if(event.card.name!='sha') return false;
var card=player.getEquip('wufengjian');
return player.countCards('he',function(cardx){
return cardx!=card;
})>0;
},
content:function(){
2020-05-09 05:30:03 +00:00
if(player!=game.me&&!player.isUnderControl()&&!player.isOnline()) game.delayx();
2020-03-05 13:10:37 +00:00
player.chooseToDiscard(true,'he',function(card){
return card!=_status.event.card;
}).set('card',player.getEquip('wufengjian'));
},
},
yajiaoqiang_skill:{
trigger:{player:'useCardAfter'},
filter:function(event,player){
if(_status.currentPhase==player||get.color(event.card)!='black'||event.cards.filterInD().length==0) return false;
return player.getHistory('useCard',function(evt){
return get.color(evt.card)=='black';
}).indexOf(event)==0;
},
prompt2:function(event,player){
return '获得'+get.translation(event.cards.filterInD());
},
content:function(){
player.gain(trigger.cards.filterInD(),'gain2','log');
},
},
caochuan_skill:{
trigger:{target:'useCardToBegin'},
forced:true,
priority:6,
filter:function(event,player){
if(event.directHit||!get.tag(event.card,'damage')||!['basic','trick'].contains(get.type(event.card))) return false;
return player.hasUsableCard('caochuan');
},
content:function(){
var next=player.chooseToUse();
next.set('prompt','是否使用【草船借箭】响应'+get.translation(trigger.player)+'使用的'+get.translation(trigger.card)+'');
next.set('filterCard',function(card){
if(get.name(card)!='caochuan') return false;
return lib.filter.cardEnabled(card,player,'forceEnable');
});
next.set('respondTo',[trigger.player,trigger.card]);
next.set('goon',-get.effect(player,trigger.card,trigger.player,player));
next.set('ai1',function(card){
return _status.event.goon;
})
},
},
},
translate:{
jinhe:'锦盒',
jinhe_info:'当你使用【锦盒】时,你将原有的与此牌对应的「礼」置入弃牌堆(若有),然后观看牌堆顶的两张牌并将其中一张置于游戏外与此牌对应,称之为「礼」。<br>出牌阶段,你可以将与此牌对应的「礼」置入弃牌堆,然后弃置【锦盒】以及所有与「礼」花色相同的手牌。当此牌因其他原因进入弃牌堆后,你将与此牌对应的「礼」置入弃牌堆并弃置所有手牌。',
jinhe_skill:'锦盒',
jinhe_lose:'锦盒',
yexingyi:'夜行衣',
yexingyi_info:'锁定技,你不是黑色锦囊牌的合法目标。',
nvzhuang:'女装',
nvzhuang_info:'锁定技,当此牌进入或离开你的装备区时,若你的性别为男性,你弃置一张不为此牌的牌。',
yinfengjia:'引蜂甲',
yinfengjia_info:'锁定技,当你受到锦囊牌造成的伤害时,此伤害+1。',
yinfengjia_skill:'引蜂甲',
zheji:'折戟',
zheji_info:'这是一把坏掉的武器...',
wufengjian:'无锋剑',
wufengjian_info:'锁定技,当你使用【杀】时,你弃置一张不为装备区内【无锋剑】的牌。',
wufengjian_skill:'无锋剑',
yajiaoqiang_skill:'涯角枪',
yajiaoqiang:'涯角枪',
yajiaoqiang_info:'当你于一名其他角色的回合内第一次使用的黑色牌结算完成后,你可以获得此牌对应的所有实体牌。',
numa:'驽马',
numa_info:'锁定技,当此牌进入你的装备区时,你弃置装备区内的所有其他牌。',
caochuan:'草船借箭',
caochuan_info:'当带有「伤害」标签的基本牌或普通锦囊牌对你生效前,对此牌使用。抵消此牌对你产生的效果。当此牌结算完成后,你获得此牌对应的所有实体牌。',
jiejia:'解甲归田',
jiejia_info:'出牌阶段,对一名装备区内有牌的角色使用。该角色获得其装备区内的所有牌。',
kaihua:'树上开花',
kaihua_info:'出牌阶段,对包含你自己在内的一名角色使用。目标角色弃置一至两张牌,然后摸等量的牌。若其以此法弃置了装备牌,则多摸一张牌。',
zhulu_card:'逐鹿天下',
zhulu_card_info:'出牌阶段,对所有角色使用。你从牌堆和弃牌堆亮出等同于目标角色数的装备牌,每名目标角色将其中一张牌置于自己的装备区。',
gifts_tag:'赠',
},
list:[
['diamond',3,'jiejia'],
['diamond',4,'shan'],
['diamond',5,'yajiaoqiang'],
['diamond',6,'sha'],
['diamond',8,'shan'],
['diamond',9,'kaihua'],
['diamond',10,'yinfengjia',null,['gifts']],
['diamond',11,'sha'],
['club',3,'jiejia'],
['club',4,'sha','thunder'],
['club',5,'zheji',null,['gifts']],
['club',6,'jiu'],
['club',8,'jiu'],
['club',9,'zhulu_card'],
['club',10,'jinhe',null,['gifts']],
['club',11,'sha'],
['heart',3,'sha','fire'],
['heart',4,'shan'],
['heart',5,'numa',null,['gifts']],
['heart',6,'tao'],
['heart',8,'shan'],
['heart',9,'kaihua'],
['heart',10,'nvzhuang',null,['gifts']],
['heart',11,'kaihua'],
['spade',3,'caochuan'],
['spade',4,'sha','thunder'],
['spade',5,'wufengjian',null,['gifts']],
['spade',6,'caochuan'],
['spade',8,'sha'],
['spade',9,'sha'],
['spade',10,'yexingyi'],
['spade',11,'sha'],
],
}
});