517 lines
16 KiB
JavaScript
517 lines
16 KiB
JavaScript
import { lib, game, ui, get, ai, _status } from "../noname.js";
|
||
game.import("character", function () {
|
||
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 (
|
||
!event.player.isMin() &&
|
||
![player.name, player.name1, player.name2].includes(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];
|
||
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.card.isCard) {
|
||
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(true, 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);
|
||
},
|
||
ai: {
|
||
damageBonus: true,
|
||
},
|
||
},
|
||
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: "锁定技,当你解除濒死状态后,令你进入濒死状态的角色失去1点体力。",
|
||
lingyong: "灵俑",
|
||
lingyong2: "灵俑",
|
||
lingyong3: "灵俑",
|
||
lingyong3_bg: "俑",
|
||
lingyong_info:
|
||
"锁定技,每当一名其他角色死亡,你获得一个与该角色同名且体力上限为1、初始手牌为2的随从;出牌阶段,你可以调遣以此法获得的随从(直到随从死亡不可再次切换)。",
|
||
mbaizhan: "百战",
|
||
mbaizhan_info: "锁定技,每当你造成1点伤害,你获得1点护甲。",
|
||
msilian: "祀炼",
|
||
msilian_info:
|
||
"结束阶段,若你有护甲,你可以移去全部护甲,然后进行一个额外回合;在额外回合中,你的摸牌阶段摸牌基数为你移去的护甲数;额外回合结束后,若你未造成伤害,你失去1点体力。",
|
||
mtongnian: "通念",
|
||
mtongnian_info:
|
||
"锁定技,出牌阶段开始时,你获得一张替身牌,此牌对应一名随机敌人的一张随机手牌;每当你使用一张非替身牌,随机更换替身牌对应的牌;当你使用替身牌时,改为使用替身牌对应的牌;当出牌阶段结束,或替身牌离开手牌区,或敌方角色没有手牌时,销毁替身牌。",
|
||
msuoling: "塑灵",
|
||
msuoling_info:
|
||
"每轮限一次,当一名其他角色使用一张非转化的普通锦囊牌时,你可以弃置一张与之花色相同的牌取消之,然后你视为使用该锦囊牌。",
|
||
msuoling_old_info:
|
||
"出牌阶段限一次,若你手牌中有替身牌且手牌数不超过5,你可以展示手牌,若其中的非替身手牌能通过四则运算得到你的替身牌的点数,你将替身牌转化为非替身牌,然后获得一张新的替身牌(此技能托管无效)。",
|
||
mhuanyi: "幻逸",
|
||
mhuanyi_info:
|
||
"每两轮限一次,结束阶段,你可以选择一名其他角色和一种卡牌类型(选择结果对其他角色不可见),直到下一回合开始,当你首次成为该类型卡牌的惟一目标时,你将目标转移给你指定的角色(目标须合法)。",
|
||
},
|
||
};
|
||
});
|