493 lines
16 KiB
JavaScript
493 lines
16 KiB
JavaScript
'use strict';
|
||
game.import('character',function(lib,game,ui,get,ai,_status){
|
||
return {
|
||
name:'mtg',
|
||
character:{
|
||
mtg_jiding:['male','qun',4,['mbaizhan','msilian']],
|
||
// mtg_qianzhuo:['female','shu',3,[]],
|
||
mtg_jiesi:['male','wei',3,['mtongnian','msuoling','mhuanyi']],
|
||
mtg_lilianna:['female','qun',3,['lingyong','mduohun']],
|
||
// mtg_nisha:['female','wu',3,[]],
|
||
// mtg_ayeni:['male','qun',4,[]],
|
||
},
|
||
characterIntro:{
|
||
mtg_jiding:'这名白色魔法的使用者极其注重忠诚,正义和荣誉。他曾全力追捕茜卓纳拉,如今已不可思议地与这位火焰法师成为伙伴。',
|
||
mtg_qianzhuo:'茜卓纳拉是使用红色法术力的旅法师。她擅长使用火焰:除了火焰,还是火焰。茜卓性格冲动、易怒、富有激情,不断增长的火焰法术能力随时都准备爆发。她的火花在还很年轻时便已点燃,如今已是相当有经验的烈焰术士和旅法师。',
|
||
mtg_jiesi:'杰斯贝连是使用蓝色法术的鹏洛客。他擅长心灵法术:读取心灵,幻影,知识,以及欺瞒的咒语。',
|
||
mtg_lilianna:'莉莲娜维斯是一位精通死灵术的旅法师,她擅长用黑色法术力来复活死者,腐化生者,并从死亡中召唤力量。',
|
||
mtg_nisha:'赞迪卡妖精部落玖瑞加的一名战士,做事倾尽全力,与大地有密切的联系,还擅使元素魔法。她能够引导时空的魔法生机地脉,为土地赋予生命。',
|
||
mtg_ayeni:'金鬃阿耶尼是使用白色法术的鹏洛客。他长于净化身体与心灵的法术:用咒语来治疗、强化盟友,以及唤醒他人内在的心灵精华。',
|
||
},
|
||
skill:{
|
||
mduohun:{
|
||
trigger:{player:'dyingAfter'},
|
||
forced:true,
|
||
filter:function(event,player){
|
||
return event.source&&event.source.isIn()&&event.source.hp>0;
|
||
},
|
||
logTarget:'source',
|
||
content:function(){
|
||
trigger.source.loseHp();
|
||
},
|
||
ai:{
|
||
threaten:function(player,target){
|
||
if(target.hp==1) return 0.6;
|
||
return 1;
|
||
},
|
||
effect:{
|
||
target:function(card,player,target,current){
|
||
if(!target.hasFriend()) return;
|
||
if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-1];
|
||
}
|
||
}
|
||
}
|
||
},
|
||
lingyong:{
|
||
enable:'phaseUse',
|
||
filter:function(event,player){
|
||
return !player.hasSkill('subplayer')&&player.getSubPlayers('lingyong_get').length>0;
|
||
},
|
||
nosub:true,
|
||
group:'lingyong_get',
|
||
direct:true,
|
||
delay:0,
|
||
skillAnimation:true,
|
||
animationColor:'thunder',
|
||
content:function(){
|
||
player.callSubPlayer().set('tag','lingyong_get');
|
||
},
|
||
ai:{
|
||
order:1,
|
||
result:{
|
||
player:function(player,target){
|
||
return 1;
|
||
// if(player.hp<=1) return 1;
|
||
// if(!player.needsToDiscard(player.hp-1)) return 1;
|
||
// return 0;
|
||
}
|
||
}
|
||
},
|
||
subSkill:{
|
||
get:{
|
||
trigger:{global:'dieAfter'},
|
||
forced:true,
|
||
filter:function(event,player){
|
||
return ![player.name,player.name1,player.name2].contains(event.player.name);
|
||
},
|
||
content:function(){
|
||
var skills=lib.character[trigger.player.name][3].slice(0);
|
||
for(var i=0;i<skills.length;i++){
|
||
if(lib.skill[skills[i]].nosub){
|
||
skills.splice(i--,1);
|
||
}
|
||
}
|
||
player.addSubPlayer({
|
||
name:trigger.player.name,
|
||
skills:skills,
|
||
hs:get.cards(2),
|
||
intro:'出牌阶段,你可以调遣此随从(直到随从死亡不可再次切换)'
|
||
});
|
||
}
|
||
}
|
||
}
|
||
},
|
||
mhuanyi:{
|
||
round:2,
|
||
trigger:{player:'phaseEnd'},
|
||
direct:true,
|
||
addintro:function(storage,player){
|
||
if(player.hasSkill('mhuanyi_target')){
|
||
return '直到下一回合开始,当成为某类型的卡牌的惟一目标时,将目标转移给某名其他角色;'
|
||
}
|
||
return '';
|
||
},
|
||
content:function(){
|
||
'step 0'
|
||
var rand=Math.random();
|
||
player.chooseTarget(get.prompt2('mhuanyi'),function(card,player,target){
|
||
return target!=player;
|
||
}).set('ai',function(target){
|
||
if(get.attitude(player,target)<0){
|
||
return rand;
|
||
}
|
||
return 0;
|
||
});
|
||
'step 1'
|
||
if(result.bool){
|
||
event.target=result.targets[0];
|
||
if(player.isUnderControl(true)){
|
||
player.line(event.target,'green');
|
||
}
|
||
player.chooseControl('基本牌','非基本牌','cancel2',function(){
|
||
return Math.floor(Math.random()*2);
|
||
}).set('prompt','选择一种卡牌类型');
|
||
}
|
||
else{
|
||
event.finish();
|
||
}
|
||
'step 2'
|
||
if(result.control&&result.control!='cancel2'){
|
||
player.logSkill('mhuanyi');
|
||
player.storage.mhuanyi_target=[event.target,result.index];
|
||
player.addTempSkill('mhuanyi_target',{player:'phaseBegin'});
|
||
}
|
||
},
|
||
subSkill:{
|
||
target:{
|
||
trigger:{target:'useCardToBefore'},
|
||
priority:6,
|
||
forced:true,
|
||
onremove:true,
|
||
group:'mhuanyi_die',
|
||
filter:function(event,player){
|
||
if(!player.storage.mhuanyi_target) return false;
|
||
if(event.player==player.storage.mhuanyi_target[0]) return false;
|
||
if(get.type(event.card)=='basic'){
|
||
if(player.storage.mhuanyi_target[1]!=0) return false;
|
||
}
|
||
else{
|
||
if(player.storage.mhuanyi_target[1]!=1) return false;
|
||
}
|
||
if(!lib.filter.targetEnabled2(event.card,event.player,player.storage.mhuanyi_target[0])){
|
||
return false;
|
||
}
|
||
return true;
|
||
},
|
||
logTarget:function(event,player){
|
||
return player.storage.mhuanyi_target[0];
|
||
},
|
||
content:function(){
|
||
trigger.target=player.storage.mhuanyi_target[0];
|
||
trigger.untrigger();
|
||
trigger.trigger('useCardToBefore');
|
||
trigger.trigger(trigger.card.name+'Before');
|
||
player.removeSkill('mhuanyi_target');
|
||
}
|
||
},
|
||
die:{
|
||
trigger:{global:'dieAfter'},
|
||
silent:true,
|
||
filter:function(event,player){
|
||
if(!player.storage.mhuanyi_target) return false;
|
||
return event.player==player.storage.mhuanyi_target[0];
|
||
},
|
||
content:function(){
|
||
player.removeSkill('mhuanyi_target');
|
||
}
|
||
}
|
||
}
|
||
},
|
||
msuoling:{
|
||
trigger:{global:'useCard'},
|
||
direct:true,
|
||
priority:5.5,
|
||
round:1,
|
||
filter:function(event,player){
|
||
if(get.type(event.card)=='trick'&&event.cards.length==1&&event.cards[0]==event.card){
|
||
if(event.player==player) return false;
|
||
if(!player.countCards('he',{suit:get.suit(event.card)})) return false;
|
||
return true;
|
||
}
|
||
return false;
|
||
},
|
||
content:function(){
|
||
'step 0'
|
||
var att=get.attitude(player,trigger.player);
|
||
var suit=get.suit(trigger.card);
|
||
player.chooseToDiscard('he',get.prompt2('msuoling',trigger.player),function(card){
|
||
return get.suit(card)==suit;
|
||
}).set('autodelay',true).set('logSkill',['msuoling',trigger.player]).ai=function(card){
|
||
if(att<0){
|
||
return 8-get.value(card);
|
||
}
|
||
return 0;
|
||
};
|
||
'step 1'
|
||
if(result.bool){
|
||
trigger.cancel();
|
||
player.chooseUseTarget(trigger.card);
|
||
}
|
||
}
|
||
},
|
||
msuoling_old:{
|
||
enable:'phaseUse',
|
||
usable:1,
|
||
subSkill:{
|
||
ai:{
|
||
onremove:true
|
||
}
|
||
},
|
||
filter:function(event,player){
|
||
var nh=player.countCards('h');
|
||
if(nh<=1||nh>=5) return false;
|
||
return lib.skill.msuoling.getc(player).number>0;
|
||
},
|
||
getc:function(player){
|
||
var hs=player.getCards('h');
|
||
for(var i=0;i<hs.length;i++){
|
||
if(hs[i].mtongnian_link){
|
||
return hs[i];
|
||
}
|
||
}
|
||
return -1;
|
||
},
|
||
getn:function(player){
|
||
var hs=player.getCards('h');
|
||
var ns=[];
|
||
for(var i=0;i<hs.length;i++){
|
||
if(!hs[i].mtongnian_link){
|
||
ns.push(hs[i].number);
|
||
}
|
||
}
|
||
return ns;
|
||
},
|
||
test:function(player){
|
||
var cs=lib.skill.msuoling.getc(player).number;
|
||
var ns=lib.skill.msuoling.getn(player);
|
||
return lib.skill.msuoling.calc(ns,cs);
|
||
},
|
||
calc:function(arr, num){
|
||
for(var i=0;i<arr.length;i++){
|
||
if(arr[i]==num){
|
||
return true;
|
||
}
|
||
}
|
||
if(arr.length>1){
|
||
for(var i=0;i<arr.length-1;i++){
|
||
for(var j=i+1;j<arr.length;j++){
|
||
var brr=[];
|
||
for(var k=0;k<arr.length;k++){
|
||
if(k!=i&&k!=j){
|
||
brr.push(arr[k]);
|
||
}
|
||
}
|
||
if(lib.skill.msuoling.calc(brr.concat([arr[i]+arr[j]]),num)) return true;
|
||
if(lib.skill.msuoling.calc(brr.concat([arr[i]-arr[j]]),num)) return true;
|
||
if(lib.skill.msuoling.calc(brr.concat([arr[i]*arr[j]]),num)) return true;
|
||
if(lib.skill.msuoling.calc(brr.concat([arr[i]/arr[j]]),num)) return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
},
|
||
check:function(card){
|
||
// if(player.isUnderControl(true)) return 0;
|
||
var player=_status.event.player;
|
||
if(player.hasSkill('msuoling_ai')){
|
||
return false;
|
||
}
|
||
if(lib.skill.msuoling.test(player)){
|
||
return true;
|
||
}
|
||
else{
|
||
player.addTempSkill('msuoling_ai',{player:['gainAfter','phaseAfter']});
|
||
return false;
|
||
}
|
||
},
|
||
content:function(){
|
||
'step 0'
|
||
player.showHandcards();
|
||
'step 1'
|
||
if(lib.skill.msuoling.test(player)){
|
||
var card=lib.skill.msuoling.getc(player);
|
||
card.classList.remove('glow');
|
||
delete card.mtongnian_link;
|
||
delete card._destroy;
|
||
|
||
var list=lib.skill.mtongnian.getList(player);
|
||
if(list.length){
|
||
var card=list.randomGet();
|
||
var fake=game.createCard(card);
|
||
fake.mtongnian_link=card;
|
||
player.gain(fake,'draw')._triggered=null;
|
||
fake.classList.add('glow');
|
||
fake._destroy='mtongnian';
|
||
}
|
||
}
|
||
},
|
||
selectCard:[1,Infinity],
|
||
ai:{
|
||
order:11
|
||
}
|
||
},
|
||
mtongnian:{
|
||
trigger:{player:'phaseUseBegin'},
|
||
forced:true,
|
||
filter:function(event,player){
|
||
var enemies=player.getEnemies();
|
||
for(var i=0;i<enemies.length;i++){
|
||
if(enemies[i].countCards('h')) return true;
|
||
}
|
||
return false;
|
||
},
|
||
getList:function(player){
|
||
var list=[];
|
||
var enemies=player.getEnemies();
|
||
for(var i=0;i<enemies.length;i++){
|
||
list.addArray(enemies[i].getCards('h'));
|
||
}
|
||
return list;
|
||
},
|
||
content:function(){
|
||
var list=lib.skill.mtongnian.getList(player);
|
||
if(list.length){
|
||
var card=list.randomGet();
|
||
var fake=game.createCard(card);
|
||
fake.mtongnian_link=card;
|
||
player.gain(fake,'draw')._triggered=null;
|
||
fake.classList.add('glow');
|
||
fake._destroy='mtongnian';
|
||
}
|
||
},
|
||
group:['mtongnian_change','mtongnian_use','mtongnian_lose'],
|
||
subSkill:{
|
||
change:{
|
||
trigger:{player:'useCard'},
|
||
silent:true,
|
||
filter:function(event,player){
|
||
return player.hasCard(function(card){
|
||
return card.mtongnian_link?true:false;
|
||
},'h');
|
||
},
|
||
content:function(){
|
||
var list=lib.skill.mtongnian.getList(player);
|
||
var hs=player.getCards('h',function(card){
|
||
return card.mtongnian_link?true:false;
|
||
});
|
||
for(var i=0;i<hs.length;i++){
|
||
var current=hs[i].mtongnian_link;
|
||
hs[i].mtongnian_link=list.randomGet(current);
|
||
if(!hs[i].mtongnian_link){
|
||
hs[i].mtongnian_link=current;
|
||
}
|
||
hs[i].init(hs[i].mtongnian_link);
|
||
}
|
||
}
|
||
},
|
||
use:{
|
||
trigger:{player:'useCardBefore'},
|
||
silent:true,
|
||
filter:function(event,player){
|
||
return event.card.mtongnian_link?true:false;
|
||
},
|
||
content:function(){
|
||
var link=trigger.card.mtongnian_link;
|
||
var target=get.owner(link);
|
||
if(target&&target!=player){
|
||
trigger.cards.add(trigger.card);
|
||
player.lose(trigger.cards,ui.discardPile);
|
||
trigger.card=link;
|
||
trigger.cards.length=0;
|
||
trigger.cards.push(link);
|
||
target.lose(link,ui.discardPile);
|
||
player.logSkill('mtongnian',target);
|
||
game.log(target,'失去了',link);
|
||
game.delayx();
|
||
}
|
||
else{
|
||
player.lose(trigger.card);
|
||
trigger.cancel();
|
||
}
|
||
}
|
||
},
|
||
lose:{
|
||
trigger:{player:'phaseUseEnd',global:'loseEnd'},
|
||
silent:true,
|
||
filter:function(event,player){
|
||
if(event.name=='lose'){
|
||
return lib.skill.mtongnian.getList(player).length==0;
|
||
}
|
||
return true;
|
||
},
|
||
content:function(){
|
||
var hs=player.getCards('h',function(card){
|
||
return card.mtongnian_link?true:false;
|
||
});
|
||
if(hs.length){
|
||
player.lose(hs)._triggered=null;
|
||
}
|
||
}
|
||
}
|
||
},
|
||
ai:{
|
||
threaten:1.3
|
||
}
|
||
},
|
||
mbaizhan:{
|
||
trigger:{source:'damageEnd'},
|
||
forced:true,
|
||
filter:function(event){
|
||
return event.num>0;
|
||
},
|
||
content:function(){
|
||
player.changeHujia(trigger.num);
|
||
}
|
||
},
|
||
msilian:{
|
||
trigger:{player:'phaseEnd'},
|
||
filter:function(event,player){
|
||
return player.hujia>0;
|
||
},
|
||
check:function(event,player){
|
||
return player.hujia>1&&player.hp>1;
|
||
},
|
||
content:function(){
|
||
player.storage.msilian=player.hujia;
|
||
player.changeHujia(-player.hujia);
|
||
player.insertPhase();
|
||
},
|
||
group:['msilian_hp','msilian_draw'],
|
||
subSkill:{
|
||
hp:{
|
||
trigger:{player:'phaseAfter'},
|
||
silent:true,
|
||
filter:function(event,player){
|
||
return event.skill=='msilian'&&!player.getStat('damage');
|
||
},
|
||
content:function(){
|
||
player.loseHp();
|
||
}
|
||
},
|
||
draw:{
|
||
trigger:{player:'phaseDrawBegin'},
|
||
filter:function(event){
|
||
return event.getParent('phase').skill=='msilian';
|
||
},
|
||
silent:true,
|
||
content:function(){
|
||
trigger.num+=player.storage.msilian-2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
translate:{
|
||
mtg_jiding:'基定',
|
||
mtg_qianzhuo:'茜卓',
|
||
mtg_jiesi:'杰斯',
|
||
mtg_lilianna:'莉莲娜',
|
||
mtg_nisha:'妮莎',
|
||
mtg_ayeni:'阿耶尼',
|
||
|
||
mduohun:'夺魂',
|
||
mduohun_info:'锁定技,当你解除濒死状态后,令你进入濒死状态的角色失去一点体力',
|
||
lingyong:'灵俑',
|
||
lingyong2:'灵俑',
|
||
lingyong3:'灵俑',
|
||
lingyong3_bg:'俑',
|
||
lingyong_info:'锁定技,每当一名其他角色死亡,你获得一个与该角色同名且体力上限为1、初始手牌为2的随从;出牌阶段,你可以调遣以此法获得的随从(直到随从死亡不可再次切换)',
|
||
mbaizhan:'百战',
|
||
mbaizhan_info:'锁定技,每当你造成一点伤害,你获得一点护甲',
|
||
msilian:'祀炼',
|
||
msilian_info:'结束阶段,若你有护甲,你可以移去全部护甲,然后进行一个额外回合;在额外回合中,你的摸牌阶段摸牌基数为你移去的护甲数;额外回合结束后,若你未造成伤害,你失去一点体力',
|
||
mtongnian:'通念',
|
||
mtongnian_info:'锁定技,出牌阶段开始时,你获得一张替身牌,此牌对应一名随机敌人的一张随机手牌;每当你使用一张非替身牌,随机更换替身牌对应的牌;当你使用替身牌时,改为使用替身牌对应的牌;当出牌阶段结束,或替身牌离开手牌区,或敌方角色没有手牌时,销毁替身牌',
|
||
msuoling:'塑灵',
|
||
msuoling_info:'每轮限一次,当一名其他角色使用一张非转化的普通锦囊牌时,你可以弃置一张与之花色相同的牌取消之,然后你视为使用该锦囊牌',
|
||
msuoling_old_info:'出牌阶段限一次,若你手牌中有替身牌且手牌数不超过5,你可以展示手牌,若其中的非替身手牌能通过四则运算得到你的替身牌的点数,你将替身牌转化为非替身牌,然后获得一张新的替身牌(此技能托管无效)',
|
||
mhuanyi:'幻逸',
|
||
mhuanyi_info:'每两轮限一次,结束阶段,你可以选择一名其他角色和一种卡牌类型(选择结果对其他角色不可见),直到下一回合开始,当你首次成为该类型卡牌的惟一目标时,你将目标转移给你指定的角色(目标须合法)',
|
||
},
|
||
};
|
||
});
|