noname/character/clan.js

3832 lines
145 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.

import { lib, game, ui, get, ai, _status } from "../noname.js";
game.import("character", function () {
return {
//clan n.宗派;(尤指苏格兰的)宗族,氏族,家族;庞大的家族;帮派;小集团
name: "clan",
connect: true,
character: {
clan_wuxian: ["female", "shu", 3, ["clanyirong", "clanguixiang", "clanmuyin"], ["clan:陈留吴氏"]],
clan_wuban: ["male", "shu", 4, ["clanzhanding", "clanmuyin"], ["clan:陈留吴氏"]],
clan_xunshu: ["male", "qun", 3, ["clanshenjun", "clanbalong", "clandaojie"], ["clan:颍川荀氏"]],
clan_xunchen: ["male", "qun", 3, ["clansankuang", "clanbeishi", "clandaojie"], ["clan:颍川荀氏"]],
clan_xuncai: ["female", "qun", 3, ["clanlieshi", "clandianzhan", "clanhuanyin", "clandaojie"], ["clan:颍川荀氏"]],
clan_xuncan: ["male", "wei", 3, ["clanyunshen", "clanshangshen", "clanfenchai", "clandaojie"], ["clan:颍川荀氏"]],
clan_hanshao: ["male", "qun", 3, ["clanfangzhen", "clanliuju", "clanxumin"], ["clan:颍川韩氏"]],
clan_hanrong: ["male", "qun", 3, ["clanlianhe", "clanhuanjia", "clanxumin"], ["clan:颍川韩氏"]],
clan_wukuang: ["male", "qun", 4, ["clanlianzhu", "clanmuyin"], ["clan:陈留吴氏"]],
clan_wangling: ["male", "wei", 4, ["clanbolong", "clanzhongliu"], ["clan:太原王氏"]],
clan_zhongyan: ["female", "jin", 3, ["clanguangu", "clanxiaoyong", "clanbaozu"], ["clan:颍川钟氏"]],
clan_wangyun: ["male", "qun", 3, ["clanjiexuan", "clanmingjie", "clanzhongliu"], ["clan:太原王氏"]],
clan_wanghun: ["male", "jin", 3, ["clanfuxun", "clanchenya", "clanzhongliu"], ["clan:太原王氏"]],
clan_zhonghui: ["male", "wei", "3/4", ["clanyuzhi", "clanxieshu", "clanbaozu"], ["clan:颍川钟氏"]],
clan_zhongyu: ["male", "wei", 3, ["clanjiejian", "clanhuanghan", "clanbaozu"], ["clan:颍川钟氏"]],
clan_wanglun: ["male", "jin", 3, ["clanqiuxin", "clanjianyuan", "clanzhongliu"], ["clan:太原王氏"]],
clan_xunyou: ["male", "wei", 3, ["clanbaichu", "clandaojie"], ["clan:颍川荀氏"]],
clan_wuqiao: ["male", "jin", 4, ["clanqiajue", "clanmuyin"], ["clan:陈留吴氏"]],
clan_wangguang: ["male", "wei", 3, ["clanlilun", "clanjianji", "clanzhongliu"], ["clan:太原王氏"]],
clan_wangmingshan: ["male", "wei", 3, ["clantanque", "clanshengmo", "clanzhongliu"], ["clan:太原王氏"]],
clan_zhongyao: ["male", "wei", 3, ["clanchengqi", "clanjieli", "clanbaozu"], ["clan:颍川钟氏"]],
},
characterSort: {
clan: {
clan_wu: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"],
clan_xun: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"],
clan_han: ["clan_hanshao", "clan_hanrong"],
clan_wang: ["clan_wangling", "clan_wangyun", "clan_wanghun", "clan_wanglun", "clan_wangguang", "clan_wangmingshan"],
clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"],
},
},
/** @type { importCharacterConfig['skill'] } */
skill: {
//族钟繇
clanchengqi: {
hiddenCard(player, name) {
if (get.type(name) != "basic" && get.type(name) != "trick") return false;
if (player.getStorage("clanchengqi_effect").includes(name)) return false;
return player.countCards("hs") > 1 && lib.inpile.includes(name);
},
audio: 2,
enable: "chooseToUse",
filter(event, player) {
if (player.countCards("hs") < 2) return false;
return get
.inpileVCardList(info => {
const name = info[2];
if (get.type(name) != "basic" && get.type(name) != "trick") return false;
return !player.getStorage("clanchengqi_effect").includes(name);
})
.some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event));
},
chooseButton: {
dialog(event, player) {
const list = get
.inpileVCardList(info => {
const name = info[2];
if (get.type(name) != "basic" && get.type(name) != "trick") return false;
return !player.getStorage("clanchengqi_effect").includes(name);
})
.filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event));
return ui.create.dialog("承启", [list, "vcard"]);
},
check(button) {
if (get.event().getParent().type != "phase") return 1;
return get.event("player").getUseValue({
name: button.link[2],
nature: button.link[3],
});
},
backup(links, player) {
return {
audio: "clanchengqi",
filterCard: true,
complexCard: true,
selectCard: [2, Infinity],
popname: true,
viewAs: {
name: links[0][2],
nature: links[0][3],
},
filterOk() {
return (
(ui.selected.cards || []).reduce((sum, card) => {
return sum + get.cardNameLength(card);
}, 0) >= get.cardNameLength(lib.skill.clanchengqi_backup.viewAs.name)
);
},
check(card) {
const player = get.event("player");
const name = lib.skill.clanchengqi_backup.viewAs.name;
if (ui.selected.cards.length > 1 || card.name == name) return 0;
if (
ui.selected.cards.length &&
game.hasPlayer(target => {
return get.effect(target, { name: "draw" }, player, player) > 0;
})
) {
if (get.cardNameLength(name) <= get.cardNameLength(card) + get.cardNameLength(ui.selected.cards[0])) {
return 10 / (get.value(card) || 0.5);
}
}
return 1 / (get.value(card) || 0.5);
},
position: "hs",
precontent() {
player.addTempSkill("clanchengqi_effect");
player.markAuto("clanchengqi_effect", [event.result.card.name]);
},
};
},
prompt(links, player) {
return "将至少两张牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】使用";
},
},
ai: {
order(item, player) {
if (player && get.event().type == "phase") {
let list = get
.inpileVCardList(info => {
const name = info[2];
if (get.type(name) != "basic" && get.type(name) != "trick") return false;
return !player.getStorage("clanchengqi_effect").includes(name);
})
.map(card => {
return { name: card[2], nature: card[3] };
})
.filter(card => player.getUseValue(card, true, true) > 0);
if (!list.length) return 0;
list.sort((a, b) => (player.getUseValue(b, true, true) || 0) - (player.getUseValue(a, true, true) || 0));
return get.order(list[0], player) * 0.99;
}
return 0.001;
},
respondSha: true,
respondShan: true,
skillTagFilter(player, tag, arg) {
if (arg == "respond") return false;
const name = tag == "respondSha" ? "sha" : "shan";
return get.info("clanchengqi").hiddenCard(player, name);
},
result: { player: 1 },
},
subSkill: {
backup: { audio: "clanchengqi" },
effect: {
charlotte: true,
onremove: true,
trigger: { player: "useCard" },
filter(event, player) {
return (
event.skill == "clanchengqi_backup" &&
get.cardNameLength(event.card) ==
(event.cards || []).reduce((sum, card) => {
return sum + get.cardNameLength(card);
}, 0)
);
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget("承启:是否令一名角色摸一张牌?")
.set("ai", target => {
const player = get.event("player");
return get.effect(target, { name: "draw" }, player, player);
})
.forResult();
},
popup: false,
content() {
player.line(event.targets);
event.targets[0].draw();
},
},
},
},
clanjieli: {
audio: 2,
trigger: { player: "phaseJieshuBegin" },
filter(event, player) {
return game.hasPlayer(target => {
return target.countCards("h");
});
},
async cost(event, trigger, player) {
let num = 0;
if (player.getHistory("useCard").length) {
for (const history of player.getHistory("useCard")) {
if (num < get.cardNameLength(history.card)) {
num = get.cardNameLength(history.card);
}
}
}
const str = num > 0 ? "并观看牌堆顶" + get.cnNumber(num) + "张牌,然后你可以交换其中等量的牌" : "";
event.result = await player
.chooseTarget(get.prompt("clanjieli"), "观看一名角色的牌名字数最多的手牌" + str, (card, player, target) => {
return target.countCards("h");
})
.set("ai", target => {
const player = get.event("player"),
num = get.event("num");
let map = {};
for (const i of target.getCards("h")) {
if (!map[get.cardNameLength(i)]) {
map[get.cardNameLength(i)] = 0;
}
map[get.cardNameLength(i)]++;
}
let list = Object.keys(map).sort((a, b) => map[b] - map[a]);
list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i));
if (
num >=
target.countCards("h", card => {
return list.includes(get.cardNameLength(card));
})
)
return target.countCards("h") * 5 * get.sgn(get.sgn(get.attitude(player, target)) - 0.5);
return -target.countCards("h");
})
.set("num", num)
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
let num = 0;
if (player.getHistory("useCard").length) {
for (const history of player.getHistory("useCard")) {
if (num < get.cardNameLength(history.card)) {
num = get.cardNameLength(history.card);
}
}
}
let map = {};
for (const i of target.getCards("h")) {
if (!map[get.cardNameLength(i)]) {
map[get.cardNameLength(i)] = 0;
}
map[get.cardNameLength(i)]++;
}
let list = Object.keys(map).sort((a, b) => map[b] - map[a]);
list = list.filter(i => map[i] == map[list[0]]).map(i => parseInt(i));
const cards = target.getCards("h", card => {
return list.includes(get.cardNameLength(card));
});
if (num > 0 && cards.length >= num) {
const topCards = get.cards(num);
game.updateRoundNumber();
const result = await player
.chooseToMove("诫厉:交换其中" + get.cnNumber(num) + "张牌")
.set("list", [
[get.translation(target) + "牌名字数最多的手牌", cards, "dcsushou_tag"],
["牌堆顶", topCards],
])
.set("filterMove", (from, to) => {
return typeof to != "number";
})
.set("num", num)
.set("filterOk", moved => {
return moved[1].every(card => get.owner(card));
})
.set("processAI", list => {
const player = get.event("player"),
target = get.event().getParent().targets[0];
const sgn = get.sgn(get.sgn(get.attitude(player, target)) - 0.5);
const cards1 = list[0][1].slice().sort((a, b) => get.value(a, "raw") * sgn - get.value(b, "raw") * sgn);
const cards2 = list[1][1].slice().sort((a, b) => get.value(b, "raw") * sgn - get.value(a, "raw") * sgn);
return [cards1.slice().addArray(cards2.slice(0, get.event("num"))), cards2.slice().addArray(cards1.slice(0, get.event("num")))];
})
.forResult();
if (result.bool) {
const lose = result.moved[1].slice();
const gain = result.moved[0].slice().filter(i => !get.owner(i));
if (lose.length) await target.lose(lose, ui.special);
for (let i = lose.length - 1; i--; i >= 0) {
ui.cardPile.insertBefore(lose[i], ui.cardPile.firstChild);
}
game.updateRoundNumber();
if (gain.length) await target.gain(gain, "draw");
}
} else {
let content = ['<div class="text center">' + get.translation(target) + "牌名字数最多的手牌</div>", cards];
if (num > 0) {
const topCards = get.cards(num, true);
game.updateRoundNumber();
content.push('<div class="text center">牌堆顶</div>');
content.push(topCards);
}
await player.chooseControl("ok").set("dialog", content);
}
},
},
//族王明山
clantanque: {
audio: 2,
trigger: { player: "useCardAfter" },
usable: 1,
filter(event, player) {
const evt = lib.skill.dcjianying.getLastUsed(player, event);
if (!evt || !evt.card) return false;
const curCard = event.card,
prevCard = evt.card;
const curNum = get.number(curCard),
prevNum = get.number(prevCard);
if (typeof curNum != "number" || typeof prevNum != "number") return false;
const delNum = Math.abs(curNum - prevNum);
if (delNum === 0) return false;
return game.hasPlayer(current => {
return current.getHp() === delNum;
});
},
locked: false,
async cost(event, trigger, player) {
const evt = lib.skill.dcjianying.getLastUsed(player, trigger);
const curCard = trigger.card,
prevCard = evt.card;
const curNum = get.number(curCard),
prevNum = get.number(prevCard);
const delNum = Math.abs(curNum - prevNum);
event.result = await player
.chooseTarget(get.prompt("clantanque"), `对一名体力值为${delNum}的角色造成1点伤害`, (card, player, target) => {
return target.getHp() === get.event("delNum");
})
.set("delNum", delNum)
.set("ai", target => {
return get.damageEffect(target, get.player(), get.player());
})
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
await target.damage();
await game.asyncDelayx();
},
mod: {
aiOrder(player, card, num) {
if (typeof card != "object") return;
const evt = lib.skill.dcjianying.getLastUsed(player);
if (!evt || !evt.card) return;
const curNum = get.number(card),
prevNum = get.number(evt.card);
if (typeof curNum != "number" || typeof prevNum != "number") return;
const pairs = game
.filterPlayer()
.map(current => {
return [current.getHp(), get.damageEffect(current, player, player)];
})
.filter(pair => pair[1] > 0);
if (!pairs.length) return;
const delNum = Math.abs(curNum - prevNum);
for (const [hp, eff] of pairs) {
if (hp != delNum) continue;
return num + 10 + pairs.filter(pair => pair[0] === hp).sort((a, b) => b[1] - a[1])[0][1] / 20;
}
},
},
},
clanshengmo: {
audio: 2,
enable: "chooseToUse",
hiddenCard(player, name) {
if (get.type(name) != "basic") return false;
if (!player.getStorage("clanshengmo").includes(name) && (get.event("clanshengmo_cards") || []).length > 0) return true;
},
filter(event, player) {
if (event.responded) return false;
const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)),
cards = get.event("clanshengmo_cards") || [];
return (
cards.length > 0 &&
names.some(name => {
return event.filterCard({ name, isCard: true }, player, event);
})
);
},
onChooseToUse(event) {
if (game.online) return;
if (!event.clanshengmo_cards) {
let cards = [];
game.checkGlobalHistory("cardMove", evt => {
if (evt.name != "cardsDiscard" && (evt.name != "lose" || evt.position != ui.discardPile)) return;
cards.addArray(evt.cards.filter(card => get.position(card, true) == "d"));
});
const numbers = cards.map(card => get.number(card, false)).unique();
const [min, max] = [Math.min(...numbers), Math.max(...numbers)];
event.set(
"clanshengmo_cards",
cards.filter(card => {
const num = get.number(card, false);
return num > min && num < max;
})
);
}
},
async content(event, trigger, player) {
const evt = event.getParent(2);
const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name)),
cards = evt.clanshengmo_cards;
const links = await player
.chooseButton(["剩墨:获得其中一张牌", cards], true)
.set("ai", button => {
return get.value(button.link);
})
.forResultLinks();
if (!links || !links.length) return;
const list = [];
for (const name of names) {
const card = { name, isCard: true };
if (evt.filterCard(card, player, evt)) {
list.push(["基本", "", name]);
}
if (name == "sha") {
for (const nature of lib.inpile_nature) {
card.nature = nature;
if (evt.filterCard(card, player, evt)) {
list.push(["基本", "", name, nature]);
}
}
}
}
if (!list.length) return;
const links2 = await player
.chooseButton(["视为使用一张未以此法使用过的基本牌", [list, "vcard"]], true)
.set("ai", button => {
return get.player().getUseValue(button.link) + 1;
})
.forResultLinks();
const name = links2[0][2],
nature = links2[0][3];
game.broadcastAll(
(name, nature, toGain) => {
lib.skill.clanshengmo_backup.viewAs = {
name,
nature,
isCard: true,
};
lib.skill.clanshengmo_backup.prompt = `选择${get.translation(nature)}${get.translation(name)}】的目标`;
lib.skill.clanshengmo_backup.cardToGain = toGain;
},
name,
nature,
links[0]
);
evt.set("_backupevent", "clanshengmo_backup");
evt.backup("clanshengmo_backup");
evt.set("openskilldialog", `选择${get.translation(nature)}${get.translation(name)}】的目标`);
evt.set("norestore", true);
evt.set("custom", {
add: {},
replace: { window() {} },
});
evt.goto(0);
},
marktext: "墨",
intro: {
content: "已以此法使用过$",
},
subSkill: {
backup: {
precontent() {
delete event.result.skill;
event.result.card.storage.clanshengmo = true;
player.markAuto("clanshengmo", event.result.card.name);
player.gain(lib.skill.clanshengmo_backup.cardToGain, "gain2");
},
filterCard: () => false,
selectCard: -1,
},
},
ai: {
order: 3,
result: {
player(player) {
if (get.event().dying) return get.attitude(player, get.event().dying);
if (get.event().type != "phase") return 1;
const names = lib.inpile.filter(name => get.type(name) == "basic" && !player.getStorage("clanshengmo").includes(name));
if (Array.isArray(names)) {
return names.some(name => {
return player.getUseValue({ name }) > 0;
});
}
return 0;
},
},
},
},
//族贝斯塔[doge]
clanlilun: {
audio: 2,
enable: "phaseUse",
filter(event, player) {
return player.hasCard(card => get.info("clanlilun").filterCard(card, player), "h");
},
filterCard(card, player) {
if (player.getStorage("clanlilun").includes(card.name)) return false;
if (ui.selected.cards.length && ui.selected.cards[0].name != card.name) return false;
const cards = player.getCards("h", cardx => player.canRecast(cardx));
return cards.includes(card) && cards.filter(i => i.name == card.name).length > 1;
},
selectCard: 2,
position: "h",
check(card) {
const player = get.event("player");
const value = function (card, player) {
const num = player.getUseValue(card);
return num > 0 ? num + 1 / (get.value(card) || 0.5) + 7 : 7 - get.value(card);
};
if (ui.selected.cards.length && value(card, player) < value(ui.selected.cards[0], player)) return 20 - get.value(card);
return value(card, player);
},
complexCard: true,
discard: false,
lose: false,
delay: 0,
usable: 1,
async content(event, trigger, player) {
await player.recast(event.cards);
if (!player.storage.clanlilun) {
player.when({ global: "phaseAfter" }).then(() => {
player.unmarkSkill("clanlilun");
delete player.storage.clanlilun;
});
}
player.markAuto(
"clanlilun",
event.cards.slice().map(card => card.name)
);
const cards = event.cards.filterInD("d");
if (cards.some(card => player.hasUseTarget(card))) {
const {
result: { bool, links },
} = await player
.chooseButton(["离论:是否使用其中的一张牌?", cards])
.set("filterButton", button => {
return get.event("player").hasUseTarget(button.link);
})
.set("ai", button => {
return get.event("player").getUseValue(button.link);
});
if (bool) {
const card = links[0];
player.$gain2(card, false);
await game.asyncDelayx();
await player.chooseUseTarget(true, card, false);
}
}
},
onremove: true,
intro: { content: "本回合已重铸过$" },
ai: {
order(item, player) {
let cards = player.getCards("h", card => get.info("clanlilun").filterCard(card, player) && player.getUseValue(card) > 0);
cards = cards.filter(card => cards.filter(i => i.name == card.name).length > 1);
if (!cards.length) return 1;
cards.sort((a, b) => get.order(b) - get.order(a));
return get.order(cards[0]) - 0.001;
},
result: { player: 1 },
},
},
clanjianji: {
unique: true,
limited: true,
audio: 2,
trigger: { global: "phaseJieshuBegin" },
filter(event, player) {
if (!event.player.isIn()) return false;
const targets = game.filterPlayer(target => {
return event.player.getPrevious() == target || event.player.getNext() == target;
});
if (!targets.length) return false;
const card = new lib.element.VCard({ name: "sha" });
return (
!targets.some(target => {
return target.getHistory("useCard").length;
}) ||
(player.hasUseTarget(card) &&
!targets.some(target => {
return game.hasPlayer2(current => {
return current.getHistory("useCard", evt => {
return evt.targets && evt.targets.includes(target);
}).length;
});
}))
);
},
skillAnimation: true,
animationColor: "watar",
prompt2(event, player) {
let str = "";
const card = new lib.element.VCard({ name: "sha" });
const targets = game.filterPlayer(target => {
return event.player.getPrevious() == target || event.player.getNext() == target;
}),
bool = !targets.some(target => {
return target.getHistory("useCard").length;
}),
goon =
player.hasUseTarget(card) &&
!targets.some(target => {
return game.hasPlayer2(current => {
return current.getHistory("useCard", evt => {
return evt.targets && evt.targets.includes(target);
}).length;
});
});
if (bool) {
if (goon) str += "你可以";
str += "与" + get.translation(get.translation(event.player)) + "各摸一张牌";
}
if (goon) {
if (bool) str += ",然后你可以";
str += "视为使用一张【杀】";
}
return str;
},
check(event, player) {
const card = new lib.element.VCard({ name: "sha" });
const targets = game.filterPlayer(target => {
return event.player.getPrevious() == target || event.player.getNext() == target;
}),
bool = !targets.some(target => {
return target.getHistory("useCard").length;
}),
goon =
player.hasUseTarget(card) &&
!targets.some(target => {
return game.hasPlayer2(current => {
return current.getHistory("useCard", evt => {
return evt.targets && evt.targets.includes(target);
}).length;
});
});
return (bool && (get.attitude(player, event.player) > 0 || event.player.countCards("h") > player.countCards("h"))) || (goon && player.hasValueTarget(card));
},
logTarget: "player",
async content(event, trigger, player) {
player.awakenSkill("clanjianji");
const card = new lib.element.VCard({ name: "sha" });
const targets = game.filterPlayer(target => {
return trigger.player.getPrevious() == target || trigger.player.getNext() == target;
}),
boolx = !targets.some(target => {
return target.getHistory("useCard").length;
}),
goon =
player.hasUseTarget(card) &&
!targets.some(target => {
return game.hasPlayer2(current => {
return current.getHistory("useCard", evt => {
return evt.targets && evt.targets.includes(target);
}).length;
});
});
if (boolx) {
let draw = false;
if (goon) {
const {
result: { bool },
} = await player.chooseBool("是否与" + get.translation(trigger.player) + "各摸一张牌?").set("choice", get.attitude(player, trigger.player) > 0 || trigger.player.countCards("h") > player.countCards("h"));
if (bool) draw = true;
} else draw = true;
if (draw) {
await player.draw("nodelay");
await trigger.player.draw();
}
}
if (goon) await player.chooseUseTarget(card, false, !boolx);
},
},
//族吴乔
clanqiajue: {
audio: 2,
trigger: { player: "phaseDrawBegin" },
filter(event, player) {
return (
player.countCards("he", card => {
if (_status.connectMode && get.position(card) == "h") return true;
return get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player);
}) > 0
);
},
direct: true,
async content(event, trigger, player) {
const {
result: { bool },
} = await player
.chooseToDiscard((card, player) => {
return get.color(card, player) == "black" && lib.filter.cardDiscardable(card, player);
}, "he")
.set("prompt", "当前手牌点数和为" + player.getCards("h").reduce((sum, card) => sum + get.number(card), 0) + "" + get.prompt("clanqiajue"))
.set("prompt2", lib.translate.clanqiajue_info.slice(lib.translate.clanqiajue_info.indexOf("弃置")).slice(0, -1))
.set("ai", card => {
const player = get.event("player"),
goon = get.position(card) == "h";
let num = player.getCards("h").reduce((sum, card) => sum + get.number(card), 0);
if (num - (goon ? get.number(card) : 0) > 30) return 0;
return goon ? get.number(card) : 1 / (get.value(card) || 0.5);
})
.set("logSkill", "clanqiajue");
if (bool) {
player
.when({
player: ["phaseDrawEnd", "phaseDrawCancelled", "phaseUseSkipped"],
})
.filter(evt => evt == trigger)
.then(() => {
const cards = player.getCards("h"),
num = cards.reduce((sum, card) => sum + get.number(card), 0);
if (cards.length) player.showCards(cards, get.translation(player) + "【跒倔】展示");
if (num > 30) {
player.popup("杯具");
lib.skill.chenliuwushi.change(player, -2);
} else {
player.popup("洗具");
const next = player.phaseDraw();
event.next.remove(next);
trigger.getParent("phase").next.push(next);
}
});
}
},
},
//族荀攸
clanbaichu: {
derivation: "qice",
audio: 2,
trigger: { player: "useCardAfter" },
filter(event, player) {
const storage = player.storage.clanbaichu || {};
if (Object.values(storage).includes(event.card.name)) return true;
const suit = get.suit(event.card);
if (suit == "none") return false;
if (!player.hasSkill("qice")) return true;
const key = `${suit}+${get.type2(event.card)}`;
return !(key in storage);
},
forced: true,
content() {
"step 0";
var storage = player.storage.clanbaichu || {},
suit = get.suit(trigger.card);
if (suit != "none") {
var key = `${suit}+${get.type2(trigger.card)}`;
if (key in storage) {
if (!player.hasSkill("qice")) {
player.addTempSkills("qice", "roundStart");
player.popup("奇策");
// game.log(player,'获得了技能','#g【奇策】');
}
event.goto(2);
} else {
var list = lib.inpile.filter(name => get.type(name) == "trick");
list.removeArray(Object.values(storage));
if (list.length > 0) {
var dialog = ["百出:选择记录一种普通锦囊牌", [list, "vcard"]];
player.chooseButton(dialog, true).set("ai", function (button) {
var player = _status.event.player,
name = button.link[2];
if (name == _status.event.getTrigger().card.name) return 1919810;
if (name == "wuxie") return 114514;
return get.effect(player, { name: name }, player, player) * (1 + player.countCards("hs", name));
});
} else event.goto(2);
}
} else event.goto(2);
("step 1");
if (result.bool) {
var key = `${get.suit(trigger.card)}+${get.type2(trigger.card)}`,
name = result.links[0][2];
if (!player.storage.clanbaichu) player.storage.clanbaichu = {};
player.storage.clanbaichu[key] = name;
player.markSkill("clanbaichu");
game.log(player, "记录了", "#y" + get.translation(name));
game.delayx();
}
("step 2");
if (Object.values(player.getStorage("clanbaichu")).includes(trigger.card.name)) {
player.chooseDrawRecover(true);
}
},
intro: {
markcount(storage) {
return Object.keys(storage).length;
},
content(storage) {
if (!storage) return "当前暂无记录";
const keys = Object.keys(storage).map(i => i.split("+"));
keys.sort((a, b) => {
if (a[0] != b[0]) return lib.suit.indexOf(b[0]) - lib.suit.indexOf(a[0]);
return lib.sort.name(a[1], b[1]);
});
return keys
.map(item => {
return `<li>${get.translation(item[0])}+${get.translation(item[1])}:【${get.translation(storage[item.join("+")])}`;
})
.join("<br>");
},
},
},
//族王沦
clanqiuxin: {
audio: 2,
enable: "phaseUse",
filterTarget: lib.filter.notMe,
usable: 1,
content() {
"step 0";
var str = get.translation(player);
target
.chooseControl()
.set("choiceList", [str + "下次对你使用【杀】后,其视为对你使用任意普通锦囊牌", str + "下次对你使用任意普通锦囊牌后,其视为对你使用【杀】"])
.set("ai", function () {
var target = _status.event.player;
var player = _status.event.target;
var num1 = get.effect(target, get.autoViewAs({ name: "sha" }, []), player, player);
if (!player.canUse(get.autoViewAs({ name: "sha" }, []), target)) num1 = 0;
var num2 = 0;
for (var name of lib.inpile) {
if (get.type(name) != "trick") continue;
if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue;
if (num2 < get.effect(target, get.autoViewAs({ name: name }, []), player, player)) num2 = get.effect(target, get.autoViewAs({ name: name }, []), player, player);
}
return num1 >= num2 ? 1 : 0;
})
.set("target", player);
("step 1");
player.addSkill("clanqiuxin_effect");
player.markAuto("clanqiuxin_effect", [[target, result.index]]);
},
ai: {
order: 9,
result: {
target(player, target) {
var cards = player.getCards("hs", card => {
if (get.name(card, player) != "sha" && get.type(card, player) != "trick") return false;
return player.hasValueTarget(card);
});
if (cards.some(card => player.canUse(card, target) && get.effect(target, card, player, player) > 0)) {
var att = get.attitude(player, target);
if (att > 0) return 9;
if (att < 0) return -6;
return 0;
} else {
var att = get.attitude(player, target);
if (att < 0) return -3;
if (att > 0) return 1;
return 2;
}
},
},
},
subSkill: {
effect: {
charlotte: true,
onremove: true,
intro: {
content(storage, player) {
var str = "";
for (var i = 0; i < storage.length; i++) {
var list = storage[i];
var strx = ["【杀】", "任意普通锦囊牌"];
if (list[1]) strx.reverse();
str += "对" + get.translation(list[0]) + "使用" + strx[0] + "后,视为对其使用" + strx[1];
str += "<br>";
}
str = str.slice(0, -4);
return str;
},
},
trigger: { player: "useCardAfter" },
filter(event, player) {
if (!event.targets || !event.targets.length) return false;
if (event.card.name == "sha")
return event.targets.some(target => {
return player.getStorage("clanqiuxin_effect").some(list => list[0] == target && list[1] == 0);
});
if (get.type(event.card) == "trick")
return event.targets.some(target => {
return player.getStorage("clanqiuxin_effect").some(list => list[0] == target && list[1] == 1);
});
return false;
},
forced: true,
popup: false,
content() {
"step 0";
var list;
if (trigger.card.name == "sha") list = player.getStorage("clanqiuxin_effect").filter(listx => trigger.targets.includes(listx[0]) && listx[1] == 0);
if (get.type(trigger.card) == "trick") list = player.getStorage("clanqiuxin_effect").filter(listx => trigger.targets.includes(listx[0]) && listx[1] == 1);
player.unmarkAuto("clanqiuxin_effect", list);
var targets = list.map(listx => listx[0]);
event.targets = targets;
("step 1");
var target = event.targets.shift();
event.target = target;
var list = [];
for (var name of lib.inpile) {
if (name != "sha" && get.type(name) != "trick") continue;
if (trigger.card.name == "sha" && get.type(name) != "trick") continue;
if (name == "sha" && get.type(trigger.card) != "trick") continue;
if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue;
list.push([get.translation(get.type(name)), "", name]);
}
if (!list.length) event.goto(3);
else {
player
.chooseButton(["求心:视为对" + get.translation(target) + "使用一张牌", [list, "vcard"]], true)
.set("ai", function (button) {
var player = _status.event.player;
var target = _status.event.target;
return get.effect(
target,
{
name: button.link[2],
nature: button.link[3],
},
player,
player
);
})
.set("target", target);
}
("step 2");
if (result.bool) {
var card = {
name: result.links[0][2],
nature: result.links[0][3],
};
player.useCard(card, target, false);
}
("step 3");
if (event.targets.length) event.goto(1);
else if (!player.getStorage("clanqiuxin_effect").length) player.removeSkill("clanqiuxin_effect");
},
},
},
},
clanjianyuan: {
inherit: "clanchenya",
filter(event, player) {
for (var phase of lib.phaseName) {
var evt = event.getParent(phase);
if (evt && evt.name == phase) {
if (event.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length) return lib.skill.clanchenya.filter(event, player);
}
}
return false;
},
content() {
"step 0";
var num = 0;
for (var phase of lib.phaseName) {
var evt = trigger.getParent(phase);
if (evt && evt.name == phase) {
num += trigger.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length;
}
}
trigger.player
.chooseCard("是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", (card, player) => _status.event.cards.includes(card) && player.canRecast(card))
.set("ai", card => {
var val = get.value(card);
return 6 - val;
})
.set(
"cards",
trigger.player.getCards("he", card => {
return get.cardNameLength(card) == num;
})
);
("step 1");
if (result.bool) trigger.player.recast(result.cards);
},
},
//族钟毓
clanjiejian: {
audio: 2,
trigger: { player: "useCardToPlayered" },
filter(event, player) {
if (!event.isFirstTarget || get.type(event.card) == "equip") return false;
return get.cardNameLength(event.card) == player.getHistory("useCard").indexOf(event.getParent()) + 1;
},
direct: true,
locked: false,
content() {
"step 0";
var num = get.cardNameLength(trigger.card);
event.num = num;
player
.chooseTarget(get.prompt("clanjiejian"), "令一名目标角色摸" + get.cnNumber(num) + "张牌", function (card, player, target) {
return _status.event.getTrigger().targets.includes(target);
})
.set("ai", target => get.attitude(_status.event.player, target));
("step 1");
if (result.bool) {
var target = result.targets[0];
player.logSkill("clanjiejian", target);
target.draw(num);
}
},
ai: {
threaten: 3,
effect: {
player(card, player, target) {
if (!target || typeof card !== "object" || player._clanjiejian_mod_temp || get.type(card) === "equip" || get.attitude(player, target) <= 0 || get.cardNameLength(card) !== player.getHistory("useCard").length + 1) return;
let targets = [target],
evt = _status.event.getParent("useCard");
targets.addArray(ui.selected.targets);
if (evt && evt.card == card) targets.addArray(evt.targets);
return [1, (0.8 * get.cardNameLength(card)) / targets.length];
},
},
},
mod: {
aiOrder(player, card, num) {
if (typeof card == "object" && get.type(card) !== "equip") {
let cs = get.cardNameLength(card) - player.getHistory("useCard").length - 1;
if (cs < 0) return num;
if (cs > 0) return num / 3;
player._clanjiejian_mod_temp = true;
let bool = game.hasPlayer(target => {
if (get.attitude(player, target) <= 0 || !player.canUse(card, target, null, true)) return false;
return get.effect(target, card, player, player) + get.effect(target, { name: "draw" }, player, player) > 0;
});
delete player._clanjiejian_mod_temp;
if (bool) return num + 15;
}
},
},
},
clanhuanghan: {
audio: 2,
trigger: { player: "damageEnd" },
filter(event, player) {
if (!event.card) return false;
var num = get.cardNameLength(event.card);
return typeof num == "number" && num > 0;
},
check(event, player) {
let num = get.cardNameLength(event.card) - player.getDamagedHp();
if (num >= 0) return true;
if (num < -1) return false;
if (
player.hasSkill("clanbaozu", null, false, false) &&
player.awakenedSkills.includes("clanbaozu") &&
player.getHistory("useSkill", evt => {
return evt.skill == "clanhuanghan";
}).length
)
return true;
return false;
},
content() {
"step 0";
player.draw(get.cardNameLength(trigger.card));
if (player.isDamaged()) player.chooseToDiscard(player.getDamagedHp(), "he", true);
("step 1");
if (player.getHistory("useSkill", evt => evt.skill == "clanhuanghan").length > 1 && player.hasSkill("clanbaozu", null, false, false) && player.awakenedSkills.includes("clanbaozu")) {
player.restoreSkill("clanbaozu");
player.popup("保族");
game.log(player, "恢复了技能", "#【保族】");
}
},
ai: {
threaten: 3,
effect: {
target(card, player, target) {
if (!get.tag(card, "damage") || player.hasSkillTag("jueqing", false, target)) return;
let num = get.cardNameLength(card) - target.getDamagedHp();
if (num > 0) return [1, num + 0.1];
},
},
},
},
//族钟会
clanyuzhi: {
mod: {
aiOrder(player, card, num) {
if (card.name == "tao") return num / 114514;
},
},
audio: 2,
trigger: { global: "roundStart" },
direct: true,
locked: true,
content() {
"step 0";
player.unmarkSkill("clanyuzhi");
if (
player.countCards("h", card => {
return card.hasGaintag("clanyuzhi") && lib.filter.cardDiscardable(card, player);
})
) {
event.logged = true;
player.chooseToDiscard(
player.countCards("h"),
"h",
(card, player) => {
return card.hasGaintag("clanyuzhi");
},
true
).logSkill = "clanyuzhi";
}
("step 1");
player.removeGaintag("clanyuzhi");
var num1 = player
.getRoundHistory(
"gain",
evt => {
return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi";
},
1
)
.reduce((sum, evt) => sum + evt.cards.length, 0);
var num2 = player
.getRoundHistory(
"gain",
evt => {
return evt.getParent().name == "draw" && evt.getParent(2).name == "clanyuzhi";
},
2
)
.reduce((sum, evt) => sum + evt.cards.length, 0);
var num3 = player
.getRoundHistory(
"useCard",
evt => {
return evt.cards && evt.cards.length;
},
1
)
.reduce((sum, evt) => sum + evt.cards.length, 0);
event.num1 = num1;
if ((num1 > 0 && num2 > 0 && num1 > num2) || num1 > num3) {
if (!event.logged) player.logSkill("clanyuzhi");
if (num2 > 0 && num1 > num2) game.log(player, "的野心已开始膨胀", "#y(" + num1 + "张>" + num2 + "张)");
if (num1 > num3) game.log(player, "的行动未达到野心", "#y(" + num3 + "张<" + num1 + "张)");
if (player.hasSkill("clanbaozu", null, false, false)) player.chooseBool("迂志:是否失去〖保族〗?", "若选择“否”则你受到1点雷属性伤害").set("choice", player.awakenedSkills.includes("clanbaozu"));
else event._result = { bool: false };
} else event.goto(3);
("step 2");
if (result.bool) {
player.removeSkills("clanbaozu");
} else player.damage(1, "thunder");
("step 3");
if (player.countCards("h")) {
player
.chooseCard(
"迂志:请展示一张手牌",
"摸此牌牌名字数的牌。下一轮开始时弃置此牌若本轮你使用的牌数或上一轮你以此法摸的牌数小于此牌牌名字数则你受到1点雷属性伤害或失去〖保族〗。",
function (card, player) {
var num = get.cardNameLength(card);
return typeof num == "number" && num > 0;
},
true
)
.set("ai", function (card) {
if (_status.event.dying && _status.event.num > 0 && get.cardNameLength(card) > _status.event.num) return 1 / get.cardNameLength(card); //怂
return get.cardNameLength(card); //勇
})
.set(
"dying",
player.hp +
player.countCards("hs", {
name: ["tao", "jiu"],
}) <
1
)
.set("num", event.num1);
} else event.finish();
("step 4");
if (result.bool) {
player.logSkill("clanyuzhi");
player.showCards(result.cards, get.translation(player) + "发动了【迂志】");
player.addGaintag(result.cards, "clanyuzhi");
player.draw(get.cardNameLength(result.cards[0]));
player.storage.clanyuzhi = get.cardNameLength(result.cards[0]);
player.markSkill("clanyuzhi");
}
},
ai: {
threaten: 3,
nokeep: true,
},
onremove: true,
intro: { content: "本轮野心:#张" },
},
clanxieshu: {
audio: 2,
trigger: { player: "damageEnd", source: "damageSource" },
filter(event, player) {
if (!event.card || player.isLinked()) return false;
var num = get.cardNameLength(event.card);
return typeof num == "number" && num > 0 && player.countCards("he") > 0;
},
async cost(event, trigger, player) {
var num = get.cardNameLength(trigger.card),
str = "";
if (player.getDamagedHp() > 0) str += ",然后摸" + get.cnNumber(player.getDamagedHp()) + "张牌";
event.result = await player
.chooseToDiscard(get.prompt("clanxieshu"), "横置武将牌并弃置" + get.cnNumber(num) + "张牌" + str, "he", num)
.set("ai", function (card) {
var player = _status.event.player;
var num = _status.event.num;
var num2 = player.getDamagedHp();
if (!num2) return 0;
if (num < num2) return 8 - get.value(card);
if (num == num2 || num2 >= 2 + num - num2) return lib.skill.zhiheng.check(card);
return 0;
})
.set("num", num)
.set("logSkill", "clanxieshu")
.forResult();
},
popup: false,
*content(event, map) {
const player = map.player;
yield player.link(true);
if (player.getDamagedHp() > 0) {
yield player.draw(player.getDamagedHp());
}
if (
game.getGlobalHistory("everything", evt => {
return evt.name == "dying";
}).length
) {
player.tempBanSkill("clanxieshu");
}
},
ai: { threaten: 3 },
},
//族王浑
clanfuxun: {
mod: {
aiOrder(player, card, num) {
if (player.isPhaseUsing() && get.type(card) == "equip" && get.equipValue(card, player) > 0) return num + 3;
},
},
locked: false,
audio: 2,
enable: "phaseUse",
usable: 1,
filterCard: true,
position: "h",
discard: false,
lose: false,
delay: false,
selectCard() {
var player = _status.event.player;
if (ui.selected.targets.length && !ui.selected.targets[0].countGainableCards(player, "h")) return 1;
return [0, 1];
},
filterTarget(card, player, target) {
if (player == target) return false;
if (!ui.selected.cards.length) return target.countGainableCards(player, "h") > 0;
return true;
},
check(card) {
var player = _status.event.player;
var evtx = _status.event.getParent("phaseUse");
var targets = game.filterPlayer(target => target != player && lib.skill.clanfuxun.ai.result.target(player, target) != 0);
targets.sort((a, b) => Math.abs(lib.skill.clanfuxun.ai.result.target(player, b)) - Math.abs(lib.skill.clanfuxun.ai.result.target(player, a)));
if (evtx && targets.length) {
var target = targets[0];
if (
!target.hasHistory("lose", evt => {
return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length;
}) &&
!target.hasHistory("gain", evt => {
return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length;
}) &&
Math.abs(player.countCards("h") - target.countCards("h")) == 2
) {
if (player.countCards("h") > target.countCards("h")) return 1 / (get.value(card) || 0.5);
return -1;
}
if (card.name == "du") return 20;
return -1;
}
if (card.name == "du") return 20;
return -1;
},
content() {
"step 0";
if (cards.length) {
player.give(cards, target);
} else {
player.gainPlayerCard(target, "h", true);
}
("step 1");
var evtx = event.getParent("phaseUse");
if (
player.countCards("h") == target.countCards("h") &&
evtx &&
!target.hasHistory("lose", evt => {
return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length;
}) &&
!target.hasHistory("gain", evt => {
return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length;
}) &&
player.countCards("he")
) {
var list = [];
for (var name of lib.inpile) {
if (get.type(name) != "basic") continue;
if (player.hasUseTarget({ name: name })) list.push(["基本", "", name]);
if (name == "sha") {
for (var nature of lib.inpile_nature) {
if (
player.hasUseTarget({
name: name,
nature: nature,
})
)
list.push(["基本", "", name, nature]);
}
}
}
if (list.length) {
player.chooseButton(["是否将一张牌当做一种基本牌使用?", [list, "vcard"]]).set("ai", button => {
return _status.event.player.getUseValue({
name: button.link[2],
nature: button.link[3],
});
});
} else event.finish();
} else event.finish();
("step 2");
if (result.bool) {
var card = {
name: result.links[0][2],
nature: result.links[0][3],
};
game.broadcastAll(function (card) {
lib.skill.clanfuxun_backup.viewAs = card;
}, card);
var next = player.chooseToUse();
next.set("openskilldialog", "将一张牌当做" + get.translation(card) + "使用");
next.set("norestore", true);
next.set("addCount", false);
next.set("_backupevent", "clanfuxun_backup");
next.set("custom", {
add: {},
replace: { window() {} },
});
next.backup("clanfuxun_backup");
}
},
ai: {
order(item, player) {
var evtx = _status.event.getParent("phaseUse");
if (
game.hasPlayer(current => {
if (current == player || !evtx || get.attitude(player, current) == 0) return false;
return (
!current.hasHistory("lose", evt => {
return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length;
}) &&
!current.hasHistory("gain", evt => {
return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length;
}) &&
Math.abs(player.countCards("h") - current.countCards("h")) == 2
);
})
)
return 10;
return 2;
},
result: {
target(player, target) {
var evtx = _status.event.getParent("phaseUse");
var num = get.sgn(get.attitude(player, target));
var targets = game.filterPlayer(current => {
if (current == player || !evtx || get.attitude(player, current) == 0) return false;
return (
!current.hasHistory("lose", evt => {
return evt.getParent(3).name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards2.length;
}) &&
!current.hasHistory("gain", evt => {
return evt.getParent().name != "clanfuxun" && evt.getParent("phaseUse") == evtx && evt.cards.length;
}) &&
Math.abs(player.countCards("h") - current.countCards("h")) == 2
);
});
if (targets.includes(target)) {
if (player.countCards("h") < target.countCards("h")) return get.sgn(num + 0.5) * Math.sqrt(2 - num);
else return num * (2 + num);
}
return get.sgn(num + 0.5) * (1 - num) * 0.25;
},
},
},
subSkill: {
backup: {
filterCard(card) {
return get.itemtype(card) == "card";
},
position: "hes",
filterTarget: lib.filter.filterTarget,
selectCard: 1,
check(card) {
var player = _status.event.player;
if (player.hasSkill("clanzhongliu") && get.position(card) != "h") return 10 - get.value(card);
return 5 - get.value(card);
},
log: false,
precontent() {
delete event.result.skill;
},
},
},
},
clanchenya: {
audio: 2,
trigger: {
global: ["useSkillAfter", "logSkill"],
},
filter(event, player) {
if (event.type != "player") return false;
var skill = event.sourceSkill || event.skill;
var info = get.info(skill);
if (info.charlotte) return false;
var translation = get.skillInfoTranslation(skill, event.player);
if (!translation) return false;
var match = translation.match(/“?出牌阶段限一次/g);
if (!match || match.every(value => value != "出牌阶段限一次")) return false;
return event.player.countCards("h") > 0;
},
check(event, player) {
return get.attitude(player, event.player) > 0;
},
logTarget: "player",
content() {
"step 0";
var num = trigger.player.countCards("h");
trigger.player
.chooseCard("是否重铸任意张牌名字数为" + num + "的牌?", [1, Infinity], "he", (card, player) => _status.event.cards.includes(card) && player.canRecast(card))
.set("ai", card => {
var val = get.value(card);
return 6 - val;
})
.set(
"cards",
trigger.player.getCards("he", card => {
return get.cardNameLength(card) == num;
})
);
("step 1");
if (result.bool) trigger.player.recast(result.cards);
},
},
//族王允
clanjiexuan: {
audio: 2,
enable: "phaseUse",
limited: true,
zhuanhuanji: "number",
mark: true,
marktext: "☯",
intro: {
markcount: () => 0,
content(storage) {
return "限定技,转换技。你可以将一张" + ((storage || 0) % 2 ? "黑色牌当【过河拆桥】" : "红色牌当【顺手牵羊】") + "使用。";
},
},
viewAs(cards, player) {
var storage = player.storage.clanjiexuan;
var name = (storage || 0) % 2 ? "guohe" : "shunshou";
return { name: name };
},
check(card) {
var player = _status.event.player;
var storage = player.storage.clanjiexuan;
var name = (storage || 0) % 2 ? "guohe" : "shunshou";
var fix = player.hasSkill("clanzhongliu") && get.position(card) != "h" ? 2 : 1;
return (get.value({ name: name }, player) - get.value(card)) * fix;
},
position: "hes",
filterCard(card, player) {
var storage = player.storage.clanjiexuan;
return get.color(card) == ((storage || 0) % 2 ? "black" : "red");
},
prompt() {
var storage = _status.event.player.storage.clanjiexuan;
if ((storage || 0) % 2) return "将一张黑色牌当【过河拆桥】使用";
return "将一张红色牌当【顺手牵羊】使用";
},
skillAnimation: true,
animationColor: "thunder",
precontent() {
"step 0";
var skill = "clanjiexuan";
player.logSkill(skill);
player.changeZhuanhuanji(skill);
player.awakenSkill(skill, true);
delete event.result.skill;
},
ai: {
order(item, player) {
player = player || _status.event.player;
var storage = _status.event.player.storage.clanjiexuan;
var name = (storage || 0) % 2 ? "guohe" : "shunshou";
return get.order({ name: name }) + 0.1;
},
},
},
clanmingjie: {
init(player) {
player.addSkill("clanmingjie_record");
},
initSkill(skill) {
if (!lib.skill[skill]) {
lib.skill[skill] = {
charlotte: true,
mark: true,
marktext: "戒",
intro: { content: "已被$指定为【铭戒】目标" },
};
lib.translate[skill] = "铭戒";
lib.translate[skill + "_bg"] = "戒";
}
},
onremove(player) {
player.removeSkill("clanmingjie_record");
},
audio: 2,
enable: "phaseUse",
limited: true,
filterTarget(card, player, target) {
return !target.hasSkill("clanmingjie_" + player.playerid);
},
skillAnimation: true,
animationColor: "thunder",
content() {
player.awakenSkill("clanmingjie");
player.addSkill("clanmingjie_effect");
var skill = "clanmingjie_" + player.playerid;
game.broadcastAll(lib.skill.clanmingjie.initSkill, skill);
target.addTempSkill(skill, { player: "phaseAfter" });
target.storage[skill] = player;
},
ai: {
order: 10,
result: {
target(player, target) {
if (player.hasSkill("clanzhongliu") || player.hp == 1) {
if (
!player.hasCard(card => {
var info = get.info(card);
if (info.allowMultiple == false) return false;
if (!lib.filter.targetEnabled2(card, player, target)) return false;
return game.hasPlayer(current => {
return player.canUse(card, current) && get.effect(current, card, player, player) > 0 && current != target && get.effect(target, card, player, player) > 0;
});
}, "hs")
)
return 0;
} else {
if (
player.countCards("hs", card => {
var info = get.info(card);
if (info.allowMultiple == false) return false;
if (!lib.filter.targetEnabled2(card, player, target)) return false;
return game.hasPlayer(current => {
return player.canUse(card, current) && get.effect(current, card, player, player) > 0 && current != target && get.effect(target, card, player, player) > 0;
});
}) < 3
)
return 0;
}
return get.sgnAttitude(player, target);
},
},
},
subSkill: {
effect: {
charlotte: true,
audio: "clanmingjie",
trigger: { player: "useCard2" },
filter(event, player) {
var card = event.card;
var info = get.info(card);
if (info.allowMultiple == false) return false;
if (event.targets && !info.multitarget) {
return game.filterPlayer().some(current => {
if (!current.hasSkill("clanmingjie_" + player.playerid)) return false;
return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current);
});
}
return false;
},
direct: true,
content() {
"step 0";
player
.chooseTarget(
get.prompt("clanmingjie_effect"),
"令任意【铭戒】目标角色成为" + get.translation(trigger.card) + "的目标",
function (card, player, target) {
var trigger = _status.event.getTrigger();
if (trigger.targets.includes(target) || !target.isIn() || !target.hasSkill("clanmingjie_" + player.playerid)) return false;
return lib.filter.targetEnabled2(trigger.card, player, target) && lib.filter.targetInRange(trigger.card, player, target);
},
[1, Infinity]
)
.set("ai", function (target) {
var player = _status.event.player;
var trigger = _status.event.getTrigger();
return get.effect(target, trigger.card, player, player);
});
("step 1");
if (result.bool) {
var targets = result.targets.sortBySeat();
player.logSkill("clanmingjie_effect", targets);
trigger.targets.addArray(targets);
game.log(targets, "成为了", trigger.card, "的额外目标");
}
},
group: "clanmingjie_targeted",
},
targeted: {
charlotte: true,
trigger: { global: "phaseEnd" },
filter(event, player) {
var cards = player.getStorage("clanmingjie_record").slice();
cards = cards.filterInD("d");
if (!cards.length) return false;
var history = player.getHistory("useSkill", evt => evt.skill == "clanmingjie");
if (history.length) {
var targets = history.reduce((list, evt) => list.addArray(evt.targets), []);
if (event.player != player && targets.includes(event.player)) return true;
}
if (player.actionHistory.length >= 2) {
for (var i = player.actionHistory.length - 2; i >= 0; i--) {
if (!player.actionHistory[i].isMe) continue;
var history2 = player.actionHistory[i].useSkill.filter(evt => evt.skill == "clanmingjie");
if (history2.length) {
var targets2 = history2.reduce((list, evt) => list.addArray(evt.targets), []);
if (targets2.includes(event.player)) return true;
}
break;
}
}
return false;
},
forced: true,
popup: false,
content() {
"step 0";
var cards = player.getStorage("clanmingjie_record").slice();
cards = cards.filterInD("d");
event.cards = cards;
("step 1");
player
.chooseButton(["铭戒:是否使用这些牌?", cards])
.set("filterButton", button => {
return _status.event.player.hasUseTarget(button.link);
})
.set("ai", button => {
return _status.event.player.getUseValue(button.link);
});
("step 2");
if (result.bool) {
var card = result.links[0];
event.cards.remove(card);
player.$gain2(card, false);
game.delayx();
player.chooseUseTarget(card, true);
} else event.finish();
("step 3");
if (
event.cards.filter(card => {
return get.position(card, true) == "d" && player.hasUseTarget(card);
}).length
)
event.goto(1);
},
},
record: {
charlotte: true,
trigger: {
global: ["shaMiss", "eventNeutralized", "useCard1", "phaseAfter"],
},
filter(event, player) {
if (event.name == "useCard") {
return get.suit(event.card) == "spade";
}
if (event.name == "phase") return true;
if (event.type != "card") return false;
return true;
},
silent: true,
forced: true,
content() {
"step 0";
if (trigger.name == "phase") {
delete player.storage.clanmingjie_record;
return;
}
player.markAuto("clanmingjie_record", trigger.cards);
},
},
},
},
//族钟琰
clanguangu: {
audio: 2,
enable: "phaseUse",
usable: 1,
zhuanhuanji: true,
mark: true,
marktext: "☯",
intro: {
content(storage) {
return "转换技。出牌阶段限一次,你可以观看" + (storage ? "一名角色的至多四张手" : "牌堆顶的至多四张") + "牌,然后可以使用其中的一张牌。";
},
},
filter(event, player) {
if (player.storage.clanguangu)
return game.hasPlayer(current => {
return current.countCards("h");
});
return true;
},
chooseButton: {
dialog(event, player) {
var dialog = ui.create.dialog("观骨:选择观看牌堆的牌数", "hidden");
if (player.storage.clanguangu) dialog.forceDirect = true;
return dialog;
},
chooseControl(event, player) {
var list = [1, 2, 3, 4].map(i => {
return get.cnNumber(i, true);
});
list.push("cancel2");
return list;
},
check(button, player) {
var ret;
if (!player.hasSkill("clanxiaoyong")) ret = 4;
else {
var list = [4, 3, 2, 1];
player.getHistory("useCard", evt => {
var len = get.cardNameLength(evt.card);
list.remove(len);
});
if (list.length) ret = list[0];
else ret = 4;
}
return get.cnNumber(ret, true);
},
backup(result, player) {
return {
audio: "clanguangu",
filterCard: () => false,
selectCard: -1,
filterTarget(card, player, target) {
if (player.storage.clanguangu) return true;
return false;
},
selectTarget() {
var player = _status.event.player;
if (player.storage.clanguangu) return 1;
return -1;
},
num: result.index + 1,
content() {
"step 0";
player.changeZhuanhuanji("clanguangu");
if (!targets.length) {
var num = lib.skill.clanguangu_backup.num;
var cards = get.cards(num);
event.cards = cards.slice(0);
while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild);
game.updateRoundNumber();
event.goto(2);
} else {
var ret;
if (!player.hasSkill("clanxiaoyong")) ret = 4;
else {
var list = [4, 3, 2, 1];
player.getHistory("useCard", evt => {
var len = get.cardNameLength(evt.card);
list.remove(len);
});
if (list.length) ret = list[0];
else ret = 4;
}
player
.choosePlayerCard(target, "h", true, [1, 4])
.set("prompt", "观骨:观看" + get.translation(target) + "的至多四张牌")
.set("ai", button => {
if (ui.selected.buttons.length >= _status.event.num) return 0;
return Math.random();
})
.set("num", ret);
}
("step 1");
if (result.bool) {
event.cards = result.links;
} else {
event.finish();
}
("step 2");
var count = cards.length;
event.getParent().viewedCount = count;
player
.chooseButton(["观骨:是否使用其中一张牌?", cards])
.set("filterButton", button => {
var player = _status.event.player;
var card = button.link;
var cardx = {
name: get.name(card, get.owner(card)),
nature: get.nature(card, get.owner(card)),
cards: [card],
};
return player.hasUseTarget(cardx, null, false);
})
.set("ai", button => {
var len = _status.event.len;
var card = button.link;
var fix = 1;
if (get.cardNameLength(card) == len) fix = 2;
return fix * _status.event.player.getUseValue(card);
})
.set(
"len",
(function () {
if (!player.hasSkill("clanxiaoyong")) return 0;
var list = [];
player.getHistory("useCard", evt => {
var len = get.cardNameLength(evt.card);
list.add(len);
});
if (!list.includes(count)) return count;
if (list.length) return list.randomGet();
return 4;
})()
);
("step 3");
if (result.bool) {
var card = result.links[0];
cards.remove(card);
var cardx = {
name: get.name(card, get.owner(card)),
nature: get.nature(card, get.owner(card)),
cards: [card],
};
var next = player.chooseUseTarget(cardx, [card], true, false).set("oncard", card => {
var owner = _status.event.getParent().owner;
if (owner) owner.$throw(card.cards);
});
if (card.name === cardx.name && get.is.sameNature(card, cardx, true)) next.viewAs = false;
var owner = get.owner(card);
if (owner != player && get.position(card) == "h") {
next.throw = false;
next.set("owner", owner);
}
}
},
ai: {
order: 10,
result: {
target(player, target) {
return -Math.min(target.countCards("h"), 4) / 2;
},
},
},
};
},
prompt(result, player) {
if (!player.storage.clanguangu) return "点击“确定”以观看牌堆顶牌";
return "观骨:选择观看牌的目标";
},
},
subSkill: {
backup: {},
},
ai: {
order: 10,
result: {
player: 1,
},
},
},
clanxiaoyong: {
audio: 2,
trigger: {
player: "useCard",
},
filter(event, player) {
var len = get.cardNameLength(event.card);
if (
player.hasHistory(
"useCard",
function (evt) {
return evt != event && get.cardNameLength(evt.card) == len;
},
event
)
)
return false;
if (!player.getStat().skill.clanguangu) return false;
var history = player
.getAllHistory("useSkill", evt => {
return evt.skill == "clanguangu_backup";
})
.map(evt => evt.event);
if (!history.length) return false;
var num = 0;
for (var i = history.length - 1; i >= 0; i--) {
var evt = history[i];
if (evt.viewedCount) {
num = evt.viewedCount;
break;
}
}
if (num && len == num) return true;
return false;
},
forced: true,
content() {
"step 0";
delete player.getStat().skill.clanguangu;
game.log(player, "重置了", "#g【观骨】");
},
ai: {
combo: "clanguangu",
},
mod: {
aiOrder(player, card, num) {
if (!player.hasSkill("clanguangu") || !player.getStat().skill.clanguangu) return;
var history = player
.getAllHistory("useSkill", evt => {
return evt.skill == "clanguangu_backup";
})
.map(evt => evt.event);
if (!history.length) return;
var numx = 0;
for (var i = history.length - 1; i >= 0; i--) {
var evt = history[i];
if (evt.viewedCount) {
numx = evt.viewedCount;
break;
}
}
if (numx == get.cardNameLength(card)) {
if (
!player.hasHistory("useCard", evt => {
return numx == get.cardNameLength(evt.card);
})
) {
return num + 9;
}
}
},
},
},
clanbaozu: {
audio: 2,
audioname: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu"],
trigger: { global: "dying" },
clanSkill: true,
limited: true,
skillAnimation: true,
animationColor: "water",
filter(event, player) {
return (event.player == player || event.player.hasClan("颍川钟氏")) && event.player.hp <= 0 && !event.player.isLinked();
},
logTarget: "player",
check(event, player) {
return lib.skill.wanlan.check(event, player);
},
content() {
"step 0";
player.awakenSkill("clanbaozu");
("step 1");
trigger.player.link(true);
trigger.player.recover();
},
},
//族王淩
clanbolong: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter(event, player) {
return player.countCards("he") > 0;
},
filterTarget: lib.filter.notMe,
content() {
"step 0";
var num = player.countCards("h");
var str = "是否交给其" + get.cnNumber(num) + "张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。";
if (!num || target.countCards("he") < num) event._result = { bool: false };
else
target
.chooseCard(get.translation(player) + "对你发动了【驳龙】", str, num, "he")
.set("ai", card => {
if (_status.event.canGive) return 5 + Math.max(0, 3 - _status.event.player.hp) / 1.5 - get.value(card);
return 0;
})
.set(
"canGive",
(function () {
if (get.attitude(target, player) > 1) return true;
if (!player.hasSha() && player.countCards("h") <= 4) return true;
var sha = {
name: "sha",
nature: "thunder",
isCard: true,
};
if (
game.hasPlayer(current => {
return player.canUse(sha, current, true, true) && get.effect(current, sha, player, target) < 0 && !current.countCards("hs", ["shan", "caochuan"]);
})
)
return false;
return true;
})()
);
("step 1");
if (result.bool) {
var cards = result.cards;
target.give(cards, player);
if (lib.filter.targetEnabled2({ name: "jiu", isCard: true }, target, player)) target.useCard({ name: "jiu", isCard: true }, player, false);
event.finish();
} else {
player.chooseCard("驳龙:交给" + get.translation(target) + "一张牌", get.translation(target) + "拒绝给牌,请交给其一张牌然后视为对其使用一张雷【杀】", true, "he");
}
("step 2");
if (result.bool) {
var cards = result.cards;
player.give(cards, target);
var sha = {
name: "sha",
nature: "thunder",
isCard: true,
};
if (player.canUse(sha, target, false, false)) player.useCard(sha, target, false);
}
},
ai: {
order(item, player) {
return get.order({ name: "jiu" }) + 0.01;
},
threaten: 2,
result: {
target(player, target) {
if (
player.hasCard(card => {
return get.value(card) < 5 && !["shan", "tao", "jiu", "wuxie", "caochuan"].includes(get.name(card));
}, "he")
)
return -1;
return 0;
},
},
},
},
clanzhongliu: {
audio: 2,
audioname: ["clan_wangling", "clan_wangyun", "clan_wanghun", "clan_wanglun", "clan_wangguang", "clan_wangmingshan"],
trigger: { player: "useCard" },
forced: true,
clanSkill: true,
filter(event, player) {
if (!event.cards.length) return true;
return !game.hasPlayer2(current => {
if (!current.hasClan("太原王氏") && current != player) return false;
return current.hasHistory("lose", evt => {
return evt.getParent() == event && evt.hs.length > 0;
});
});
},
content() {
"step 0";
var skills = player.getStockSkills(true, true);
game.expandSkills(skills);
var resetSkills = [];
var suffixs = ["used", "round", "block", "blocker"];
for (var skill of skills) {
var info = get.info(skill);
if (typeof info.usable == "number") {
if (player.hasSkill("counttrigger") && player.storage.counttrigger[skill] && player.storage.counttrigger[skill] >= 1) {
delete player.storage.counttrigger[skill];
resetSkills.add(skill);
}
if (typeof get.skillCount(skill) == "number" && get.skillCount(skill) >= 1) {
delete player.getStat("skill")[skill];
resetSkills.add(skill);
}
}
if (info.round && player.storage[skill + "_roundcount"]) {
delete player.storage[skill + "_roundcount"];
resetSkills.add(skill);
}
if (player.storage[`temp_ban_${skill}`]) {
delete player.storage[`temp_ban_${skill}`];
}
if (player.awakenedSkills.includes(skill)) {
player.restoreSkill(skill);
resetSkills.add(skill);
}
for (var suffix of suffixs) {
if (player.hasSkill(skill + "_" + suffix)) {
player.removeSkill(skill + "_" + suffix);
resetSkills.add(skill);
}
}
}
if (resetSkills.length) {
var str = "";
for (var i of resetSkills) {
str += "【" + get.translation(i) + "】、";
}
game.log(player, "重置了技能", "#g" + str.slice(0, -1));
}
},
},
//族吴匡
clanlianzhu: {
audio: 2,
zhuanhuanji: true,
mark: true,
marktext: "☯",
intro: {
content(storage) {
var str = "转换技。每名角色A的出牌阶段限一次。";
if (!storage) str += "A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1。";
else str += "A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1";
return str;
},
},
global: "clanlianzhu_global",
subSkill: {
global: {
forceaudio: true,
audio: "clanlianzhu",
enable: "phaseUse",
filter: (event, player) => game.hasPlayer(current => lib.skill.clanlianzhu_global.filterTarget(null, player, current)),
filterCard: (card, player) => game.hasPlayer(current => current.hasSkill("clanlianzhu") && !current.hasSkill("clanlianzhu_targeted") && !current.storage.clanlianzhu) && player.canRecast(card),
selectCard: [0, 1],
check(card) {
return 5 - get.value(card);
},
filterTarget(card, player, target) {
return (
target.hasSkill("clanlianzhu") &&
!target.hasSkill("clanlianzhu_targeted") &&
(!target.storage.clanlianzhu ||
(target.storage.clanlianzhu &&
game.hasPlayer(current => {
if (current == player || current == target) return false;
return current.inRangeOf(player) || current.inRangeOf(target);
})))
);
},
selectTarget() {
var player = _status.event.player;
var count = game.countPlayer(current => lib.skill.clanlianzhu_global.filterTarget(null, player, current));
return count == 1 ? -1 : 1;
},
filterOk() {
var target = ui.selected.targets[0];
if (!target) return false;
if (!target.storage.clanlianzhu) {
return ui.selected.cards.length == 1;
}
return ui.selected.cards.length == 0;
},
position: "he",
discard: false,
lose: false,
delay: false,
prompt() {
var player = _status.event.player;
var bocchi = [],
kita = [];
game.countPlayer(function (target) {
if (target.hasSkill("clanlianzhu") && !target.hasSkill("clanlianzhu_targeted")) {
if (target.storage.clanlianzhu) {
if (
game.hasPlayer(current => {
if (current == player || current == target) return false;
return current.inRangeOf(player) || current.inRangeOf(target);
})
)
kita.add(target);
} else {
if (player.countCards("he") > 0) bocchi.add(target);
}
}
});
bocchi.sortBySeat();
kita.sortBySeat();
var str = "";
if (bocchi.length) {
str += "重铸一张牌,然后令";
bocchi.forEach((current, i) => {
str += get.translation(current);
if (i < bocchi.length - 1) str += "或";
});
str += "选择是否重铸一张牌";
if (kita.length) str += "。<br>或者";
}
if (kita.length) {
str += "令";
kita.forEach((current, i) => {
str += get.translation(current);
if (i < kita.length - 1) str += "或";
});
str += "选择一名目标,然后对其进行集火";
}
str += "。";
return str;
},
content() {
"step 0";
target.addTempSkill("clanlianzhu_targeted", "phaseUseAfter");
if (target.storage.clanlianzhu) event.goto(4);
target.changeZhuanhuanji("clanlianzhu");
("step 1");
player.recast(cards);
("step 2");
if (!target.countCards("he") && !_status.connectMode) event._result = { bool: false };
else target.chooseCard("he", "联诛:是否重铸一张牌?", lib.filter.cardRecastable);
("step 3");
if (result.bool) {
target.recast(result.cards);
if (get.color(cards[0]) === get.color(result.cards[0])) lib.skill.chenliuwushi.change(target, 1);
}
event.finish();
("step 4");
target
.chooseTarget("联诛:选择其与你使用【杀】的目标", true, (card, player, target) => {
if (target == player || target == _status.event.sourcex) return false;
return target.inRangeOf(player) || target.inRangeOf(_status.event.sourcex);
})
.set("ai", target => {
return get.effect(target, { name: "sha" }, _status.event.player, _status.event.player);
})
.set("sourcex", player);
("step 5");
if (result.bool) {
var targetx = result.targets[0];
event.targetx = targetx;
target.line(targetx);
event.targets = [player, target];
event.cards = [];
if (!event.isMine() && !event.isOnline()) game.delayx();
} else event.finish();
("step 6");
var current = targets.shift();
current
.chooseToUse(function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
}, "联诛:是否对" + get.translation(event.targetx) + "使用一张杀?")
.set("targetRequired", true)
.set("complexSelect", true)
.set("filterTarget", function (card, player, target) {
if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false;
return lib.filter.targetEnabled.apply(this, arguments);
})
.set("sourcex", event.targetx)
.set("addCount", false);
("step 7");
if (result.bool) cards.push(result.card);
if (targets.length > 0) event.goto(6);
("step 8");
if (cards.length > 1) {
const color = get.color(cards[0], false);
if (color != "none") {
for (let i = 1; i < cards.length; i++) {
const color2 = get.color(cards[i], false);
if (color !== color2 && color2 !== "none") {
lib.skill.chenliuwushi.change(target, -1);
break;
}
}
}
}
},
ai: {
order: 4.1,
result: {
player(player, target) {
if (!target.storage.clanlianzhu && player.hasCard(card => get.value(card) < 5, "he")) return 1;
return 0;
},
target(player, target) {
if (target.storage.clanlianzhu && player.hasSha()) return 1;
return 0;
},
},
},
},
targeted: { charlotte: true },
},
},
//族韩韶
clanfangzhen: {
audio: 2,
trigger: { player: "phaseUseBegin" },
filter(event, player) {
return game.hasPlayer(current => !current.isLinked());
},
direct: true,
content() {
"step 0";
player
.chooseTarget(get.prompt2("clanfangzhen"), (card, player, target) => {
return !target.isLinked();
})
.set("ai", target => {
var player = _status.event.player;
if (_status.event.goon && target != player) {
target.classList.add("linked");
target.classList.add("linked2");
try {
var cards = player.getCards("hs", cardx => {
if (get.name(cardx) != "sha") return false;
return game.hasNature(cardx, "linked");
});
cards.map(i => [i, get.effect(target, i, player, player)]);
cards.sort((a, b) => b[1] - a[1]);
} catch (e) {
target.classList.remove("linked");
target.classList.remove("linked2");
}
target.classList.remove("linked");
target.classList.remove("linked2");
var eff = cards[0][1];
if (eff > 0) return eff;
return Math.max(2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player));
}
return Math.max(2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player), get.recoverEffect(target, player, player));
})
.set(
"goon",
player.countCards("hs", card => {
return get.name(card) == "jiu" && player.hasUseTarget(card);
}) &&
player.countCards("hs", card => {
if (get.name(card) != "sha") return false;
return game.hasNature(card, "linked");
})
);
("step 1");
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("clanfangzhen", target);
player.addSkill("clanfangzhen_remove");
player.markAuto("clanfangzhen_remove", [target.getSeatNum()]);
target.link(true);
var choices = ["选项一"],
choiceList = ["摸两张牌,然后交给" + get.translation(target) + "两张牌", "令" + get.translation(target) + "回复1点体力"];
if (target.isDamaged()) choices.push("选项二");
else choiceList[1] = '<span style="opacity:0.5; ">' + choiceList[1] + "</span>";
player
.chooseControl(choices)
.set("prompt", "放赈:请选择一项")
.set("choiceList", choiceList)
.set("ai", () => {
var player = _status.event.player,
target = _status.event.getParent().target;
if (!target.isDamaged()) return 0;
if (get.attitude(player, target) <= 0 && player.countCards("he", card => get.value(card) < 0) >= 2) return 0;
return 2 * get.effect(target, { name: "draw" }, player, player) + 0.6 * get.effect(player, { name: "draw" }, player, player) > get.recoverEffect(target, player, player) ? 0 : 1;
});
} else event.finish();
("step 2");
if (result.control == "选项一") {
player.draw(2);
if (player == target) event.finish();
} else {
target.recover();
event.finish();
}
("step 3");
if (!player.countCards("he")) event.finish();
else if (player.countCards("he") <= 2)
event._result = {
bool: true,
cards: player.getCards("he"),
};
else {
player.chooseCard("放赈:交给" + get.translation(target) + "两张牌", "he", 2, true);
}
("step 4");
if (result.bool) {
player.give(result.cards, target);
}
},
ai: {
expose: 0.2,
},
subSkill: {
remove: {
trigger: { global: "roundStart" },
onremove: true,
forced: true,
locked: false,
charlotte: true,
filter(event, player) {
return player.getStorage("clanfangzhen_remove").includes(game.roundNumber);
},
content() {
player.removeSkills("clanfangzhen");
},
},
},
},
clanliuju: {
audio: 2,
trigger: { player: "phaseUseEnd" },
filter(event, player) {
return game.hasPlayer(current => player.canCompare(current));
},
direct: true,
content() {
"step 0";
player
.chooseTarget(get.prompt("clanliuju"), "与一名其他角色拼点,输的角色可以使用任意张拼点牌中的非基本牌", (card, player, target) => {
return player.canCompare(target);
})
.set("ai", target => {
var player = _status.event.player;
var ts = target.getCards("h").sort((a, b) => get.number(a) - get.number(b));
if (get.attitude(player, target) < 0) {
var hs = player.getCards("h").sort((a, b) => get.number(a) - get.number(b));
if (!hs.length || !ts.length) return 0;
if (get.type(hs[0], null, false) == "basic" && get.value(hs[0]) > 6) return 0;
if (get.number(hs[0]) < get.number(ts[0]) || get.type(hs[0], null, false) == "basic") return 1;
return Math.random() - 0.7;
}
return get.type(ts[0]) != "basic";
});
("step 1");
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("clanliuju", target);
player.chooseToCompare(target).set("small", true);
} else event.finish();
("step 2");
if (!result.tie) {
var loser = result.bool ? target : player;
var cards = [];
game.getGlobalHistory("cardMove", evt => {
if (evt.getParent(2) == event)
cards.addArray(
evt.cards.filter(i => {
return get.position(i, true) == "d" && get.type(i, null, false) != "basic";
})
);
});
event.loser = loser;
event.distance = [get.distance(player, target), get.distance(target, player)];
if (cards.length) event.cards = cards;
else event.finish();
} else event.finish();
("step 3");
var cardsx = cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i));
if (!cardsx.length) event.goto(6);
else
event.loser
.chooseButton(["留驹:是否使用其中的一张牌?", cardsx])
.set("filterButton", button => {
return _status.event.player.hasUseTarget(button.link);
})
.set("ai", button => {
return _status.event.player.getUseValue(button.link) + 0.1;
});
("step 4");
if (result.bool) {
var card = result.links[0];
event.cards.remove(card);
event.loser.$gain2(card, false);
game.delayx();
event.loser.chooseUseTarget(true, card, false);
} else event.goto(6);
("step 5");
if (cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)).length) event.goto(3);
("step 6");
if (get.distance(player, target) != event.distance[0] || get.distance(target, player) != event.distance[1]) {
player.restoreSkill("clanxumin");
game.log(player, "重置了", "#g【恤民】");
}
},
},
clanxumin: {
audio: 2,
audioname: ["clan_hanshao", "clan_hanrong"],
enable: "phaseUse",
viewAs: { name: "wugu" },
filterCard: true,
filterTarget(card, player, target) {
if (player == target) return false;
return player.canUse(card, target);
},
selectTarget: [1, Infinity],
check(card) {
return 6 - get.value(card);
},
position: "he",
limited: true,
clanSkill: true,
skillAnimation: true,
animationColor: "soil",
precontent() {
player.logSkill("clanxumin");
player.awakenSkill("clanxumin");
delete event.result.skill;
},
ai: {
order: 7,
result: { target: 1 },
},
},
//族韩融
//我们连和!(?)
clanlianhe: {
audio: 2,
trigger: { player: "phaseUseBegin" },
filter(event, player) {
return game.hasPlayer(current => !current.isLinked());
},
direct: true,
content() {
"step 0";
player
.chooseTarget(get.prompt2("clanlianhe"), 2, (card, player, target) => {
return !target.isLinked();
})
.set("ai", target => {
var att = get.attitude(_status.event.player, target);
if (att > 0) att /= 1.2;
return Math.abs(att);
});
("step 1");
if (result.bool) {
var targets = result.targets.sortBySeat();
targets.forEach(i => i.link(true));
player.logSkill("clanlianhe", targets);
player.addSkill("clanlianhe_effect");
player.markAuto("clanlianhe_effect", targets);
}
},
subSkill: {
effect: {
trigger: { global: ["phaseUseEnd", "die"] },
charlotte: true,
forced: true,
locked: false,
popup: false,
onremove: true,
filter(event, player) {
return player.getStorage("clanlianhe_effect").includes(event.player);
},
marktext: "连",
intro: { content: "已选择目标:$" },
content() {
"step 0";
player.unmarkAuto("clanlianhe_effect", [trigger.player]);
if (trigger.name == "die") event.finish();
("step 1");
if (
trigger.player.hasHistory("gain", evt => {
return evt.getParent().name == "draw" && evt.getParent("phaseUse") == trigger;
})
)
event.finish();
else {
player.logSkill("clanlianhe_effect", trigger.player);
var num = 0;
trigger.player.getHistory("gain", evt => {
if (evt.getParent("phaseUse") != trigger) return false;
num += evt.cards.length;
});
num = Math.min(num, 3);
event.num = num;
if (num <= 1) event._result = { bool: false };
else {
var pos = player == trigger.player ? "e" : "he";
trigger.player
.chooseCard("连和:交给" + get.translation(player) + get.cnNumber(num - 1) + "张牌,或点“取消”令其摸" + get.cnNumber(num + 1) + "张牌", num - 1, pos)
.set("ai", card => {
if (_status.event.draw) return 0;
return 5 - get.value(card);
})
.set("draw", get.attitude(trigger.player, player) >= 0);
}
}
("step 2");
if (result.bool) {
trigger.player.give(result.cards, player);
} else player.draw(num + 1);
},
},
},
},
clanhuanjia: {
audio: 2,
trigger: { player: "phaseUseEnd" },
filter(event, player) {
return game.hasPlayer(current => player.canCompare(current));
},
direct: true,
content() {
"step 0";
player
.chooseTarget(get.prompt("clanhuanjia"), "与一名其他角色拼点,赢的角色可以使用一张拼点牌。若此牌未造成过伤害,你获得另一张拼点牌,否则你失去一个技能", (card, player, target) => {
return player.canCompare(target);
})
.set("ai", target => {
var player = _status.event.player;
if (get.attitude(player, target) <= 0) {
var hs = player.getCards("h").sort((a, b) => get.number(b) - get.number(a));
var ts = target.getCards("h").sort((a, b) => get.number(b) - get.number(a));
if (!hs.length || !ts.length) return 0;
if (get.number(hs[0]) > get.number(ts[0]) && !get.tag(hs[0], "damage") && player.hasValueTarget(hs[0])) return 1;
return Math.random() - 0.4;
}
return 0;
});
("step 1");
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("clanhuanjia", target);
player.chooseToCompare(target);
} else event.finish();
("step 2");
if (!result.tie) {
var winner = result.bool ? player : target;
var cards = [];
game.getGlobalHistory("cardMove", evt => {
if (evt.getParent(3) == event) cards.addArray(evt.cards.filterInD("d"));
});
event.winner = winner;
if (cards.length) event.cards = cards;
else event.finish();
} else event.finish();
("step 3");
var cardsx = cards.filter(i => get.position(i, true) == "d" && event.winner.hasUseTarget(i));
if (!cardsx.length) event.goto(6);
else
event.winner
.chooseButton(["缓颊:是否使用其中的一张牌?", cardsx])
.set("filterButton", button => {
return _status.event.player.hasUseTarget(button.link);
})
.set("ai", button => {
var damage = 1;
if (_status.event.att > 2 && get.tag(button.link, "damage")) damage *= 2;
return _status.event.player.getUseValue(button.link) * damage + 0.1;
})
.set("att", get.attitude(event.winner, player));
("step 4");
if (result.bool) {
var card = result.links[0];
event.card = card;
event.cards.remove(card);
event.winner.$gain2(card, false);
game.delayx();
event.winner.chooseUseTarget(true, card, false);
}
("step 5");
if (
game.hasPlayer2(current => {
return current.hasHistory("sourceDamage", evt => evt.cards && evt.cards[0] == card);
})
) {
var skills = player.getSkills(null, false, false).filter(skill => {
var info = get.info(skill);
if (!info || get.is.empty(info) || info.charlotte) return false;
return true;
});
player
.chooseControl(skills)
.set(
"choiceList",
skills.map(i => {
return '<div class="skill">【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】</div><div>" + get.skillInfoTranslation(i, player) + "</div>";
})
)
.set("displayIndex", false)
.set("prompt", "恤民:失去一个技能")
.set("ai", () => {
var choices = _status.event.controls.slice();
var value = skill => get.skillRank(skill, "in") + get.skillRank(skill, "out");
choices = choices.map(skill => [skill, value(skill)]);
var list = choices.sort((a, b) => a[1] - b[1])[0];
if (list[1] < 2) return list[0];
else {
if (_status.event.controls.includes("clanxumin")) return "clanxumin";
return list[0];
}
});
} else {
player.gain(cards, "gain2");
event.finish();
}
("step 6");
player.removeSkills(result.control);
},
ai: {
expose: 0.1,
},
},
//族荀谌
clansankuang: {
audio: 2,
trigger: { player: "useCardAfter" },
direct: true,
forced: true,
filter(event, player) {
if (!game.hasPlayer(current => current != player)) return false;
const type = get.type2(event.card);
return player.getRoundHistory("useCard", evt => get.type2(evt.card) == type).indexOf(event) == 0;
},
getNum(player) {
return (player.countCards("ej") > 0) + player.isDamaged() + (Math.max(0, player.hp) < player.countCards("h"));
},
content() {
"step 0";
var cards = trigger.cards.filterInD("oe");
player
.chooseTarget("三恇:选择一名其他角色", "令其交给你至少X张牌" + (cards.length ? ",然后其获得" + get.translation(cards) : "") + "X为以下条件中其满足的项数场上有牌、已受伤、体力值小于手牌数", true, lib.filter.notMe)
.set("ai", target => {
var att = get.attitude(player, target),
num = lib.skill.clansankuang.getNum(target);
if (num == 0) return att;
if (_status.event.goon) return -att;
return -Math.sqrt(Math.abs(att)) - lib.skill.clansankuang.getNum(target);
})
.set(
"goon",
Math.max.apply(
Math,
trigger.cards.map(i => get.value(i))
) <= 5 || trigger.cards.filterInD("oe").length == 0
);
("step 1");
if (result.bool) {
var target = result.targets[0],
num = lib.skill.clansankuang.getNum(target),
num2 = target.countCards("he");
event.target = target;
player.logSkill("clansankuang", target);
if (num2 == 0) event._result = { bool: false };
else if (num2 <= num)
event._result = {
bool: true,
cards: target.getCards("he"),
};
else {
var cards = trigger.cards.filterInD("oe");
target
.chooseCard("he", num > 0, [num, Infinity])
.set("ai", get.unuseful)
.set("prompt", num > 0 ? "是否交给" + get.translation(player) + "任意张牌" + (cards.length ? "并获得" + get.translation(cards) : "") + "" : "交给" + get.translation(player) + "至少" + get.cnNumber(num) + "张牌");
}
} else event.finish();
("step 2");
if (result.bool) {
var cards = result.cards;
target.give(cards, player);
game.delayx();
} else event.finish();
("step 3");
if (trigger.cards.filterInD().length) target.gain(trigger.cards.filterInD(), "gain2", "bySelf");
else if (trigger.cards.filterInD("e").length) target.gain(trigger.cards.filterInD("e"), get.owner(trigger.cards.filterInD("e")[0]), "give");
},
ai: {
reverseOrder: true,
skillTagFilter(player) {
if (player.getHistory("useCard", evt => get.type(evt.card) == "equip").length > 0) return false;
},
effect: {
target(card, player, target) {
if (player == target && get.type(card) == "equip" && !player.getHistory("useCard", evt => get.type(evt.card) == "equip").length == 0) return [1, 3];
},
},
threaten: 1.6,
},
},
clanbeishi: {
audio: 2,
trigger: {
global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
},
forced: true,
filter(event, player) {
var history = player.getAllHistory("useSkill", evt => evt.skill == "clansankuang");
if (!history.length) return false;
var target = history[0].targets[0];
if (target.countCards("h")) return false;
var evt = event.getl(target);
return evt && evt.hs && evt.hs.length;
},
content() {
player.recover();
},
ai: {
combo: "clansankuang",
},
},
//族荀淑
clanshenjun: {
audio: 2,
trigger: {
global: "useCard",
},
forced: true,
locked: false,
filter(event, player) {
return (event.card.name == "sha" || get.type(event.card) == "trick") && player.countCards("h", event.card.name) > 0;
},
content() {
var cards = player.getCards("h", trigger.card.name);
player.showCards(cards, get.translation(player) + "发动了【神君】");
player.markSkill("clanshenjun");
player.addGaintag(cards, "clanshenjun");
for (var name of lib.phaseName) {
var evt = _status.event.getParent(name);
if (!evt || evt.name != name) continue;
player.addTempSkill("clanshenjun_viewAs", name + "After");
break;
}
},
marktext: "君",
intro: {
markcount(storage, player) {
return player.countCards("h", card => card.hasGaintag("clanshenjun"));
},
mark(dialog, content, player) {
var cards = player.getCards("h", card => card.hasGaintag("clanshenjun"));
if (cards.length) {
dialog.addAuto(cards);
} else return "无展示牌";
},
},
subSkill: {
viewAs: {
trigger: {
global: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"],
},
filter(event, player) {
return player.countCards("h", card => card.hasGaintag("clanshenjun")) > 0;
},
forced: true,
charlotte: true,
content() {
"step 0";
var cards = player.getCards("h", card => card.hasGaintag("clanshenjun"));
var list = [],
names = [];
for (var card of cards) {
var name = get.name(card),
nature = get.nature(card);
var namex = name;
if (nature && nature.length) {
namex += nature;
if (names.includes(namex)) continue;
list.push([get.type(card), "", name, nature]);
} else {
if (names.includes(namex)) continue;
list.push([get.type(card), "", name]);
}
names.push(namex);
}
list.sort((a, b) => {
var del1 = lib.inpile.indexOf(a[2]) - lib.inpile.indexOf(b[2]);
if (del1 != 0) return del1;
var a1 = 0,
b1 = 0;
if (a.length > 3) a1 = lib.nature.get(a) || 0;
if (b.length > 3) b1 = lib.nature.get(b) || 0;
return a1 - b1;
});
player.chooseButton(["是否将" + get.cnNumber(cards.length) + "张牌当下列一张牌使用?", [list, "vcard"]]).set("ai", function (button) {
return _status.event.player.getUseValue({
name: button.link[2],
nature: button.link[3],
});
});
("step 1");
if (result.bool) {
var name = result.links[0][2],
nature = result.links[0][3];
var cards = player.getCards("h", card => card.hasGaintag("clanshenjun"));
game.broadcastAll(
function (num, card) {
lib.skill.clanshenjun_backup.selectCard = num;
lib.skill.clanshenjun_backup.viewAs = card;
},
cards.length,
{ name: name, nature: nature }
);
var next = player.chooseToUse();
next.set("openskilldialog", "将" + get.cnNumber(cards.length) + "张牌当做" + (get.translation(nature) || "") + "【" + get.translation(name) + "】使用");
next.set("norestore", true);
next.set("addCount", false);
next.set("_backupevent", "clanshenjun_backup");
next.set("custom", {
add: {},
replace: { window() {} },
});
next.backup("clanshenjun_backup");
}
},
},
backup: {
filterCard(card) {
return get.itemtype(card) == "card";
},
position: "hes",
filterTarget: lib.filter.filterTarget,
check: card => 6 - get.value(card),
log: false,
precontent() {
delete event.result.skill;
},
},
},
},
clanbalong: {
audio: 2,
trigger: {
player: ["damageEnd", "recoverEnd", "loseHpEnd"],
},
forced: true,
filter(event, player) {
if (game.getGlobalHistory("changeHp", evt => evt.player == player).length != 1) return false;
var cards = player.getCards("h"),
map = {};
if (!cards.length) return false;
for (var card of cards) {
var type = get.type2(card);
if (typeof map[type] != "number") map[type] = 0;
map[type]++;
}
var list = [];
for (var i in map) {
if (map[i] > 0) list.push([i, map[i]]);
}
list.sort((a, b) => b[1] - a[1]);
return list[0][0] == "trick" && (list.length == 1 || list[0][1] > list[1][1]);
},
content() {
player.showHandcards(get.translation(player) + "发动了【八龙】");
player.drawTo(game.countPlayer());
},
},
//族荀粲
clanyunshen: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget(card, player, target) {
return player != target && target.isDamaged();
},
content() {
"step 0";
target.recover();
("step 1");
var name = get.translation(target);
player
.chooseControl()
.set("choiceList", [name + "视为对你使用一张冰【杀】", "你视为对" + name + "使用一张冰【杀】"])
.set("prompt", "熨身:请选择一项")
.set("ai", () => _status.event.choice)
.set(
"choice",
(function () {
var card = {
name: "sha",
nature: "ice",
isCard: true,
};
var eff = get.effect(player, card, target, player),
eff2 = get.effect(target, card, player, player);
if (eff > eff2) return "选项一";
else return "选项二";
})()
);
("step 2");
var players = [target, player];
if (result.control == "选项二") players.reverse();
var card = { name: "sha", nature: "ice", isCard: true };
if (players[0].canUse(card, players[1], false)) players[0].useCard(card, players[1], false, "noai");
},
ai: {
order: 2,
expose: 0.2,
result: {
target(player, target) {
var eff = get.recoverEffect(target, player, player);
if (eff > 0) return 1;
else if (
get.effect(
target,
{
name: "sha",
nature: "ice",
isCard: true,
},
player,
player
) > eff
)
return -1;
return 0;
},
},
},
},
clanshangshen: {
audio: 2,
trigger: { global: "damageEnd" },
filter(event, player) {
if (!event.hasNature() || !event.player.isIn()) return false;
return (
game.countPlayer2(current => {
return current.hasHistory("damage", evt => {
return evt.hasNature() && evt != event;
});
}) == 0
);
},
logTarget: "player",
check(event, player) {
if (get.attitude(player, event.player) <= 2) return false;
if (event.player.countCards("h") >= 4) return false;
return true;
},
content() {
player.executeDelayCardEffect("shandian");
trigger.player.drawTo(4);
},
ai: { expose: 0.25 },
},
clanfenchai: {
audio: 2,
init(player) {
if (player.getStorage("clanfenchai").length > 0) return;
var history = player.getHistory("useSkill", evt => {
if (evt.type != "player") return false;
var skill = evt.sourceSkill || evt.skill,
targets = evt.targets;
var info = get.info(skill);
if (!info || info.charlotte) return false;
if (targets && targets.length) {
if (targets.filter(i => player.differentSexFrom(i)).length > 0) return true;
}
return false;
});
if (history.length) {
var evt = history[0],
targets = evt.targets;
player.markAuto(
"clanfenchai",
targets.filter(i => player.differentSexFrom(i))
);
}
},
trigger: {
player: ["logSkill", "useSkillAfter"],
},
forced: true,
silent: true,
onremove: true,
marktext: "钗",
intro: {
content: (storage, player) => "对象:" + get.translation(storage),
},
group: "clanfenchai_audio",
filter(event, player) {
if (event.type != "player") return false;
var targets = event.targets;
if (!targets || !targets.length) return false;
var info = get.info(event.sourceSkill || event.skill);
if (!info || info.charlotte) return false;
if (player.getStorage("clanfenchai").length != 0) return false;
return targets.filter(i => player.differentSexFrom(i)).length > 0;
},
content() {
player.markAuto(
"clanfenchai",
trigger.targets.filter(i => player.differentSexFrom(i))
);
},
subSkill: {
audio: {
audio: "clanfenchai",
forced: true,
trigger: { player: "judge" },
filter(event, player) {
return player.getStorage("clanfenchai").length;
},
content() {},
},
},
mod: {
suit(card, suit) {
var player = get.owner(card) || _status.event.player;
if (!player || !player.judging || player.judging[0] != card) return;
var storage = player.getStorage("clanfenchai");
if (!storage.length) return;
return storage.filter(i => i.isIn()).length > 0 ? "heart" : "spade";
},
},
},
//族荀采
clanlieshi: {
audio: 2,
enable: "phaseUse",
filter(event, player) {
return !player.isDisabledJudge() || player.countCards("h", card => ["sha", "shan"].includes(get.name(card))) > 0;
},
chooseButton: {
dialog(event, player) {
var dialog = ui.create.dialog("烈誓:选择一项", "hidden");
dialog.add([lib.skill.clanlieshi.choices.slice(), "textbutton"]);
return dialog;
},
filter(button, player) {
var link = button.link;
if (link == "damage") return !player.isDisabledJudge();
var num = player.countCards("h", link);
return num > 0 && num == player.getDiscardableCards(player, "h").filter(i => get.name(i) == link).length;
},
check(button) {
var player = _status.event.player;
switch (button.link) {
case "damage":
if (get.damageEffect(player, player, player, "fire") >= 0) return 10;
if (player.hp >= Math.max(2, 3 - player.getFriends().length) && game.countPlayer(current => get.attitude(player, current) < 0 && current.countCards("h", card => ["sha", "shan"].includes(get.name(card))))) return 0.8 + Math.random();
return 0;
case "shan":
if (player.countCards("h", "shan") == 1) return 8 + Math.random();
return 1 + Math.random();
case "sha":
if (player.countCards("h", "sha") == 1) return 8 + Math.random();
return 0.9 + Math.random();
}
},
backup(links) {
var next = get.copy(lib.skill["clanlieshi_backupx"]);
next.choice = links[0];
return next;
},
prompt(links) {
if (links[0] == "damage") return "废除判定区并受到1点火焰伤害";
return "弃置所有【" + get.translation(links[0]) + "】";
},
},
choices: [
["damage", "废除判定区并受到1点火焰伤害"],
["shan", "弃置所有【闪】"],
["sha", "弃置所有【杀】"],
],
ai: {
order(item, player) {
if (!player) return;
var eff = get.damageEffect(player, player, player, "fire"),
disabled = !player.isDisabledJudge();
if ((player.countCards("h", "sha") == 1 || player.countCards("h", "shan") == 1) && eff < 0 && !disabled) return 8;
else if (eff >= 0 && !disabled) return 5.8;
if (!disabled && !player.countCards("h", card => ["sha", "shan"].includes(get.name(card)))) {
if ((!player.hasSkill("clanhuanyin") || !player.canSave(player)) && player.hp <= 1) return 0;
if (player.canSave(player) && player.hp == 1 && player.countCards("h") <= 1) return 2.6;
if (player.hp < Math.max(2, 3 - player.getFriends().length) || !game.countPlayer(current => get.attitude(player, current) < 0 && current.countCards("h", card => ["sha", "shan"].includes(get.name(card))))) return 0;
}
return 2.5;
},
expose: 0.2,
result: { player: 1 },
},
subSkill: {
backup: {},
backupx: {
audio: "clanlieshi",
selectCard: -1,
selectTarget: -1,
filterCard: () => false,
filterTarget: () => false,
multitarget: true,
content() {
"step 0";
var choice = lib.skill.clanlieshi_backup.choice;
event.choice = choice;
if (choice == "damage") {
player.damage("fire");
if (!player.isDisabledJudge()) player.disableJudge();
} else {
var cards = player.getCards("h", choice);
if (cards.length) player.discard(cards);
}
("step 1");
if (!player.isIn() || !game.hasPlayer(current => current != player)) event.finish();
else
player.chooseTarget("烈誓:令一名其他角色选择另一项", lib.filter.notMe, true).set("ai", target => {
var player = _status.event.player,
chosen = _status.event.getParent().choice,
att = get.attitude(player, target);
if (chosen == "damage") {
if (att > 0) return 0;
return -att / 2 + target.countCards("h", card => ["sha", "shan"].includes(get.name(card)));
}
return get.damageEffect(target, player, player, "fire");
});
("step 2");
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.line(target, "fire");
var list = [],
choice = event.choice;
var choiceList = lib.skill.clanlieshi.choices.slice();
choiceList = choiceList.map((link, ind, arr) => {
link = link[1];
var ok = true;
if (arr[ind][0] == choice) {
link += "" + get.translation(player) + "已选)";
ok = false;
}
if (ind == 0) {
if (target.isDisabledJudge()) ok = false;
} else if (ind > 0) {
var name = ind == 1 ? "shan" : "sha";
if (!target.countCards("h", name)) ok = false;
}
if (!ok) link = '<span style="opacity:0.5">' + link + "</span>";
else list.push("选项" + get.cnNumber(ind + 1, true));
return link;
});
if (!list.length) {
game.log(target, "没有能执行的选项");
event.finish();
return;
}
target
.chooseControl(list)
.set("choiceList", choiceList)
.set("ai", () => {
var controls = _status.event.controls.slice(),
player = _status.event.player,
user = _status.event.getParent().player;
if (controls.length == 1) return controls[0];
if (controls.includes("选项一") && get.damageEffect(player, user, player, "fire") >= 0) return "选项一";
if (controls.includes("选项一") && player.hp <= 2 && player.countCards("h", card => ["sha", "shan"].includes(get.name(card))) <= 3) controls.remove("选项一");
if (controls.length == 1) return controls[0];
if (player.getCards("h", "sha").reduce((p, c) => p + get.value(c, player), 0) > player.getCards("h", "sha").reduce((p, c) => p + get.value(c, player), 0)) {
if (controls.includes("选项三")) return "选项三";
} else if (controls.includes("选项二")) return "选项二";
return controls.randomGet();
});
} else event.finish();
("step 3");
if (result.control == "选项一") {
if (!target.isDisabledJudge()) target.disableJudge();
target.damage("fire");
} else {
var cards = target.getCards("h", result.control == "选项二" ? "shan" : "sha");
if (cards.length) target.discard(cards);
}
},
},
},
},
clandianzhan: {
audio: 2,
intro: {
content: "已使用过的花色:$",
onunmark: true,
},
trigger: { player: "useCardAfter" },
forced: true,
filter(event, player) {
if (!lib.suit.includes(get.suit(event.card))) return false;
const suit = get.suit(event.card);
if (player.getRoundHistory("useCard", evt => get.suit(evt.card) == suit).indexOf(event) != 0) return false;
return (event.targets && event.targets.length == 1 && !event.targets[0].isLinked()) || player.hasCard(card => get.suit(card) == get.suit(event.card) && player.canRecast(card), "h");
},
content() {
"step 0";
if (trigger.targets && trigger.targets.length == 1 && !trigger.targets[0].isLinked()) {
trigger.targets[0].link(true);
event.link = true;
}
var cards = player.getCards("h", card => get.suit(card) == get.suit(trigger.card) && player.canRecast(card));
if (cards.length > 0) {
player.recast(cards);
event.recast = true;
}
("step 1");
if (event.link && event.recast) player.draw();
},
group: "clandianzhan_count",
subSkill: {
count: {
charlotte: true,
trigger: { player: "useCardAfter" },
filter(event, player) {
let suit = get.suit(event.card);
return lib.suits.includes(suit) && !player.getStorage("clandianzhan").includes(suit);
},
forced: true,
silent: true,
content() {
let suits = player
.getRoundHistory("useCard", evt => {
return lib.suits.includes(get.suit(evt.card));
})
.reduce((list, evt) => {
return list.add(get.suit(evt.card));
}, [])
.sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b));
if (!player.storage.clandianzhan) {
player.when({ global: "roundStart" }).then(() => {
delete player.storage.clandianzhan;
player.unmarkSkill("clandianzhan");
});
}
player.storage.clandianzhan = suits;
player.markSkill("clandianzhan");
},
},
},
init(player) {
let suits = player
.getRoundHistory("useCard", evt => {
return lib.suits.includes(get.suit(evt.card));
})
.reduce((list, evt) => {
return list.add(get.suit(evt.card));
}, [])
.sort((a, b) => lib.suits.indexOf(a) - lib.suits.indexOf(b));
if (suits.length) {
if (!player.storage.clandianzhan) {
player.when({ global: "roundStart" }).then(() => {
delete player.storage.clandianzhan;
player.unmarkSkill("clandianzhan");
});
}
player.storage.clandianzhan = suits;
player.markSkill("clandianzhan");
}
},
},
clanhuanyin: {
audio: 2,
trigger: { player: "dying" },
forced: true,
check: () => true,
filter(event) {
return event.player.countCards("h") < 4;
},
content() {
player.drawTo(4);
},
},
clandaojie: {
audio: 2,
audioname: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou"],
trigger: { player: "useCardAfter" },
filter(event, player) {
return (
get.type(event.card, null, false) == "trick" &&
!get.tag(event.card, "damage") &&
event.cards.filterInD().length > 0 &&
player
.getHistory("useCard", evt => {
return get.type(evt.card, null, false) == "trick" && !get.tag(evt.card, "damage");
})
.indexOf(event) == 0
);
},
forced: true,
clanSkill: true,
content() {
"step 0";
var skills = player.getSkills(null, false, false).filter(skill => {
var info = get.info(skill);
if (!info || info.charlotte || !get.is.locked(skill) || get.skillInfoTranslation(skill, player).length == 0) return false;
return true;
});
player
.chooseControl(skills, "cancel2")
.set(
"choiceList",
skills.map(i => {
return '<div class="skill">【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】</div><div>" + get.skillInfoTranslation(i, player) + "</div>";
})
)
.set("displayIndex", false)
.set("prompt", "蹈节失去一个锁定技或点“取消”失去1点体力")
.set("ai", () => {
var player = _status.event.player,
choices = _status.event.controls.slice();
var negs = choices.filter(i => {
var info = get.info(i);
if (!info || !info.ai) return false;
return info.ai.neg || info.ai.halfneg;
});
if (negs.length) return negs.randomGet();
if (get.effect(player, { name: "losehp" }, player, player) >= 0) return "cancel2";
if (player.hp > 3) return "cancel2";
return Math.random() < 0.75 ? "clandaojie" : choices.randomGet();
});
("step 1");
if (result.control != "cancel2") {
player.removeSkills(result.control);
} else {
player.loseHp();
}
("step 2");
var targets = game.filterPlayer(current => current == player || current.hasClan("颍川荀氏"));
if (targets.length == 1) event._result = { bool: true, targets: targets };
else
player
.chooseTarget("蹈节:将" + get.translation(trigger.cards.filterInD()) + "交给一名颍川荀氏角色", true, (card, player, target) => {
return target == player || target.hasClan("颍川荀氏");
})
.set("ai", target => get.attitude(_status.event.player, target));
("step 3");
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
target.gain(trigger.cards.filterInD(), player, "gain2");
}
},
},
//族吴班
clanzhanding: {
audio: 2,
enable: "chooseToUse",
viewAsFilter(player) {
return player.countCards("hes") > 0;
},
viewAs: { name: "sha" },
filterCard: true,
position: "hes",
selectCard: [1, Infinity],
check(card) {
return 6 - ui.selected.cards.length - get.value(card);
},
onuse(links, player) {
lib.skill.chenliuwushi.change(player, -1);
player.addTempSkill("clanzhanding_effect");
},
ai: {
order: 1,
respondSha: true,
skillTagFilter(player) {
return player.countCards("hes") > 0;
},
},
subSkill: {
effect: {
trigger: { player: "useCardAfter" },
forced: true,
popup: false,
filter(event, player) {
return event.skill == "clanzhanding";
},
content() {
if (
player.hasHistory("sourceDamage", function (evt) {
return evt.card == trigger.card;
})
) {
var num1 = player.countCards("h"),
num2 = player.getHandcardLimit();
if (num1 < num2) player.draw(Math.min(5, num2 - num1));
} else if (trigger.addCount !== false) {
trigger.addCount = false;
player.getStat().card.sha--;
}
},
},
},
},
//族吴苋
clanyirong: {
audio: 2,
enable: "phaseUse",
usable: 2,
filter(event, player) {
var num1 = player.countCards("h"),
num2 = player.getHandcardLimit();
return num1 != num2;
},
selectCard() {
var player = _status.event.player;
var num1 = player.countCards("h"),
num2 = player.getHandcardLimit();
if (num1 > num2) return num1 - num2;
return [0, 1];
},
filterCard(card, player) {
var num1 = player.countCards("h"),
num2 = player.getHandcardLimit();
return num1 > num2;
},
check(card) {
var player = _status.event.player;
if (
player.countCards("h", function (card) {
return lib.skill.clanyirong.checkx(card) > 0;
}) +
1 <
player.countCards("h") - player.getHandcardLimit()
)
return 0;
return lib.skill.clanyirong.checkx(card);
},
checkx(card) {
var num = 1;
if (_status.event.player.getUseValue(card, null, true) <= 0) num = 1.5;
return (15 - get.value(card)) * num;
},
prompt() {
var player = _status.event.player;
var num1 = player.countCards("h"),
num2 = player.getHandcardLimit();
var str = '<span class="text center">';
if (num1 > num2) {
str += "弃置" + get.cnNumber(num1 - num2) + "张牌,然后手牌上限+1。";
} else {
str += "摸" + get.cnNumber(Math.min(8, num2 - num1)) + "张牌,然后手牌上限-1。";
}
str += "<br>※当前手牌上限:" + num2;
var num3 = (_status.event.getParent().phaseIndex || 0) + 1;
if (num3 > 0) {
str += ";阶段数:" + num3;
}
str += "</span>";
return str;
},
content() {
"step 0";
if (cards.length) {
lib.skill.chenliuwushi.change(player, 1);
event.finish();
} else {
var num1 = player.countCards("h"),
num2 = player.getHandcardLimit();
if (num1 < num2) player.draw(Math.min(8, num2 - num1));
}
("step 1");
lib.skill.chenliuwushi.change(player, -1);
},
ai: {
order(item, player) {
var num = player.getHandcardLimit(),
numx = (_status.event.getParent().phaseIndex || 0) + 1;
if (num == 5 && numx == 4 && player.getStat("skill").clanyirong) return 0;
if (player.countCards("h") == num + 1 && num != 2 && (num <= 4 || (num > 4 && numx > 4))) return 10;
return 0.5;
},
result: { player: 1 },
threaten: 5,
},
},
clanguixiang: {
audio: 2,
trigger: {
player: "phaseChange",
},
forced: true,
filter(event, player) {
if (event.phaseList[event.num].startsWith("phaseUse")) return false;
var num1 = player.getHandcardLimit() - 1,
num2 = event.num;
return num1 == num2;
},
content() {
trigger.phaseList[trigger.num] = "phaseUse|clanguixiang";
game.delayx();
},
},
clanmuyin: {
audio: 2,
clanSkill: true,
audioname: ["clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"],
trigger: { player: "phaseBegin" },
isMax(player) {
var num = player.getHandcardLimit();
return !game.hasPlayer(function (current) {
return current != player && current.getHandcardLimit() > num;
});
},
filter(event, player) {
return game.hasPlayer(function (current) {
return (current == player || current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current);
});
},
direct: true,
content() {
"step 0";
player
.chooseTarget(get.prompt("clanmuyin"), "令一名陈留吴氏角色的手牌上限+1", function (card, player, current) {
return (current == player || current.hasClan("陈留吴氏")) && !lib.skill.clanmuyin.isMax(current);
})
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
});
("step 1");
if (result.bool) {
var target = result.targets[0];
player.logSkill("clanmuyin", target);
lib.skill.chenliuwushi.change(target, 1);
game.delayx();
}
},
},
chenliuwushi: {
charlotte: true,
change(player, num) {
player.addSkill("chenliuwushi");
var info = player.storage;
if (typeof info.chenliuwushi != "number") info.chenliuwushi = 0;
info.chenliuwushi += num;
if (info.chenliuwushi == 0) player.unmarkSkill("chenliuwushi");
else player.markSkill("chenliuwushi");
if (num >= 0) game.log(player, "的手牌上限", "#y+" + num);
else game.log(player, "的手牌上限", "#g" + num);
},
mod: {
maxHandcard(player, num) {
var add = player.storage.chenliuwushi;
if (typeof add == "number") return num + add;
},
},
markimage: "image/card/handcard.png",
intro: {
content(num, player) {
var str = "<li>手牌上限";
if (num >= 0) str += "+";
str += num;
str += "<br><li>当前手牌上限:";
str += player.getHandcardLimit();
return str;
},
},
},
},
characterReplace: {
wuban: ["clan_wuban", "dc_wuban", "wuban", "xin_wuban"],
},
characterIntro: {
xunshu: "荀淑83年149年字季和为郎陵侯相颍川颍阴人今河南省许昌市人。汉和帝至汉桓帝时人物以品行高洁著称。有子八人号八龙。年轻时有高尚的德行学问渊博不喜欢雕章琢句徒在文字上用功不注重实际的学识。因此常常被俗儒看不起。但州里却称他有知人之明。安帝时征召任为郎中后来再升当涂长。离职还乡里。他的孙子荀彧是曹操部下著名的谋士。",
xuncai: "荀采(生卒年不详),字女荀,颍川人,东汉名士荀爽之女。荀采聪慧敏捷而有才艺。十七岁时,荀采嫁给阴瑜。两年后阴瑜去世。荀采不愿意改嫁,但荀爽答应把荀采嫁给同郡人郭奕。荀采趁着旁人没有防备,用粉在门上写下:“尸还阴”,而后自缢而死。",
xuncan: "荀粲210年—238年字奉倩颍川郡颍阴县今河南省许昌市人。三国时期曹魏大臣、玄学家太尉荀彧幼子。个性简贵不轻易交接常人所交之辈皆一时俊杰。聪颖过人善谈玄理名噪一时。娶大将军曹洪之女为妻生活美满。景初二年面对妻子去世悲痛过度而死时年二十九成语“荀令伤神”与之有关。",
hanshao: "韩韶生卒年不详字仲黄颍川舞阳今河南省漯河市东汉桓帝时出仕。任郡吏有政绩继而被征入司徒府。他公正廉明尽心民事视民苦如在己身政绩卓著。汉永寿二年公元156年泰山贼公孙举率流寇数千骚扰嬴县守令因不能拒敌安民多受制裁朝廷命尚书府从三府司徒、司马、司空属员中选择能治理民事又能拒寇入侵的官员前往镇守。韩韶被封为“嬴长”到嬴县上任他是莱芜历史上唯一的一位“嬴长”。",
hanrong: "韩融127年196年字元长颍川舞阳今属河南省漯河市人。赢长韩韶子献帝时大臣。中平五年188年融与荀爽、陈纪等十四人并博士征不至。董卓废立融等复俱公车征。初平元年190年六月融为大鸿胪奉命与执金吾胡母班等出使关东。献帝东迁为李傕、郭汜等所败融为太仆奉命至弘农与傕、汜连和使其放遣公卿百官及宫女妇人。",
wukuang: "吴匡生卒年不详兖州陈留今河南开封市人。东汉末年大臣大将军何进部将。光熹元年公元189年汉灵帝死后十常侍干预朝政大将军何进谋诛宦官但失败被杀吴匡联合曹操、袁绍等杀尽宦官攻杀车骑将军何苗。兴平二年公元195年十月李傕、郭汜后悔放汉献帝东归洛阳于是联合起来追击曹操遂起兵平乱但在回朝后曹操挟天子以令诸侯实行专权但遭到吴匡反对。",
wanghun: "王浑223年297年字玄冲太原郡晋阳县今山西省太原市人。魏晋时期名臣曹魏司空王昶的儿子。王浑早年为大将军曹爽的掾吏高平陵政变后循例免官出任怀县县令、散骑侍郎等职袭封京陵县侯。西晋王朝建立后加号扬烈将军历任征虏将军、东中郎将、豫州刺史等职积极筹划伐吴方略。咸宁五年279年配合镇南将军杜预灭亡吴国迁征东大将军、左仆射、司徒公晋爵京陵县公。晋惠帝司马衷即位加任侍中衔。楚王司马玮发动政变有意寻求支持遭到严词拒绝。楚王司马玮死后复任司徒、录尚书事。元康七年297年王浑去世享年七十五岁谥号为元。《唐会要》尊为“魏晋八君子”之一。",
zhongyu: "钟毓(?-263年字稚叔颍川长社今河南长葛市人。三国时期魏国大臣太傅钟繇之子、司徒钟会之兄。出身颍川钟氏机灵敏捷有其父之遗风。十四岁时起家散骑侍郎。太和初年迁黄门侍郎袭封定陵县侯。正始年间拜散骑常侍迁魏郡太守入为侍中、御史中丞、廷尉 [5] 。随平诸葛诞的淮南叛乱拜青州刺史、后将军都督徐州、荆州诸军事。景元四年263年去世追赠车骑将军谥号为惠著有文集五卷见《隋书·经籍志》及《两唐书·经籍志》传于世。",
wanglun: "王沦233年257年字太冲出身太原晋阳王姓世族今山西省太原市王昶三子王浑、王深之弟王湛之兄。醇粹简远崇尚老庄之学心思平淡。二十多时被举荐为孝廉没有前往后任大将军参军。257年诸葛诞不满司马氏篡权而在寿春起义王沦跟随司马昭征讨遭遇疾疫去世时年二十五时人惜之司马昭为他流泪。其兄著诔文《表德论》表述其德行说“因为畏惧帝王的典章制度不能写墓志铭于是撰写过往的事迹刻在墓的背面。”",
wuqiao: "吴乔,西晋人物,蜀车骑将军吴懿之孙。李雄建立成汉政权,他沦落益州,长达三十年,始终不向李雄屈服。",
clan_wangguang: "王广,三国时期曹魏太原祁县人,哲学家。东汉司徒王允从孙,魏太尉王凌之子。有志尚学,官至尚书。魏时随父亲在朝作官,屯骑校尉,机智有谋。当得知司马懿篡夺曹魏政权时,王凌与外甥令狐愚合谋立楚王为魏主,王广劝其父不可,王凌没有接受儿子的谏言,结果计谋泄而被害。",
wangmingshan: "王明山,王凌的小儿子,太原祁(今山西省祁县)人,三国魏书法家,最知名善画,多技艺,人得其书,皆以为法。太尉王凌参与谋划废立,事情泄露,被太傅司马懿领兵平定。",
},
dynamicTranslate: {
clanlianzhu(player) {
if (player.storage.clanlianzhu) return '转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1<span class="bluetext">阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1</span>。';
return '转换技。每名角色A的出牌阶段限一次。<span class="bluetext">阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色不同,则你的手牌上限-1</span>;阳:A可以令你选择一名在你或A攻击范围内的另一名其他角色B,然后A和你可依次选择是否对B使用一张【杀】。若这两张【杀】颜色相同,则你的手牌上限+1。';
},
clanguangu(player) {
if (player.storage.clanguangu) return '转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;<span class="bluetext">阳:你可以观看一名角色的至多四张手牌。</span>然后你可以使用其中的一张牌。';
return '转换技,出牌阶段限一次。<span class="bluetext">阴:你可以观看牌堆顶的至多四张牌;</span>阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。';
},
clanjiexuan(player) {
if (player.storage.clanjiexuan) return '限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;<span class="bluetext">阳:你可以将一张黑色牌当【过河拆桥】使用。</span>';
return '限定技,转换技。<span class="bluetext">阴:你可以将一张红色牌当【顺手牵羊】使用;</span>阳:你可以将一张黑色牌当【过河拆桥】使用。';
},
},
translate: {
clan_wuxian_prefix: "族",
clan_wuban_prefix: "族",
clan_xunshu_prefix: "族",
clan_xunchen_prefix: "族",
clan_xuncai_prefix: "族",
clan_xuncan_prefix: "族",
clan_hanshao_prefix: "族",
clan_hanrong_prefix: "族",
clan_wukuang_prefix: "族",
clan_wangling_prefix: "族",
clan_zhongyan_prefix: "族",
clan_wangyun_prefix: "族",
clan_wanghun_prefix: "族",
clan_zhonghui_prefix: "族",
clan_zhongyu_prefix: "族",
clan_wanglun_prefix: "族",
clan_xunyou_prefix: "族",
clan_wuqiao_prefix: "族",
clan_wuxian: "族吴苋",
clanyirong: "移荣",
clanyirong_info: "出牌阶段限两次。若你的手牌数小于X则你可以将手牌摸至X张至多摸八张然后X-1大于X则你可以将手牌弃置至X张然后X+1。X为你的手牌上限",
clanguixiang: "贵相",
clanguixiang_info: "锁定技。你的非出牌阶段开始前若此阶段即将成为你本回合内的第X个阶段X为你的手牌上限则你终止此阶段改为进行一个出牌阶段。",
clanmuyin: "穆荫",
clanmuyin_info: "宗族技。回合开始时,你可以选择一名手牌上限不为全场最多的陈留吴氏角色。该角色的手牌上限+1。",
chenliuwushi: "陈留·吴氏",
clan_wuban: "族吴班",
clanzhanding: "斩钉",
clanzhanding_info: "你可以将任意张牌当做【杀】使用并你令你的手牌上限-1。你以此法使用的【杀】结算结束后若你因此【杀】造成过伤害则你将手牌摸至手牌上限至多摸五张否则你令此【杀】不计入次数限制。",
clan_xunshu: "族荀淑",
clanshenjun: "神君",
clanshenjun_info: "当一名角色使用【杀】或普通锦囊牌时,若你手牌中有该牌名的牌,你展示之,且这些牌称为“神君”。然后本阶段结束时,你可以将等同于你“神君”数张牌当做一张“神君”牌使用。",
clanbalong: "八龙",
clanbalong_info: "锁定技。当你于一回合内首次{回复体力后或受到伤害后或失去体力后},若你手牌中唯一最多的类别为锦囊牌,你展示所有手牌并摸至角色数张。",
clandaojie: "蹈节",
clandaojie_info: "宗族技锁定技。当你每回合第一次使用非伤害类普通锦囊牌后你须失去一个锁定技或失去1点体力令一名颍川荀氏角色获得此牌对应的所有实体牌。",
clan_xuncai: "族荀采",
clanlieshi: "烈誓",
clanlieshi_info: "出牌阶段你可以选择一项1.废除判定区并受到你造成的1点火焰伤害2.弃置所有【闪】3.弃置所有【杀】。然后令一名其他角色从你未选择的选项中选择一项。",
clandianzhan: "点盏",
clandianzhan_info: "锁定技。当你每轮第一次使用一种花色的牌后若此牌的目标数为1且目标未横置你横置此牌目标若你有此花色的手牌你重铸这些牌。均执行后你摸一张牌。",
clanhuanyin: "还阴",
clanhuanyin_info: "锁定技。当你进入濒死状态时,将手牌补至四张。",
clan_xunchen: "族荀谌",
clansankuang: "三恇",
clansankuang_info: "锁定技。当你每轮第一次使用一种类别的牌后你令一名其他角色交给你至少X张牌然后于装备区或处理区内获得你使用的牌对应的所有实体牌X为以下条件中其满足的项数场上有牌、已受伤、体力值小于手牌数。",
clanbeishi: "卑势",
clanbeishi_info: "锁定技。当一名角色失去最后的手牌后若其是你首次发动〖三恇〗的目标角色你回复1点体力。",
clan_xuncan: "族荀粲",
clanyunshen: "熨身",
clanyunshen_info: "出牌阶段限一次。你可以令一名其他角色回复1点体力然后选择一项1.你视为对其使用一张冰【杀】2.其视为对你使用一张冰【杀】。",
clanshangshen: "伤神",
clanshangshen_info: "当一名角色受到属性伤害后,若本回合此前没有角色或已死亡的角色受到过属性伤害,你可以执行目标角色为你的【闪电】效果,然后其将手牌摸至四张。",
clanfenchai: "分钗",
clanfenchai_info: "锁定技。若你首次发动技能指定的异性目标角色中:存在存活角色,你的判定牌视为♥;不存在存活角色,你的判定牌视为♠。",
clan_hanshao: "族韩韶",
clanfangzhen: "放赈",
clanfangzhen_info: "出牌阶段开始时你可以横置一名角色并选择一项1.摸两张牌然后交给其两张牌2.令其回复1点体力。然后第X轮游戏开始时你失去〖放赈〗X为其座位号。",
clanliuju: "留驹",
clanliuju_info: "出牌阶段结束时你可以与一名角色A拼点输的角色可以使用任意张拼点牌中的非基本牌。然后若你至A的距离或A至你的距离发生了变化你重置〖恤民〗。",
clanxumin: "恤民",
clanxumin_info: "宗族技,限定技。你可以将一张牌当做【五谷丰登】对任意名其他角色使用。",
clan_hanrong: "族韩融",
clanlianhe: "连和",
clanlianhe_info: "出牌阶段开始时你可以横置两名角色。这些角色于自己的下个出牌阶段结束时若其此阶段未摸牌其令你摸X+1张牌或交给你X-1张牌X为其此阶段获得的牌数且至多为3。",
clanhuanjia: "缓颊",
clanhuanjia_info: "出牌阶段结束时,你可以与一名角色拼点。赢的角色可以使用一张拼点牌。然后若此牌:未造成过伤害,你获得另一张拼点牌;造成过伤害,你失去一个技能。",
clan_wukuang: "族吴匡",
clanlianzhu: "联诛",
clanlianzhu_info: "转换技。每名角色A的出牌阶段限一次。阴:A可以重铸一张牌,然后你可以重铸一张牌。若这两张牌颜色相同,则你的手牌上限+1可以令你选择一名在你或攻击范围内的另一名其他角色然后和你可依次选择是否对使用一张【杀】。若这两张【杀】颜色不同则你的手牌上限-1。",
clan_wangling: "族王淩",
clanbolong: "驳龙",
clanbolong_info: "出牌阶段限一次。你可以令一名其他角色选择一项1.你交给其一张牌然后视为对其使用一张雷【杀】2.交给你等同于你手牌数的牌,然后视为对你使用一张【酒】。",
clanzhongliu: "中流",
clanzhongliu_info: "宗族技,锁定技。当你使用牌时,若此牌对应的实体牌均不为太原王氏角色的手牌,你重置武将牌上的技能。",
clan_zhongyan: "族钟琰",
clanguangu: "观骨",
clanguangu_info: "转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。",
clanxiaoyong: "啸咏",
clanxiaoyong_info: "锁定技。当你于回合内首次使用字数为X的牌时你重置〖观骨〗X为你上次发动〖观骨〗观看的牌数。",
clanbaozu: "保族",
clanbaozu_info: "宗族技限定技。当一名颍川钟氏角色进入濒死状态时你可以令其横置并回复1点体力。",
clan_wangyun: "族王允",
clanjiexuan: "解悬",
clanjiexuan_info: "限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。",
clanmingjie: "铭戒",
clanmingjie_info: "限定技。出牌阶段,你可以选择一名角色,然后你获得此下效果:①你使用牌时你可以指定其为额外目标直到其下个回合结束。②其下个回合结束时(若该角色为你则改为你的下下个回合结束时),你可以使用本回合使用过的黑桃牌和被抵消过的牌。",
clan_wanghun: "族王浑",
clanfuxun: "抚循",
clanfuxun_info: "出牌阶段限一次。你可以获得或交给一名其他角色一张手牌,然后若其手牌数与你相等且于此阶段仅以此法获得或失去过牌,你可以将一张牌当任意基本牌使用。",
clanchenya: "沉雅",
clanchenya_info: "当一名角色发动“出牌阶段限一次”的技能后你可以令其重铸任意张牌名字数为X的牌X为其手牌数。",
clan_zhonghui: "族钟会",
clanyuzhi: "迂志",
clanyuzhi_info: "锁定技。新的一轮开始时你依次执行以下项①你弃置上一轮因〖迂志〗展示的手牌然后若你上一轮使用的牌数或你上上轮因〖迂志〗摸的牌数小于你上轮因〖迂志〗摸的牌数你受到1点雷属性伤害或失去〖保族〗。②你展示一张手牌然后摸X张牌X为此牌牌名字数。",
clanxieshu: "挟术",
clanxieshu_info: "当你因牌造成或受到伤害后你可以横置武将牌并弃置Y张牌然后摸你已损失体力值张牌Y为此牌牌名字数。若本回合有角色进入过濒死状态则〖挟术〗于本回合失效。",
clan_zhongyu: "族钟毓",
clanjiejian: "捷谏",
clanjiejian_info: "当你于一回合使用第X张牌指定第一个目标后若此牌不为装备牌则你可以令一名目标角色摸X张牌。X为此牌牌名字数",
clanhuanghan: "惶汗",
clanhuanghan_info: "当你受到牌造成的伤害后你可以摸X张牌并弃置Y张牌X为此牌牌名字数Y为你已损失的体力值然后若此次技能发动不为你本回合首次发动此技能你重置技能〖保族〗。",
clan_wanglun: "族王沦",
clanqiuxin: "求心",
clanqiuxin_info: "出牌阶段限一次,你可以令一名其他角色选择一项:①你对其使用【杀】;②你对其使用任意普通锦囊牌。当你执行其选择的选项后,你视为执行另一项。",
clanjianyuan: "简远",
clanjianyuan_info: "当一名角色发动“出牌阶段限一次”的技能后你可以令其重铸任意张牌名字数为X的牌X为其本阶段的使用牌数。",
clan_xunyou: "族荀攸",
clanbaichu: "百出",
clanbaichu_info: "锁定技当你使用一张牌结算完毕后若你未记录过此牌的花色和类型组合则你记录此组合并记录一个普通锦囊牌名否则你于本轮获得技能〖奇策〗已记录此牌牌名你回复1点体力或摸一张牌。",
clan_wuqiao: "族吴乔",
clanqiajue: "跒倔",
clanqiajue_info: "摸牌阶段开始时你可以弃置一张黑色牌。若如此做此阶段结束时你展示手牌若这些牌的点数和大于30你的手牌上限-2否则你执行一个额外的摸牌阶段。",
clan_wangguang: "族王广",
clan_wangguang_prefix: "族",
clanlilun: "离论",
clanlilun_info: "出牌阶段限一次,你可以重铸两张手牌(不能是你本回合以此法重铸过的牌名的牌),然后使用其中的一张牌。",
clanjianji: "见机",
clanjianji_info: "限定技,一名角色的结束阶段,若其上下家均未于本回合:使用过牌,则你可以与其各摸一张牌;成为过牌的目标,则你可以视为使用一张【杀】。",
clan_wangmingshan: "族王明山",
clan_wangmingshan_prefix: "族",
clantanque: "弹雀",
clantanque_info: "每回合限一次。当你使用牌结算结束后你可以对一名体力值为X且不为0的角色造成1点伤害X为此牌点数与你上一张使用的牌的点数之差。",
clanshengmo: "剩墨",
clanshengmo_info: "当你需要使用一张未以此法使用过的基本牌时,你可以获得一张于本回合进入弃牌堆且点数不为这些牌中最大且不为这些牌中最小的牌,视为你使用需要使用的牌。",
clan_zhongyao: "族钟繇",
clan_zhongyao_prefix: "族",
clanchengqi: "承启",
clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。",
clanjieli: "诫厉",
clanjieli_info: "结束阶段你可以选择一名角色你观看其手牌中牌名字数最多的牌和牌堆顶X张牌然后你可以交换其中的X张牌X为你本回合使用过的牌中的牌名字数最大值。",
clan_wu: "陈留·吴氏",
clan_xun: "颍川·荀氏",
clan_han: "颍川·韩氏",
clan_wang: "太原·王氏",
clan_zhong: "颍川·钟氏",
},
};
});