noname/character/mtg.js

517 lines
16 KiB
JavaScript
Raw Normal View History

2024-04-15 18:10:02 +00:00
import { lib, game, ui, get, ai, _status } from "../noname.js";
game.import("character", function () {
2017-11-08 02:40:40 +00:00
return {
2024-04-15 18:10:02 +00:00
name: "mtg",
character: {
mtg_jiding: ["male", "qun", 4, ["mbaizhan", "msilian"]],
2017-11-08 02:40:40 +00:00
// mtg_qianzhuo:['female','shu',3,[]],
2024-04-15 18:10:02 +00:00
mtg_jiesi: ["male", "wei", 3, ["mtongnian", "msuoling", "mhuanyi"]],
mtg_lilianna: ["female", "qun", 3, ["lingyong", "mduohun"]],
2017-11-08 02:40:40 +00:00
// mtg_nisha:['female','wu',3,[]],
// mtg_ayeni:['male','qun',4,[]],
2018-04-17 07:32:43 +00:00
},
2024-04-15 18:10:02 +00:00
characterIntro: {
mtg_jiding:
"这名白色魔法的使用者极其注重忠诚,正义和荣誉。他曾全力追捕茜卓纳拉,如今已不可思议地与这位火焰法师成为伙伴。",
mtg_qianzhuo:
"茜卓纳拉是使用红色法术力的旅法师。她擅长使用火焰:除了火焰,还是火焰。茜卓性格冲动、易怒、富有激情,不断增长的火焰法术能力随时都准备爆发。她的火花在还很年轻时便已点燃,如今已是相当有经验的烈焰术士和旅法师。",
mtg_jiesi:
"杰斯贝连是使用蓝色法术的鹏洛客。他擅长心灵法术:读取心灵,幻影,知识,以及欺瞒的咒语。",
mtg_lilianna:
"莉莲娜维斯是一位精通死灵术的旅法师,她擅长用黑色法术力来复活死者,腐化生者,并从死亡中召唤力量。",
mtg_nisha:
"赞迪卡妖精部落玖瑞加的一名战士,做事倾尽全力,与大地有密切的联系,还擅使元素魔法。她能够引导时空的魔法生机地脉,为土地赋予生命。",
mtg_ayeni:
"金鬃阿耶尼是使用白色法术的鹏洛客。他长于净化身体与心灵的法术:用咒语来治疗、强化盟友,以及唤醒他人内在的心灵精华。",
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
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 () {
2017-11-09 15:32:54 +00:00
trigger.source.loseHp();
},
2024-04-15 18:10:02 +00:00
ai: {
threaten: function (player, target) {
if (target.hp == 1) return 0.6;
2017-11-09 15:32:54 +00:00
return 1;
2018-04-17 07:32:43 +00:00
},
2024-04-15 18:10:02 +00:00
effect: {
target: function (card, player, target, current) {
if (!target.hasFriend()) return;
if (target.hp <= 1 && get.tag(card, "damage")) return [1, 0, 0, -1];
},
},
},
2017-11-09 15:32:54 +00:00
},
2024-04-15 18:10:02 +00:00
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) {
2017-11-09 15:32:54 +00:00
return 1;
// if(player.hp<=1) return 1;
// if(!player.needsToDiscard(player.hp-1)) return 1;
// return 0;
2024-04-15 18:10:02 +00:00
},
},
2017-11-09 15:32:54 +00:00
},
2024-04-15 18:10:02 +00:00
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)
);
2017-11-09 15:32:54 +00:00
},
2024-04-15 18:10:02 +00:00
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);
2017-11-12 19:52:09 +00:00
}
}
2017-11-12 13:16:14 +00:00
player.addSubPlayer({
2024-04-15 18:10:02 +00:00
name: trigger.player.name,
skills: skills,
hs: get.cards(2),
intro: "出牌阶段,你可以调遣此随从(直到随从死亡不可再次切换)",
2017-11-12 13:16:14 +00:00
});
2024-04-15 18:10:02 +00:00
},
},
},
2017-11-09 15:32:54 +00:00
},
2024-04-15 18:10:02 +00:00
mhuanyi: {
round: 2,
trigger: { player: "phaseEnd" },
direct: true,
addintro: function (storage, player) {
if (player.hasSkill("mhuanyi_target")) {
return "直到下一回合开始,当成为某类型的卡牌的惟一目标时,将目标转移给某名其他角色;";
2017-11-08 07:31:06 +00:00
}
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
event.target = result.targets[0];
if (player.isUnderControl(true)) {
player.line(event.target, "green");
2017-11-08 07:31:06 +00:00
}
2024-04-15 18:10:02 +00:00
player
.chooseControl("基本牌", "非基本牌", "cancel2", function () {
return Math.floor(Math.random() * 2);
})
.set("prompt", "选择一种卡牌类型");
} else {
2017-11-08 07:31:06 +00:00
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.control && result.control != "cancel2") {
player.logSkill("mhuanyi");
player.storage.mhuanyi_target = [event.target, result.index];
player.addTempSkill("mhuanyi_target", { player: "phaseBegin" });
2017-11-08 07:31:06 +00:00
}
},
2024-04-15 18:10:02 +00:00
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;
2017-11-08 07:31:06 +00:00
}
2024-04-15 18:10:02 +00:00
if (
!lib.filter.targetEnabled2(
event.card,
event.player,
player.storage.mhuanyi_target[0]
)
) {
2017-11-08 07:31:06 +00:00
return false;
}
return true;
},
2024-04-15 18:10:02 +00:00
logTarget: function (event, player) {
2017-11-08 07:31:06 +00:00
return player.storage.mhuanyi_target[0];
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.target = player.storage.mhuanyi_target[0];
player.removeSkill("mhuanyi_target");
},
2017-11-08 08:29:11 +00:00
},
2024-04-15 18:10:02 +00:00
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];
2017-11-08 08:29:11 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
player.removeSkill("mhuanyi_target");
},
},
},
2017-11-08 07:31:06 +00:00
},
2024-04-15 18:10:02 +00:00
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;
2017-11-08 07:31:06 +00:00
return true;
}
return false;
},
2024-04-15 18:10:02 +00:00
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);
2017-11-08 07:31:06 +00:00
}
return 0;
};
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
2017-11-08 07:31:06 +00:00
trigger.cancel();
2024-04-15 18:10:02 +00:00
player.chooseUseTarget(true, trigger.card);
2017-11-08 07:31:06 +00:00
}
2024-04-15 18:10:02 +00:00
},
2017-11-08 07:31:06 +00:00
},
2024-04-15 18:10:02 +00:00
msuoling_old: {
enable: "phaseUse",
usable: 1,
subSkill: {
ai: {
onremove: true,
},
2017-11-08 07:31:06 +00:00
},
2024-04-15 18:10:02 +00:00
filter: function (event, player) {
var nh = player.countCards("h");
if (nh <= 1 || nh >= 5) return false;
return lib.skill.msuoling.getc(player).number > 0;
2017-11-08 07:31:06 +00:00
},
2024-04-15 18:10:02 +00:00
getc: function (player) {
var hs = player.getCards("h");
for (var i = 0; i < hs.length; i++) {
if (hs[i].mtongnian_link) {
2017-11-08 07:31:06 +00:00
return hs[i];
}
}
return -1;
},
2024-04-15 18:10:02 +00:00
getn: function (player) {
var hs = player.getCards("h");
var ns = [];
for (var i = 0; i < hs.length; i++) {
if (!hs[i].mtongnian_link) {
2017-11-08 07:31:06 +00:00
ns.push(hs[i].number);
}
}
return ns;
},
2024-04-15 18:10:02 +00:00
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);
2017-11-08 07:31:06 +00:00
},
2024-04-15 18:10:02 +00:00
calc: function (arr, num) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == num) {
2017-11-08 07:31:06 +00:00
return true;
}
}
2024-04-15 18:10:02 +00:00
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) {
2017-11-08 07:31:06 +00:00
brr.push(arr[k]);
}
}
2024-04-15 18:10:02 +00:00
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;
2017-11-08 07:31:06 +00:00
}
}
}
return false;
},
2024-04-15 18:10:02 +00:00
check: function (card) {
2017-11-08 07:31:06 +00:00
// if(player.isUnderControl(true)) return 0;
2024-04-15 18:10:02 +00:00
var player = _status.event.player;
if (player.hasSkill("msuoling_ai")) {
2017-11-08 07:31:06 +00:00
return false;
}
2024-04-15 18:10:02 +00:00
if (lib.skill.msuoling.test(player)) {
2017-11-08 07:31:06 +00:00
return true;
2024-04-15 18:10:02 +00:00
} else {
player.addTempSkill("msuoling_ai", { player: ["gainAfter", "phaseAfter"] });
2017-11-08 07:31:06 +00:00
return false;
}
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
2017-11-08 07:31:06 +00:00
player.showHandcards();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (lib.skill.msuoling.test(player)) {
var card = lib.skill.msuoling.getc(player);
card.classList.remove("glow");
2017-11-08 07:31:06 +00:00
delete card.mtongnian_link;
delete card._destroy;
2024-04-15 18:10:02 +00:00
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";
2017-11-08 07:31:06 +00:00
}
}
},
2024-04-15 18:10:02 +00:00
selectCard: [1, Infinity],
ai: {
order: 11,
},
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
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;
2017-11-08 02:40:40 +00:00
}
return false;
},
2024-04-15 18:10:02 +00:00
getList: function (player) {
var list = [];
var enemies = player.getEnemies();
for (var i = 0; i < enemies.length; i++) {
list.addArray(enemies[i].getCards("h"));
2017-11-08 02:40:40 +00:00
}
return list;
},
2024-04-15 18:10:02 +00:00
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";
2017-11-08 07:31:06 +00:00
}
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
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");
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
var list = lib.skill.mtongnian.getList(player);
var hs = player.getCards("h", function (card) {
return card.mtongnian_link ? true : false;
2017-11-08 02:40:40 +00:00
});
2024-04-15 18:10:02 +00:00
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;
2017-11-08 02:40:40 +00:00
}
hs[i].init(hs[i].mtongnian_link);
}
2024-04-15 18:10:02 +00:00
},
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
use: {
trigger: { player: "useCardBefore" },
silent: true,
filter: function (event, player) {
return event.card.mtongnian_link ? true : false;
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
var link = trigger.card.mtongnian_link;
var target = get.owner(link);
if (target && target != player) {
2017-11-08 02:40:40 +00:00
trigger.cards.add(trigger.card);
2024-04-15 18:10:02 +00:00
player.lose(trigger.cards, ui.discardPile);
trigger.card = link;
trigger.cards.length = 0;
2017-11-08 02:40:40 +00:00
trigger.cards.push(link);
2024-04-15 18:10:02 +00:00
target.lose(link, ui.discardPile);
player.logSkill("mtongnian", target);
game.log(target, "失去了", link);
2017-11-08 02:40:40 +00:00
game.delayx();
2024-04-15 18:10:02 +00:00
} else {
2017-11-08 02:40:40 +00:00
player.lose(trigger.card);
trigger.cancel();
}
2024-04-15 18:10:02 +00:00
},
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
lose: {
trigger: { player: "phaseUseEnd", global: "loseEnd" },
silent: true,
filter: function (event, player) {
if (event.name == "lose") {
return lib.skill.mtongnian.getList(player).length == 0;
2017-11-08 02:40:40 +00:00
}
return true;
},
2024-04-15 18:10:02 +00:00
content: function () {
var hs = player.getCards("h", function (card) {
return card.mtongnian_link ? true : false;
2017-11-08 02:40:40 +00:00
});
2024-04-15 18:10:02 +00:00
if (hs.length) {
player.lose(hs)._triggered = null;
2017-11-08 02:40:40 +00:00
}
2024-04-15 18:10:02 +00:00
},
},
},
ai: {
threaten: 1.3,
2017-11-08 02:40:40 +00:00
},
},
2024-04-15 18:10:02 +00:00
mbaizhan: {
trigger: { source: "damageEnd" },
forced: true,
filter: function (event) {
return event.num > 0;
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
2017-11-08 02:40:40 +00:00
player.changeHujia(trigger.num);
2017-11-30 08:32:57 +00:00
},
2024-04-15 18:10:02 +00:00
ai: {
damageBonus: true,
},
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
msilian: {
trigger: { player: "phaseEnd" },
filter: function (event, player) {
return player.hujia > 0;
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
check: function (event, player) {
return player.hujia > 1 && player.hp > 1;
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
player.storage.msilian = player.hujia;
2017-11-08 02:40:40 +00:00
player.changeHujia(-player.hujia);
player.insertPhase();
},
2024-04-15 18:10:02 +00:00
group: ["msilian_hp", "msilian_draw"],
subSkill: {
hp: {
trigger: { player: "phaseAfter" },
silent: true,
filter: function (event, player) {
return event.skill == "msilian" && !player.getStat("damage");
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
2017-11-08 02:40:40 +00:00
player.loseHp();
2024-04-15 18:10:02 +00:00
},
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
draw: {
trigger: { player: "phaseDrawBegin" },
filter: function (event) {
return event.getParent("phase").skill == "msilian";
2017-11-08 02:40:40 +00:00
},
2024-04-15 18:10:02 +00:00
silent: true,
content: function () {
trigger.num += player.storage.msilian - 2;
},
},
},
},
2018-04-17 07:32:43 +00:00
},
2024-04-15 18:10:02 +00:00
translate: {
mtg_jiding: "基定",
mtg_qianzhuo: "茜卓",
mtg_jiesi: "杰斯",
mtg_lilianna: "莉莲娜",
mtg_nisha: "妮莎",
mtg_ayeni: "阿耶尼",
2017-11-08 02:40:40 +00:00
2024-04-15 18:10:02 +00:00
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:
"每两轮限一次,结束阶段,你可以选择一名其他角色和一种卡牌类型(选择结果对其他角色不可见),直到下一回合开始,当你首次成为该类型卡牌的惟一目标时,你将目标转移给你指定的角色(目标须合法)。",
2018-04-17 07:32:43 +00:00
},
2017-11-08 02:40:40 +00:00
};
});