import { lib, game, ui, get, ai, _status } from "../noname.js";
game.import("character", function () {
return {
name: "huicui",
connect: true,
character: {
dc_caoshuang: ["male", "wei", 4, ["dcjianzhuan", "dcfanshi"]],
zangba: ["male", "wei", 4, ["rehengjiang"]],
dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"]],
dc_wangling: ["male", "wei", 4, ["dcjichou", "dcmouli"], ["clan:太原王氏"]],
dc_jiangji: ["male", "wei", 3, ["dcshiju", "dcyingshi"]],
gongsunxiu: ["male", "qun", 4, ["dcgangu", "dckuizhen"]],
dc_liuli: ["male", "shu", 3, ["dcfuli", "dcdehua"]],
yue_daqiao: ["female", "wu", 3, ["dcqiqin", "dczixi"]],
dc_kongrong: ["male", "qun", 3, ["dckrmingshi", "lirang"]],
dc_sp_menghuo: ["male", "qun", 4, ["dcmanwang"]],
dc_lingcao: ["male", "wu", "4/5", ["dcdufeng"]],
yue_xiaoqiao: ["female", "wu", 3, ["dcqiqin", "dcweiwan"]],
dc_dongzhao: ["male", "wei", 3, ["dcyijia", "dcdingji"]],
kuaiqi: ["male", "wei", 3, ["dcliangxiu", "dcxunjie"]],
yue_caiyong: ["male", "qun", 3, ["dcjiaowei", "dcfeibai"]],
pangshanmin: ["male", "wei", 3, ["dccaisi", "dczhuoli"]],
dc_jiachong: ["male", "wei", 3, ["dcbeini", "dcshizong"]],
dc_sunchen: ["male", "wu", 4, ["dczigu", "dczuowei"]],
dc_zhangmancheng: ["male", "qun", 4, ["dclvecheng", "dczhongji"]],
yue_zhoufei: ["female", "wu", 3, ["dclingkong", "dcxianshu"]],
dc_wuban: ["male", "shu", 4, ["dcyouzhan"], ["clan:陈留吴氏"]],
yue_caiwenji: ["female", "qun", 3, ["dcshuangjia", "dcbeifen"]],
liuchongluojun: ["male", "qun", 3, ["dcminze", "dcjini"]],
yuechen: ["male", "wei", 4, ["dcporui", "dcgonghu"]],
zhangkai: ["male", "qun", 4, ["dcxiangshu"]],
gaoxiang: ["male", "shu", 4, ["dcchiying"]],
yuanyin: ["male", "qun", 3, ["dcmoshou", "dcyunjiu"]],
dongwan: ["female", "qun", 3, ["dcshengdu", "dcjieling"]],
zhangchu: ["female", "qun", 3, ["dcjizhong", "dcrihui", "dcguangshi"]],
peiyuanshao: ["male", "qun", 4, ["dcmoyu"]],
mengjie: ["male", "qun", 3, ["dcyinlu", "dcyouqi"]],
dc_huojun: ["male", "shu", 4, ["dcgue", "dcsigong"]],
dc_sunhanhua: ["female", "wu", 3, ["dchuiling", "dcchongxu"]],
dc_sunziliufang: ["male", "wei", 3, ["dcqinshen", "dcweidang"]],
yuantanyuanxiyuanshang: ["male", "qun", 4, ["dcneifa"]],
qiaorui: ["male", "qun", 4, ["dcaishou", "dcsaowei"]],
xianglang: ["male", "shu", 3, ["dckanji", "dcqianzheng"]],
qinlang: ["male", "wei", 4, ["dchaochong", "dcjinjin"]],
furongfuqian: ["male", "shu", "4/6", ["dcxuewei", "dcyuguan"]],
zhenghun: ["male", "wei", 3, ["dcqiangzhi", "dcpitian"]],
dc_zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "dcqingren", "dclongyuan"]],
dc_huanghao: ["male", "shu", 3, ["dcqinqing", "huisheng", "dccunwei"]],
liupi: ["male", "qun", 4, ["dcjuying"]],
dc_sp_jiaxu: ["male", "wei", 3, ["zhenlue", "dcjianshu", "dcyongdi"]],
leibo: ["male", "qun", 4, ["dcsilve", "dcshuaijie"]],
gongsundu: ["male", "qun", 4, ["dczhenze", "dcanliao"]],
panghui: ["male", "wei", 5, ["dcyiyong"]],
dc_yuejiu: ["male", "qun", 4, ["dccuijin"]],
chenjiao: ["male", "wei", 3, ["dcxieshou", "dcqingyan", "dcqizi"]],
wanglie: ["male", "qun", 3, ["dcchongwang", "dchuagui"]],
chengui: ["male", "qun", 3, ["dcyingtu", "dccongshi"]],
dc_huangquan: ["male", "shu", 3, ["dcquanjian", "dctujue"]],
yinfuren: ["female", "wei", 3, ["dcyingyu", "dcyongbi"]],
dc_lvkuanglvxiang: ["male", "wei", 4, ["dcshuhe", "dcliehou"]],
guanhai: ["male", "qun", 4, ["suoliang", "qinbao"]],
huzhao: ["male", "qun", 3, ["midu", "xianwang"]],
dc_liuba: ["male", "shu", 3, ["dczhubi", "dcliuzhuan"]],
zhangxun: ["male", "qun", 4, ["suizheng"]],
zongyu: ["male", "shu", 3, ["zyqiao", "chengshang"]],
dc_jiling: ["male", "qun", 4, ["dcshuangren"]],
dc_yanghu: ["male", "wei", 3, ["dcdeshao", "dcmingfa"]],
caimaozhangyun: ["male", "wei", 4, ["lianzhou", "jinglan"]],
tenggongzhu: ["female", "wu", 3, ["xingchong", "liunian"]],
dc_huangchengyan: ["male", "qun", 3, ["dcjiezhen", "dczecai", "dcyinshi"]],
dc_gaolan: ["male", "qun", 4, ["xizhen"]],
guanning: ["male", "qun", "3/7", ["dunshi"]],
dc_jiben: ["male", "qun", 3, ["xunli", "zhishi", "lieyi"]],
mamidi: ["male", "qun", "4/6", ["bingjie", "zhengding"]],
re_dengzhi: ["male", "shu", 3, ["jianliang", "weimeng"]],
fengxi: ["male", "wu", 3, ["yusui", "boyan"]],
re_miheng: ["male", "qun", 3, ["rekuangcai", "reshejian"]],
re_chendeng: ["male", "qun", 3, ["refuyuan", "reyingshui", "rewangzu"]],
wanniangongzhu: ["female", "qun", 3, ["zhenge", "xinghan"]],
re_xunchen: ["male", "qun", 3, ["refenglve", "anyong"], ["clan:颍川荀氏"]],
re_kanze: ["male", "wu", 3, ["xiashu", "rekuanshi"]],
lvlingqi: ["female", "qun", 4, ["guowu", "zhuangrong"]],
zhanghu: ["male", "wei", 4, ["cuijian", "zhtongyuan"]],
luyusheng: ["female", "wu", 3, ["zhente", "zhiwei"]],
huaxin: ["male", "wei", 3, ["spwanggui", "xibing"]],
mengyou: ["male", "qun", 5, ["manyi", "dcmanzhi"]],
liuyong: ["male", "shu", 3, ["zhuning", "fengxiang"]],
dc_sunru: ["female", "wu", 3, ["xiecui", "youxu"]],
xiahoulingnv: ["female", "wei", 4, ["fuping", "weilie"]],
zhangyao: ["female", "wu", 3, ["yuanyu", "xiyan"]],
tengyin: ["male", "wu", 3, ["chenjian", "xixiu"]],
zhangxuan: ["female", "wu", 4, ["tongli", "shezang"]],
wangtao: ["female", "shu", 3, ["huguan", "yaopei"]],
wangyue: ["female", "shu", 3, ["huguan", "mingluan"]],
zhaoyan: ["female", "wu", 3, ["jinhui", "qingman"]],
heyan: ["male", "wei", 3, ["yachai", "qingtan"]],
re_sunluyu: ["female", "wu", 3, ["remeibu", "remumu"]],
re_dongbai: ["female", "qun", 3, ["relianzhu", "rexiahui"]],
zhoushan: ["male", "wu", 4, ["dcmiyun", "dcdanying"]],
dc_caiyang: ["male", "wei", 4, ["dcxunji", "dcjiaofeng"]],
xiahoujie: ["male", "wei", 5, ["liedan", "zhuangdan"]],
caoxing: ["male", "qun", 4, ["cxliushi", "zhanwan"]],
re_chunyuqiong: ["male", "qun", 4, ["recangchu", "reliangying", "reshishou"]],
xingdaorong: ["male", "qun", "4/6", ["xuxie"]],
re_panfeng: ["male", "qun", 4, ["xinkuangfu"]],
jiangfei: ["male", "shu", 3, ["dcshengxi", "dcshoucheng"]],
},
characterSort: {
huicui: {
sp_baigei: [
"re_panfeng",
"xingdaorong",
"caoxing",
"re_chunyuqiong",
"xiahoujie",
"dc_caiyang",
"zhoushan",
],
sp_caizijiaren: [
"dc_kongrong",
"re_dongbai",
"re_sunluyu",
"heyan",
"zhaoyan",
"wangtao",
"wangyue",
"zhangxuan",
"tengyin",
"zhangyao",
"xiahoulingnv",
"dc_sunru",
"pangshanmin",
"kuaiqi",
],
sp_zhilan: [
"dc_liuli",
"liuyong",
"wanniangongzhu",
"zhanghu",
"lvlingqi",
"tenggongzhu",
"panghui",
"dc_zhaotongzhaoguang",
"yuantanyuanxiyuanshang",
"yuechen",
"dc_lingcao",
],
sp_guixin: [
"zangba",
"re_kanze",
"re_chendeng",
"caimaozhangyun",
"dc_lvkuanglvxiang",
"dc_gaolan",
"yinfuren",
"chengui",
"chenjiao",
"dc_sp_jiaxu",
"qinlang",
"dc_dongzhao",
],
sp_daihan: [
"mamidi",
"dc_jiling",
"zhangxun",
"dc_yuejiu",
"leibo",
"qiaorui",
"dongwan",
"yuanyin",
],
sp_jianghu: ["guanning", "huzhao", "dc_huangchengyan", "mengjie", "wanglie"],
sp_zongheng: [
"huaxin",
"luyusheng",
"re_xunchen",
"re_miheng",
"fengxi",
"re_dengzhi",
"dc_yanghu",
"zongyu",
],
sp_taiping: ["guanhai", "liupi", "peiyuanshao", "zhangchu", "zhangkai", "dc_zhangmancheng"],
sp_yanhan: [
"dc_liuba",
"dc_huangquan",
"furongfuqian",
"xianglang",
"dc_huojun",
"gaoxiang",
"dc_wuban",
"jiangfei",
],
sp_jishi: ["dc_jiben", "zhenghun", "dc_sunhanhua", "liuchongluojun"],
sp_raoting: ["dc_huanghao", "dc_sunziliufang", "dc_sunchen", "dc_jiachong"],
sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu"],
sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao"],
sp_zhonghu: ["dc_jiangji", "dc_wangling", "dc_simashi", "dc_caoshuang"],
},
},
/** @type { importCharacterConfig['skill'] } */
skill: {
//新杀曹爽
dcjianzhuan: {
audio: 2,
trigger: { player: "useCard" },
filter(event, player) {
const evtx = event.getParent("phaseUse");
return (
player.isPhaseUsing() &&
player.getHistory("useSkill", (evt) => {
return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx;
}).length <
4 - player.getStorage("dcjianzhuan").length
);
},
forced: true,
derivation: "dcjianzhuan_faq",
async content(event, trigger, player) {
const evtx = event.getParent("phaseUse"),
num = player.getHistory("useSkill", (evt) => {
return evt.skill == "dcjianzhuan" && evt.event.getParent("phaseUse") == evtx;
}).length,
info = get.info("dcjianzhuan").choices;
let choices = [],
choiceList = [],
map = {};
for (const i in info) {
map[info[i].intro] = i;
if (
player.getStorage("dcjianzhuan").includes(i) ||
player.getStorage("dcjianzhuan_used").includes(i)
)
continue;
choices.push(info[i].intro);
choiceList.push(info[i].introx(num));
}
const {
result: { control },
} = await player
.chooseControl(choices)
.set("choiceList", choiceList)
.set("ai", () => {
const player = get.event("player"),
num = get.event("num"),
info = get.info("dcjianzhuan").choices;
let choices = get.event("controls").slice(),
map = get.event("map");
return choices.sort(
(a, b) =>
info[map[b]].ai_effect(player, num) - info[map[a]].ai_effect(player, num)
)[0];
})
.set("num", num)
.set("map", map)
.set("prompt", "渐专:请选择一项执行");
if (control) {
if (!player.storage.dcjianzhuan_used) {
player.when("phaseUseAfter").then(() => delete player.storage.dcjianzhuan_used);
}
player.markAuto("dcjianzhuan_used", [map[control]]);
await info[map[control]].content(player, num);
}
},
choices: {
discard_target: {
intro: "拆牌",
introx: (num) => "令一名角色弃置" + num + "张牌",
weight: 1,
ai_effect(player, num) {
return game.hasPlayer((target) => {
return get.effect(target, { name: "guohe_copy2" }, player, player) > 0;
})
? 2 + num
: 0;
},
async content(player, num = 1) {
const {
result: { bool, targets },
} = await player
.chooseTarget("令一名角色弃置" + num + "张牌", true)
.set("ai", (target) => {
return (
get.effect(
target,
{ name: "guohe_copy2" },
get.event("player"),
get.event("player")
) *
Math.sqrt(
Math.min(
get.event("num"),
target.countDiscardableCards(target, "he")
)
)
);
})
.set("num", num);
if (bool) {
const target = targets[0];
player.line(target);
await target.chooseToDiscard(num, "he", true);
}
},
},
draw_self: {
intro: "摸牌",
introx: (num) => "摸" + num + "张牌",
weight: 1,
ai_effect(player, num) {
return 3;
},
async content(player, num = 1) {
await player.draw(num);
},
},
recast_self: {
intro: "重铸",
introx: (num) => "重铸" + num + "张牌",
weight: 1,
ai_effect(player, num) {
return 1;
},
async content(player, num = 1) {
if (!player.hasCard(lib.filter.cardRecastable, "he")) return;
const {
result: { bool, cards },
} = await player
.chooseCard("重铸" + num + "张牌", "he", num, lib.filter.cardRecastable, true)
.set("ai", lib.skill.zhiheng.check);
if (bool) await player.recast(cards);
},
},
discard_self: {
intro: "弃牌",
introx: (num) => "弃置" + num + "张牌",
weight: "90%",
ai_effect(player, num) {
let cards = player.getCards("hs");
cards.sort((a, b) => get.value(b) - get.value(a));
cards = cards.slice(0, -Math.min(num, cards.length));
return cards.some((card) => player.hasValueTarget(card, true, true)) ? 4 : -4;
},
async content(player, num = 1) {
await player.chooseToDiscard(num, "he", true);
},
},
},
group: "dcjianzhuan_remove",
subSkill: {
remove: {
audio: "dcjianzhuan",
trigger: { player: "phaseUseEnd" },
filter(event, player) {
if (player.getStorage("dcjianzhuan").length >= 4) return false;
return (
player.getStorage("dcjianzhuan_used").length >=
4 - player.getStorage("dcjianzhuan").length
);
},
forced: true,
async content(event, trigger, player) {
const info = get.info("dcjianzhuan").choices;
let map = {};
let unfixedWeightTotal = 0,
remainedWeight = 100;
let entries = [];
for (const i in info) {
const infox = info[i];
map[infox.intro] = i;
if (player.getStorage("dcjianzhuan").includes(i)) continue;
let weight = (infox.weight || 1).toString();
if (weight.endsWith("%")) {
weight = Math.min(remainedWeight, parseInt(weight.slice(0, -1)));
entries.push([infox.intro, weight]);
remainedWeight -= weight;
} else {
weight = parseInt(weight);
unfixedWeightTotal += weight;
entries.push([infox.intro, -weight]);
}
}
entries = entries.map((entry) => {
let weight = entry[1];
if (weight < 0) weight = (-remainedWeight / unfixedWeightTotal) * weight;
return [entry[0], weight];
});
let rand = Math.random() * 100;
let removeChoice = entries.find((entry) => {
rand -= entry[1];
return rand < 0;
})[0];
if (get.isLuckyStar(player) && Object.keys(entries).includes("弃牌"))
removeChoice = "弃牌";
player.markAuto("dcjianzhuan", [map[removeChoice]]);
player.popup(removeChoice);
game.log(player, "移去了", "#g" + removeChoice, "项");
},
},
},
mark: true,
intro: {
markcount(storage) {
return 4 - (storage || []).length;
},
content(storage) {
if (!(storage || []).length) return "暂未移去任何项";
const info = get.info("dcjianzhuan").choices;
let str = "";
for (const i of storage) {
str += info[i].intro;
str += "、";
}
str = str.slice(0, -1);
return "已移去" + str + "项";
},
},
},
dcfanshi: {
unique: true,
audio: 2,
trigger: { player: "phaseJieshuBegin" },
filter(event, player) {
return 4 - player.getStorage("dcjianzhuan").length < 2;
},
forced: true,
juexingji: true,
skillAnimation: true,
animationColor: "thunder",
async content(event, trigger, player) {
player.awakenSkill("dcfanshi");
const info = get.info("dcjianzhuan").choices;
let choices = [];
for (const i in info) {
if (!player.getStorage("dcjianzhuan").includes(i)) choices.push(i);
}
if (choices.length) {
for (const choice of choices) {
for (let i = 1; i <= 3; i++) {
await info[choice].content(player, 1);
}
}
}
await player.gainMaxHp(2);
await player.recover(2);
await player.changeSkills(["dcfudou"], ["dcjianzhuan"]);
},
derivation: "dcfudou",
ai: {
combo: "dcjianzhuan"
},
},
dcfudou: {
audio: 2,
trigger: { player: "useCardToPlayered" },
filter(event, player) {
if (event.targets.length != 1 || event.target == player) return false;
const color = get.color(event.card);
if (!["black", "red"].includes(color)) return false;
const damage = event.target.getAllHistory(
"sourceDamage",
(evt) => evt.player == player
).length;
return Math.min(1, damage) == (color == "black");
},
check(event, player) {
const color = get.color(event.card);
if (color == "red") return get.attitude(player, event.target) > 0;
if (
player.getHp() +
player.countCards("hs", (card) => player.canSaveCard(card, player)) <=
1
)
return false;
return (
get.effect(player, { name: "losehp" }, player, player) >=
get.effect(event.target, { name: "losehp" }, player, player)
);
},
prompt2(event, player) {
return (
"与" +
get.translation(event.target) +
"各" +
(get.color(event.card) == "black" ? "失去1点体力" : "摸一张牌")
);
},
logTarget: "target",
async content(event, trigger, player) {
const color = get.color(trigger.card),
target = trigger.target;
if (color == "red") {
await player.draw("nodelay");
await target.draw();
} else {
await player.loseHp();
await target.loseHp();
}
},
},
//司马师
dcsanshi: {
audio: 2,
trigger: { global: "roundStart" },
forced: true,
filter(event, player) {
return game.roundNumber === 1;
},
group: ["dcsanshi_gain", "dcsanshi_directHit"],
async content(event, trigger, player) {
const recordedNumbers = [];
let num = get.rand(0, ui.cardPile.childNodes.length - 1);
for (let i = 0; i < ui.cardPile.childNodes.length; i++) {
let j = i + num;
if (j >= ui.cardPile.childNodes.length) j -= ui.cardPile.childNodes.length;
const card = ui.cardPile.childNodes[j],
number = get.number(card, false);
if (!recordedNumbers.includes(number)) {
recordedNumbers.add(number);
card.storage.dcsanshi = true;
num = get.rand(0, ui.cardPile.childNodes.length - 1);
}
}
player.addSkill("dcsanshi_mark");
},
subSkill: {
gain: {
audio: "dcsanshi",
trigger: { global: "phaseEnd" },
filter(event, player) {
return game.hasGlobalHistory("cardMove", (evt) => {
if (evt.name == "lose") {
if (evt.position !== ui.discardPile) return false;
} else if (evt.name !== "cardsDiscard") return false;
if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) {
return evt.cards.some((card) => {
return card.storage.dcsanshi && get.position(card) === "d";
});
}
return false;
});
},
forced: true,
notUseOrRespond(event, player) {
if (event.name !== "cardsDiscard") return true;
const evtx = event.getParent();
if (evtx.name !== "orderingDiscard") return true;
const evt2 = evtx.relatedEvent || evtx.getParent();
return !["useCard", "respond"].includes(evt2.name) || evt2.player !== player;
},
async content(event, trigger, player) {
const cards = [];
game.checkGlobalHistory("cardMove", (evt) => {
if (evt.name == "lose") {
if (evt.position !== ui.discardPile) return false;
} else if (evt.name !== "cardsDiscard") return false;
if (lib.skill.dcsanshi_gain.notUseOrRespond(evt, player)) {
cards.addArray(
evt.cards.filter((card) => {
return card.storage.dcsanshi && get.position(card) === "d";
})
);
}
});
if (cards.length) player.gain(cards, "gain2");
},
},
directHit: {
audio: "dcsanshi",
trigger: { player: "useCard" },
forced: true,
filter(event, player) {
return (
event.cards &&
event.cards.some((card) => {
return card.storage.dcsanshi;
})
);
},
async content(event, trigger, player) {
trigger.directHit.addArray(game.filterPlayer());
game.log(trigger.card, "不可被响应");
},
},
mark: {
trigger: {
player: "gainEnd",
global: "loseAsyncEnd",
},
forced: true,
popup: false,
silent: true,
lastDo: true,
filter(event, player) {
if (
!["dcsanshi", "dcchenlve"].every((skill) =>
player.hasSkill(skill, null, false, false)
)
)
return false;
const cards = event.getg(player);
if (!cards.length) return false;
return cards.some((card) => card.storage.dcsanshi);
},
async content(event, trigger, player) {
var cards = trigger.getg(player);
if (cards.length) {
cards = cards.filter((card) => card.storage.dcsanshi);
player.addGaintag(cards, "dcsanshi_tag");
}
},
},
},
ai: {
threaten: 3,
},
},
dczhenrao: {
audio: 2,
trigger: { global: "useCardToPlayered" },
filter(event, player) {
if (
(() => {
if (event.player === player) {
if (!event.isFirstTarget) return false;
return event.targets.some((target) => target !== player);
}
return event.target === player;
})()
) {
return event.targets.concat(event.player).some((target) => {
return (
target.countCards("h") > player.countCards("h") &&
!player.getStorage("dczhenrao").includes(target)
);
});
}
return false;
},
direct: true,
async content(event, trigger, player) {
const result = await player
.chooseTarget(
get.prompt("dczhenrao"),
"对一名可选角色造成1点伤害",
(card, player, target) => {
return (
get.event("targets").includes(target) &&
!player.getStorage("dczhenrao").includes(target)
);
}
)
.set(
"targets",
trigger.targets
.concat(trigger.player)
.filter((target) => target.countCards("h") > player.countCards("h"))
)
.set("ai", (target) => {
const player = get.player();
return get.damageEffect(target, player, player);
})
.forResult();
if (!result.bool) return;
const target = result.targets[0];
player.logSkill("dczhenrao", target);
await target.damage();
await game.asyncDelayx();
if (!player.storage.dczhenrao) {
player.when({ global: "phaseAfter" }).then(() => player.unmarkSkill("dczhenrao"));
}
player.markAuto("dczhenrao", target);
},
intro: {
content: "已以此法对$造成过伤害",
onunmark: true,
},
ai: {
expose: 0.2,
threaten: 3,
},
},
dcchenlve: {
audio: 2,
enable: "phaseUse",
limited: true,
skillAnimation: true,
animationColor: "thunder",
filterCard: () => false,
selectCard: [-2, -1],
async content(event, trigger, player) {
player.awakenSkill("dcchenlve");
const cards = ["cardPile", "discardPile"]
.map((pos) => Array.from(ui[pos].childNodes))
.flat();
const sishiList = [];
const isSishi = (card) => card.storage.dcsanshi;
const lose_list = [],
players = game.filterPlayer();
players.forEach((current) => {
const pos = "ej" + (current === player ? "h" : "");
const sishis = current.getCards(pos, isSishi);
if (sishis.length > 0) {
current.$throw(sishis);
lose_list.push([current, sishis]);
sishiList.addArray(sishis);
}
});
if (lose_list.length) {
await game.loseAsync({ lose_list }).setContent("chooseToCompareLose");
}
sishiList.addArray(cards.filter(isSishi));
if (lose_list.length) await game.asyncDelayx();
player.gain(sishiList, "gain2");
player
.when("phaseEnd")
.filter((evt) => evt === event.getParent("phase"))
.vars({
sishiList,
})
.then(() => {
const lose_list = [],
players = game.filterPlayer();
players.forEach((current) => {
const cards = current
.getCards("hej")
.filter((card) => sishiList.includes(card));
if (cards.length > 0) {
current.$throw(cards);
lose_list.push([current, cards]);
}
});
if (lose_list.length) {
game.loseAsync({ lose_list }).setContent("chooseToCompareLose");
}
})
.then(() => {
game.cardsGotoSpecial(sishiList);
game.log(sishiList, "被移出了游戏");
});
player
.when("die")
.vars({
sishiList,
})
.assign({
forceDie: true,
})
.then(() => {
game.cardsDiscard(sishiList);
game.log(sishiList, "被置入了弃牌堆");
});
},
ai: {
order: 0.5,
result: {
player(player) {
if (player.getHp(true) > 1 && player.countCards("he") > 1) return 0;
if (
!player.isDamaged() &&
(player.countCards("h") > 1 || player.countCards("e") > 0)
)
return 0;
return 13;
},
},
combo: "dcsanshi",
},
},
//王凌
dcjichou: {
audio: 2,
trigger: { player: "phaseUseEnd" },
filter(event, player) {
const evts = player.getHistory("useCard", (evt) => evt.getParent("phaseUse") === event);
const names = evts.map((evt) => evt.card.name).unique();
return (
evts.length > 0 &&
evts.length === names.length &&
evts.some((evt) => evt.cards.some((card) => get.position(card) === "d"))
);
},
async content(event, trigger, player) {
const cards = [];
player.checkHistory("useCard", (evt) => {
if (evt.getParent("phaseUse") !== trigger) return;
cards.addArray(evt.cards.filterInD("d"));
});
const num = Math.min(cards.length, game.countPlayer());
if (_status.connectMode)
game.broadcastAll(() => {
_status.noclearcountdown = true;
});
const [bool, links] = await player
.chooseButton([
`集筹:将${
num < cards.length ? "至多" + get.cnNumber(num) + "张牌" : "任意张牌"
}交给等量角色`,
cards,
])
.set("selectButton", [1, num])
.set("population", [
game.countPlayer((current) => get.attitude(player, current) > 0),
game.countPlayer((current) => get.attitude(player, current) < 0),
])
.set("ai", (button) => {
const card = button.link,
population = get.event("population");
if (ui.selected.buttons.length > population[0] + population[1]) return 0;
if (ui.selected.buttons.length > get.event("population")[0])
return 2 - get.value(card);
return 2 + get.value(card);
})
.forResult("bool", "links");
if (bool) {
const [bool, targets] = await player
.chooseTarget(
`集筹:请选择${get.cnNumber(links.length)}名角色`,
`操作提示:请按照顺序选择要交给牌的目标,令这些角色按顺序获得这些牌:${get.translation(
links
)}`,
true,
links.length
)
.set(
"values",
links.map((i) => get.value(i))
)
.set("ai", (target) => {
const att = get.attitude(get.player(), target);
const chosenNum = ui.selected.targets.length,
values = get.event("values");
if (values[chosenNum] > 0) return att;
return 0.01 - att;
})
.forResult("bool", "targets");
if (_status.connectMode) {
game.broadcastAll(() => {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
if (bool) {
const gain_list = [],
givenCards = [];
targets.forEach((target, i) => {
player.line(target, "green");
gain_list.push([target, links[i]]);
givenCards.push(links[i]);
game.log(player, "将", links[i], "交给了", target);
});
event.getParent().set("givenCards", givenCards);
await game
.loseAsync({
gain_list,
player: player,
cards: givenCards,
giver: player,
animate: "gain2",
})
.setContent("gaincardMultiple");
const toDraw = player.getAllHistory("useSkill", (evt) => {
const evtx = evt.event;
return evt.skill === "dcjichou" && evtx.givenCards && evtx.givenCards.length;
})[0].event.givenCards.length;
await game.asyncDelayx();
await player.draw(toDraw);
}
}
if (_status.connectMode) {
game.broadcastAll(() => {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
},
},
dcmouli: {
audio: 2,
trigger: { player: "phaseEnd" },
filter(event, player) {
const names = [];
player.checkAllHistory("useSkill", (evt) => {
if (evt.skill !== "dcjichou") return;
const evtx = evt.event;
if (evtx.givenCards)
names.addArray(evtx.givenCards.map((card) => get.name(card, false)));
});
return names.length >= 5;
},
forced: true,
juexingji: true,
skillAnimation: true,
animationColor: "water",
derivation: ["dczifu"],
async content(event, trigger, player) {
player.awakenSkill("dcmouli");
await player.gainMaxHp();
await player.recover();
await player.addSkills("dczifu");
},
ai: {
combo: "dcjichou",
},
},
dczifu: {
audio: 2,
trigger: { player: "phaseUseBegin" },
forced: true,
async content(event, trigger, player) {
const maxLimit = Math.min(5, player.maxHp);
let count = player.countCards("h");
if (count < maxLimit) {
await player.draw(maxLimit - count);
}
if (!player.hasHistory("gain", (evt) => evt.getParent(2) === event)) return;
count = player.countCards("h");
const toKeepCount = player
.getCards("h")
.map((card) => get.name(card))
.unique();
if (count > toKeepCount) {
const [bool, cards] = await player
.chooseCard(
"自缚:选择要保留的手牌",
"选择不同牌名的手牌各一张,然后弃置其余手牌",
toKeepCount
)
.set("filterCard", (card) => {
if (!ui.selected.cards.length) return true;
const name = get.name(card, player);
if (ui.selected.cards.some((card) => get.name(card, player) === name))
return false;
return true;
})
.set("complexCard", true)
.set("ai", get.value)
.forResult("bool", "cards");
if (!bool) return;
const toDiscard = player.getCards("h").removeArray(cards);
if (toDiscard.length) player.discard(toDiscard);
}
},
ai: {
halfneg: true,
},
},
//蒋济
dcshiju: {
audio: 2,
global: "dcshiju_global",
subSkill: {
global: {
audio: "dcshiju",
forceaudio: true,
enable: "phaseUse",
usable: 1,
filter(event, player) {
return game.hasPlayer((current) => {
if (current == player || !current.hasSkill("dcshiju")) return false;
return player.countCards("he");
});
},
filterTarget(card, player, target) {
return target != player && target.hasSkill("dcshiju");
},
selectTarget() {
const num = game.countPlayer((current) => {
return current.hasSkill("dcshiju");
});
return num > 1 ? 1 : -1;
},
filterCard: true,
position: "he",
check(card) {
const player = get.player();
if (get.type(card) === "equip") {
const subtype = get.subtype(card);
let valueFix = 0;
if (
game.hasPlayer((current) => {
if (current == player || !current.hasSkill("dcshiju")) return false;
if (current.hasUseTarget(card) && !player.countEmptySlot(subtype))
return true;
})
)
valueFix += 5;
if (player.countCards("he", { subtype }) > 1) {
return valueFix + 12 - get.equipValue(card);
}
return valueFix + 6 - get.value(card);
}
return 4 - get.value(card);
},
prompt() {
const list = game.filterPlayer((current) => {
return current.hasSkill("dcshiju");
});
return `将一张牌交给${get.translation(list)}${
list.length > 1 ? "中的一人" : ""
},若此牌为装备牌,其可以使用之,且你本回合的攻击范围+X(X为其装备区的牌数)。若其以此法替换了装备,你与其各摸两张牌。`;
},
discard: false,
lose: false,
prepare(cards, player, targets) {
player.$give(cards, targets[0], false);
},
async content(event, trigger, player) {
const card = event.cards[0],
target = event.target;
await player.give(card, target);
if (!target.getCards("h").includes(card) || get.type(card) !== "equip") return;
const bool = await target.chooseUseTarget(card).forResultBool();
if (!bool) return;
const count = target.countCards("e");
if (count > 0) {
player.addTempSkill("dcshiju_range");
player.addMark("dcshiju_range", count, false);
if (
target.hasHistory("lose", (evt) => {
return (
evt.getParent().name === "equip" &&
evt.getParent(5) === event &&
evt.es &&
evt.es.length > 0
);
})
) {
for (const current of [player, target]) await current.draw(2);
}
}
},
ai: {
order: 10,
result: {
target(player, target) {
const card = ui.selected.cards[0];
if (!card) return;
if (target.hasSkillTag("nogain") && get.type(card) != "equip") return 0;
if (card.name == "du" && target.hasSkillTag("nodu")) return 0;
if (get.value(card) < 0) return -5;
const nh = target.countCards("h");
return Math.max(1, 5 - nh);
},
},
},
},
range: {
charlotte: true,
onremove: true,
mod: {
attackRange: function (player, num) {
return num + player.countMark("dcshiju_range");
},
},
intro: { content: "本回合攻击范围+#" },
},
},
},
dcyingshi: {
audio: 2,
trigger: { player: "useCardToPlayered" },
filter(event, player) {
if (!event.isFirstTarget) return false;
if (get.type(event.card) !== "trick") return false;
return true;
},
direct: true,
async content(event, trigger, player) {
const result = await player
.chooseTarget()
.set("prompt", get.prompt("dcyingshi"))
.set(
"prompt2",
`令其中一名角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation(
trigger.card.name
)};⒉弃置${get.cnNumber(player.countCards("e"))}张牌,此牌对其无效。`
)
.set("filterTarget", (card, player, target) => {
return get.event("targets").includes(target);
})
.set("targets", trigger.targets)
.set(
"toFriends",
(() => {
const isPositive = trigger.targets.some((current) => {
return get.effect(current, trigger.card, trigger.player, player) > 0;
}),
isNegative = trigger.targets.some((current) => {
return get.effect(current, trigger.card, trigger.player, player) < -5;
});
if (
(player.hasSkill("dcyingshi_choice1") || player.countCards("e") < 2) &&
isNegative
)
return true;
if (
!player.hasSkill("dcyingshi_choice1") &&
((get.tag(trigger.card, "norepeat") && isNegative) || isPositive)
)
return true;
return false;
})()
)
.set("ai", (target) => {
const player = get.player(),
count = player.countCards("e"),
att = get.attitude(player, target);
if (att > 0 && get.event("toFriends")) {
if (target.countCards("he", (card) => get.value(card) < 5) < count) return 0;
return att;
}
if (player.hasSkill("dcyingshi_choice1") && !count) return 0;
return -get.attitude(player, target);
})
.forResult();
if (!result.bool) return;
const target = result.targets[0];
player.logSkill("dcyingshi", target);
let bool;
if (!player.hasSkill(`dcyingshi_choice2`)) {
const count = player.countCards("e"),
forced = player.hasSkill("dcyingshi_choice1");
if (count > 0) {
const prompt = `###${get.translation(player)}对你发动了【应时】###${
forced ? "请" : "是否"
}弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${
forced ? "。" : "?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。"
}`;
bool = await target
.chooseToDiscard(prompt, count, forced, "he")
.set("ai", (card) => {
if (get.event("goon")) return 5.5 - get.value(card);
return 0;
})
.set(
"goon",
!get.tag(trigger.card, "norepeat") &&
get.effect(target, trigger.card, trigger.player, target) < -5
)
.forResultBool();
} else bool = false;
} else bool = player.hasSkill("dcyingshi_choice1");
if (bool) {
trigger.excluded.add(target);
} else {
player
.when({ global: "useCardAfter" })
.filter((evt) => evt === trigger.getParent())
.vars({
targetx: target,
cardx: {
name: trigger.card.name,
nature: trigger.card.nature,
isCard: true,
storage: { dcyingshi: true },
},
})
.then(() => {
const next = player.useCard(get.copy(cardx), targetx, false);
if (trigger.addedTarget) next.addedTarget = trigger.addedTarget;
if (trigger.addedTargets && trigger.addedTargets.length)
next.addedTargets = trigger.addedTargets.slice(0);
});
}
player.addTempSkill(`dcyingshi_choice${bool + 1}`);
},
subSkill: {
choice1: { charlotte: true },
choice2: { charlotte: true },
},
},
//公孙修
dcgangu: {
audio: 2,
trigger: { global: "loseHpAfter" },
filter(event, player) {
return event.player !== player;
},
usable: 1,
forced: true,
async content(event, trigger, player) {
await player.draw(2);
await player.loseHp();
},
},
dckuizhen: {
audio: 2,
enable: "phaseUse",
filter(event, player) {
return game.hasPlayer((current) => {
return lib.skill.dckuizhen.filterTarget(null, player, current);
});
},
filterTarget(card, player, target) {
return target.countCards("h") > player.countCards("h") || target.getHp() > player.getHp();
},
usable: 1,
forced: true,
async content(event, trigger, player) {
const { target } = event,
juedou = new lib.element.VCard({ name: "juedou" });
if (target.canUse(juedou, player, false)) {
await target.useCard(juedou, player, "noai");
}
if (
player.hasHistory("damage", (evt) => {
return evt.getParent(3) === event;
})
) {
await player.viewHandcards(target);
const shas = target
.getGainableCards(player, "h")
.filter((card) => get.name(card) === "sha");
if (shas.length) {
player.addTempSkill("dckuizhen_effect");
await player.gain(shas, "give", target).gaintag.add("dckuizhen");
}
} else {
await target.loseHp();
}
},
ai: {
result: {
target(player, target) {
const [juedouEff, loseEff] = [
get.effect(player, { name: "juedou" }, target, player),
get.effect(target, { name: "losehp" }, target, player),
];
if (juedouEff > 0) return (loseEff * get.attitude(player, target)) / 10;
return 0;
},
},
},
subSkill: {
effect: {
trigger: { player: "useCard1" },
forced: true,
popup: false,
firstDo: true,
charlotte: true,
filter: function (event, player) {
if (event.addCount === false) return false;
return player.hasHistory("lose", (evt) => {
if (evt.getParent() != event) return false;
for (const i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("dckuizhen")) return true;
}
return false;
});
},
async content(event, trigger, player) {
trigger.addCount = false;
var stat = player.getStat().card,
name = trigger.card.name;
if (typeof stat[name] == "number") stat[name]--;
},
mod: {
cardUsable(card) {
if (!card.cards) return;
if (card.cards.some((card) => card.hasGaintag("dckuizhen"))) return Infinity;
},
},
},
},
},
//刘理
dcfuli: {
audio: 2,
enable: "phaseUse",
filter(event, player) {
return player.countDiscardableCards(player, "h");
},
usable: 1,
async content(event, trigger, player) {
await player.showHandcards(get.translation(player) + "发动了【抚黎】");
const getNum = (type) => {
let num = ["basic", "trick", "equip"].indexOf(type);
if (num === -1) num = 3;
return num;
};
const types = player
.getDiscardableCards(player, "h")
.reduce((list, card) => {
return list.add(get.type2(card));
}, [])
.sort((a, b) => getNum(a) - getNum(b));
if (types.length) {
const {
result: { control },
} = await player
.chooseControl(types)
.set("ai", () => {
const player = get.event("player"),
types = get.event("controls").slice();
const getNum = (type) => {
const cards = player
.getDiscardableCards(player, "h")
.filter((card) => get.type2(card) == type);
const countCards = (target, player, cards) => {
return target.countCards("h") - (target == player ? cards.length : 0);
};
const max = game
.findPlayer((target) => {
return !game.hasPlayer((target2) => {
return (
countCards(target2, player, cards) >
countCards(target, player, cards)
);
});
})
.countCards("h");
return (
Math.min(
max,
cards.reduce((sum, card) => sum + get.cardNameLength(card), 0)
) / cards.length
);
};
return types.sort((a, b) => {
return getNum(b) - getNum(a);
})[0];
})
.set("prompt", "弃置一种类别的所有手牌,然后摸这些牌的名字字数之和的牌");
if (control) {
const cards = player
.getDiscardableCards(player, "h")
.filter((card) => get.type2(card) == control);
await player.discard(cards);
const max = game.findPlayer((target) => target.isMaxHandcard()).countCards("h");
const num = Math.min(
max,
cards.reduce((sum, card) => sum + get.cardNameLength(card), 0)
);
if (num) await player.draw(num);
if (cards.some((card) => card.name != "shandian" && get.tag(card, "damage"))) {
const {
result: { bool, targets },
} = await player
.chooseTarget("抚黎:是否令一名角色的攻击范围-1直到你的下个回合开始?")
.set("ai", (target) => {
const player = get.event("player"),
num = target.getAttackRange();
return (
-get.sgn(get.attitude(player, target)) *
(target.getAttackRange() + (num <= 0 ? -num + 0.5 : num))
);
});
if (bool) {
const target = targets[0];
player.line(target);
target.addSkill("dcfuli_range");
target.addMark("dcfuli_range", 1, false);
player
.when(["phaseBegin", "dieBegin"])
.then(() => {
target.removeMark("dcfuli_range", 1, false);
if (!target.hasMark("dcfuli_range"))
target.removeSkill("dcfuli_range");
})
.vars({ target: target });
}
}
}
}
},
ai: {
order: 1,
result: {
player(player) {
const types = player.getDiscardableCards(player, "h").reduce((list, card) => {
return list.add(get.type2(card));
}, []);
if (
!types.some((type) => {
const cards = player
.getDiscardableCards(player, "h")
.filter((card) => get.type2(card) == type);
const countCards = (target, player, cards) => {
return target.countCards("h") - (target == player ? cards.length : 0);
};
return !game
.filterPlayer((target) => {
return !game.hasPlayer((target2) => {
return (
countCards(target2, player, cards) >
countCards(target, player, cards)
);
});
})
.includes(player);
})
)
return 0;
return 1;
},
},
},
subSkill: {
range: {
charlotte: true,
onremove: true,
mod: {
attackRange(player, num) {
return num - player.countMark("dcfuli_range");
},
},
marktext: " - ",
intro: { content: "攻击范围-#" },
},
},
},
dcdehua: {
audio: 2,
trigger: { global: "roundStart" },
forced: true,
async content(event, trigger, player) {
const list = lib.inpile.filter((name) => {
if (get.type(name) === "delay") return false;
const card = new lib.element.VCard({ name: name });
return get.tag(card, "damage") && player.hasUseTarget(card);
});
if (list.length) {
const {
result: { bool, links },
} = await player
.chooseButton(
[
'###德化###
视为使用一张仍可以使用的伤害类卡牌
',
[list, "vcard"],
],
true
)
.set("ai", (button) => {
const name = button.link[2],
player = get.player();
let value = player.getUseValue({ name, isCard: true }, null, true);
if (
player.countCards(
"h",
(card) => get.name(card) === name && player.hasUseTarget(card)
)
)
value /= 3;
if (name === "sha") value /= 2;
if (player.getStorage("dcdehua").includes("sha"))
value = Math.max(0.1, value);
return value;
});
if (bool) {
const name = links[0][2],
card = new lib.element.VCard({ name: name });
await player.chooseUseTarget(card, true);
player.markAuto("dcdehua", [name]);
}
}
if (
!lib.inpile.some((name) => {
if (get.type(name) === "delay") return false;
const card = new lib.element.VCard({ name: name });
return get.tag(card, "damage") && !player.getStorage("dcdehua").includes(name);
})
)
player.removeSkills("dcdehua");
},
mod: {
maxHandcard(player, num) {
return num + player.getStorage("dcdehua").length;
},
cardEnabled(card, player) {
if (
player.getStorage("dcdehua").includes(card.name) &&
(get.position(card) == "h" ||
(card.cards && card.cards.some((i) => get.position(i) == "h")))
)
return false;
},
cardSavable(card, player) {
if (
player.getStorage("dcdehua").includes(card.name) &&
(get.position(card) == "h" ||
(card.cards && card.cards.some((i) => get.position(i) == "h")))
)
return false;
},
aiValue(player, card) {
if (player.getStorage("dcdehua").includes(get.name(card))) return 0;
},
aiUseful() {
return lib.skill.dcdehua.mod.aiValue.apply(this, arguments);
},
},
intro: {
content(storage) {
return (
"手牌上限+" +
storage.length +
"
不能从手牌中使用" +
get.translation(storage)
);
},
},
},
//蒋琬费祎
dcshengxi: {
inherit: "reshengxi",
trigger: { player: "phaseDiscardEnd" },
},
dcshoucheng: {
audio: "shoucheng",
global: "dcshoucheng_ai",
trigger: {
global: [
"equipAfter",
"addJudgeAfter",
"loseAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
filter(event, player) {
const target = _status.currentPhase;
return game.hasPlayer((current) => {
if (target && current == target) return false;
let evt = event.getl(current);
return evt && evt.hs && evt.hs.length && current.countCards("h") == 0;
});
},
async cost(event, trigger, player) {
const targetx = _status.currentPhase;
const targets = game
.filterPlayer((current) => {
if (targetx && current == targetx || !current.isIn()) return false;
let evt = trigger.getl(current);
return evt && evt.hs && evt.hs.length && current.countCards("h") == 0;
})
.sortBySeat(targetx || player);
event.result = await player
.chooseTarget("是否对" + (targets.length > 1 ? "其中一名角色" : get.translation(targets[0])) + "发动【守成】?",
"令其摸两张牌",
(card, player, target) => {
return get.event("targets").includes(target);
}
)
.set("targets", targets)
.set("ai", target => get.attitude(get.event("player"), target))
.forResult();
},
usable: 1,
async content(event, trigger, player) {
const target = event.targets[0];
if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2);
target.draw(2);
},
subSkill: {
ai: {
ai: {
noh: true,
skillTagFilter(player, tag, arg) {
if (player === _status.currentPhase || player.countCards("h") != 1)
return false;
return game.hasPlayer((current) => {
return (
current.hasSkill("dcshoucheng") && get.attitude(current, player) > 0
);
});
},
},
},
},
},
//乐大乔
dczixi: {
init() {
game.addGlobalSkill("dczixi_judge");
game.broadcastAll(() => lib.skill.dczixi.video());
},
video() {
const list = lib.skill.dczixi.zixiList;
for (const name of list) {
const namex = "dczixi_" + name;
if (!lib.card[namex]) {
lib.card[namex] = {
type: "special_delay",
fullskin: true,
noEffect: true,
wuxieable: false,
};
lib.card[namex].cardimage = name;
lib.translate[namex] = lib.translate[name] + "·姊希";
lib.translate[namex + "_info"] =
"由【姊希】技能创造的无效果【" + lib.translate[name] + "】";
}
}
},
audio: 2,
trigger: { player: ["phaseUseBegin", "phaseUseEnd"] },
filter(event, player) {
return (
player.countCards("h", (card) => {
return (
card.hasGaintag("dcqiqin_tag") &&
lib.skill.dczixi.zixiList.some((name) => {
return game.hasPlayer((target) =>
target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))
);
})
);
}) > 0
);
},
zixiList: ["lebu", "bingliang", "shandian"],
direct: true,
async content(event, trigger, player) {
game.addVideo("skill", player, ["dczixi", []]);
const names = lib.skill.dczixi.zixiList.filter((name) => {
return player.countCards("h", (card) => {
return (
card.hasGaintag("dcqiqin_tag") &&
game.hasPlayer((target) =>
target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))
)
);
});
});
let map = {};
for (const name of names) {
map[get.translation(name)] = name;
}
const {
result: { bool, links },
} = await player
.chooseButton(2, [
"###" +
get.prompt("dczixi") +
'###将一张“琴”以你选择的牌名置于一名角色的判定区
',
player.getCards("h"),
[Object.keys(map), "tdnodes"],
])
.set("filterButton", (button) => {
const type = typeof button.link,
card = button.link;
if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link)
return false;
if (type == "string") return true;
return (
card.hasGaintag("dcqiqin_tag") &&
lib.skill.dczixi.zixiList.some((name) => {
return game.hasPlayer((target) =>
target.canAddJudge(get.autoViewAs({ name: "dczixi_" + name }, [card]))
);
})
);
})
.set("ai", (button) => {
const player = get.event("player"),
list = Object.keys(get.event("map"));
if (typeof button.link == "string") {
const card = player
.getCards("h", (card) => {
if (get.value(card) >= 7) return false;
return (
card.hasGaintag("dcqiqin_tag") &&
game.hasPlayer((target) =>
target.canAddJudge(
get.autoViewAs({ name: "dczixi_" + name }, [card])
)
)
);
})
.sort((a, b) => get.value(a) - get.value(b))[0];
if (
game.hasPlayer((current) => {
return (
get.attitude(player, current) < 0 &&
lib.skill.dczixi.zixiList.some((name) =>
current.canAddJudge(
get.autoViewAs({ name: "dczixi_" + name }, [card])
)
)
);
})
)
return list.indexOf(button.link) + 1;
return 1 / (list.indexOf(button.link) + 1);
}
return 7 - get.value(button.link);
})
.set("map", map);
if (bool) {
const name = links.find((i) => typeof i == "string"),
card = links.find((j) => j != name),
cardname = map[name];
const {
result: { bool, targets },
} = await player
.chooseTarget(
"请选择【" + name + "(" + get.translation(card) + ")】置入的目标",
(cardx, player, target) => {
return target.canAddJudge(
get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [
get.event("card"),
])
);
},
true
)
.set("ai", (target) => {
const player = get.event("player"),
card = get.event("card");
if (
game.hasPlayer((current) => {
return (
get.attitude(player, current) < 0 &&
current.canAddJudge(
get.autoViewAs({ name: "dczixi_" + get.event("cardname") }, [
card,
])
)
);
})
)
return -target.countCards("j") - 1;
return target.countCards("j") + 1;
})
.set("card", card)
.set("cardname", cardname);
if (bool) {
const target = targets[0];
player.logSkill("dczixi", target);
player.$give(card, target, false);
await game.asyncDelay(0.5);
target.addJudge({ name: "dczixi_" + cardname }, [card]);
}
}
},
group: "dczixi_effect",
subSkill: {
judge: {
mod: {
targetEnabled(card, player, target) {
const list = lib.skill.dczixi.zixiList;
const name =
typeof card == "string" ? card : card.viewAs ? card.viewAs : card.name;
if (name.indexOf("dczixi_") == 0) {
const namex = name.slice("dczixi_".length);
if (list.includes(namex) && target.hasJudge(namex)) return false;
} else if (list.includes(name) && target.hasJudge("dczixi_" + name))
return false;
},
},
ai: {
threaten(player, target) {
if (!player.hasSkill("dczixi") || ![1, 2, 3].includes(target.countCards("j")))
return;
return 3 + target.countCards("j");
},
},
},
effect: {
audio: "dczixi",
trigger: { player: "useCardToTargeted" },
filter(event, player) {
return (
event.isFirstTarget &&
event.targets.length == 1 &&
[1, 2, 3].includes(event.target.countCards("j")) &&
(get.type(event.card) == "basic" || get.type(event.card) == "trick")
);
},
prompt2(event, player) {
const target = event.target,
str = get.translation(target);
return [
"令" + get.translation(event.card) + "对" + str + "额外结算一次",
"摸两张牌",
"弃置" + str + "判定区里的所有牌,对其造成3点伤害",
][target.countCards("j") - 1];
},
check(event, player) {
const target = event.target,
num = target.countCards("j");
if (num == 2) return true;
if (num == 1) return get.effect(target, event.card, player, player) > 0;
return (
get.attitude(player, target) < 0 &&
get.damageEffect(target, player, player) > 0
);
},
logTarget: "target",
async content(event, trigger, player) {
const target = trigger.target,
num = target.countCards("j");
switch (num) {
case 1:
trigger.getParent().effectCount++;
game.log(trigger.card, "额外结算一次");
break;
case 2:
player.draw(2);
break;
case 3:
target.discard(target.getCards("j")).discarder = player;
target.damage(3);
break;
}
},
},
},
},
//孔融
dckrmingshi: {
audio: "mingshi",
trigger: { player: "damageBegin4" },
filter(event, player) {
return event.source && event.source.countCards("h") > player.countCards("h");
},
forced: true,
logTarget: "source",
async content(event, trigger, player) {
const target = trigger.source;
const {
result: { bool },
} = await target
.chooseToDiscard(
"名士:弃置一张手牌,或防止对" + get.translation(player) + "造成的伤害"
)
.set("ai", (card) => {
if (get.event("goon")) return 0;
return 6 - get.value(card);
})
.set("goon", get.damageEffect(player, target, target) <= 0);
if (!bool) trigger.cancel();
},
ai: {
effect: {
target_use(card, player, target, current) {
if (get.tag(card, "damage") && target != player) {
if (_status.event.name == "dckrmingshi") return;
if (get.attitude(player, target) > 0 && current < 0) return "zerotarget";
var bs = player.getCards("h");
bs.remove(card);
if (card.cards) bs.removeArray(card.cards);
else bs.removeArray(ui.selected.cards);
if (bs.length > target.countCards("h")) {
if (bs.some((bsi) => get.value(bsi) < 7)) return [1, 0, 1, -0.5];
return [1, 0, 0.3, 0];
}
return [1, 0, 1, -0.5];
}
},
},
},
},
//新服SP孟获
dcmanwang: {
audio: "spmanwang",
inherit: "spmanwang",
check: function (card) {
var player = _status.event.player;
var max = Math.min(player.isDamaged() ? 3 : 2, 4 - player.countMark("dcmanwang"));
if (!max && !player.hasSkill("dcpanqin")) return 0;
if (max == 0 && ui.selected.length > 0) return 0;
return 7 - ui.selected.cards.length - get.value(card);
},
content: function () {
var num = Math.min(cards.length, 4 - player.countMark("dcmanwang"));
if (num >= 1) player.addSkills("dcpanqin");
if (num >= 2) player.draw();
if (num >= 3) player.recover();
if (num >= 4) {
player.draw(2);
player.removeSkills("dcpanqin");
}
},
ai: {
order: 2,
result: {
player: function (player, target) {
if (player.getUseValue({ name: "nanman" }) <= 0) return 0;
if (player.getStat("skill").spmanwang && player.hasSkill("dcpanqin")) return 0;
return 1;
},
},
},
derivation: "dcpanqin",
},
dcpanqin: {
audio: "sppanqin",
inherit: "sppanqin",
content: function () {
var cards = [];
player.getHistory("lose", function (evt) {
if (evt.type != "discard" || evt.getParent(trigger.name) != trigger) return false;
for (var i of evt.cards2) {
if (get.position(i, true) == "d") {
cards.add(i);
}
}
});
player.chooseUseTarget(true, { name: "nanman" }, cards);
player.addTempSkill("dcpanqin_eff");
},
subSkill: {
eff: {
charlotte: true,
trigger: { player: "useCard" },
filter: function (event, player) {
return (
event.card.name == "nanman" &&
event.getParent(2).name == "dcpanqin" &&
player.countMark("dcmanwang") < 4 &&
player.hasSkill("dcmanwang", null, null, false) &&
event.cards.length <= event.targets.length
);
},
forced: true,
popup: false,
content: function () {
"step 0";
player.addMark("dcmanwang", 1, false);
switch (player.countMark("dcmanwang")) {
case 1:
player.draw(2);
player.removeSkills("dcpanqin");
break;
case 2:
player.recover();
break;
case 3:
player.draw();
break;
case 4:
player.addSkills("dcpanqin");
break;
}
"step 1";
player.gainMaxHp();
player.recover();
},
},
},
},
//凌操
dcdufeng: {
audio: 2,
trigger: { player: "phaseUseBegin" },
forced: true,
async content(event, trigger, player) {
const list = [];
for (let i = 1; i < 6; i++) {
if (player.isDisabled(i)) continue;
list.push("equip" + i);
}
list.push("cancel2");
const next = player.chooseControl(list);
next.set("prompt", "独锋:请废除一个装备栏,或点击“取消”失去1点体力");
next.set("ai", () => {
const list = get.event().list.slice(),
player = get.player();
if (player.hp <= 2 && list.length > 1) list.remove("cancel2");
const listx = list.filter((subtype) => !player.getEquips(subtype).length);
if (listx.length) return listx.randomGet();
return list.randomGet();
});
next.set("list", list);
const { result } = await next;
if (result.control == "cancel2") await player.loseHp();
else await player.disableEquip(result.control);
if (!player.isIn()) return;
const num = Math.min(player.countDisabled() + player.getDamagedHp(), player.maxHp);
await player.draw(num);
player.addTempSkill("dcdufeng_effect");
player.addMark("dcdufeng_effect", num, false);
},
subSkill: {
effect: {
charlotte: true,
onremove: true,
intro: {
content: "本回合攻击范围与使用【杀】的次数上限均为#",
},
mod: {
attackRangeBase(player, num) {
return player.countMark("dcdufeng_effect");
},
cardUsable(card, player, num) {
if (card.name == "sha") return player.countMark("dcdufeng_effect");
},
},
},
},
},
//小乔
dcqiqin: {
audio: 2,
audioname: ["yue_daqiao"],
trigger: {
global: "phaseBefore",
player: "enterGame",
},
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
forced: true,
content: function () {
let cards = player.getCards("h");
player.addGaintag(cards, "dcqiqin_tag");
player.markAuto("dcqiqin", cards);
},
group: "dcqiqin_restore",
subSkill: {
tag: {},
restore: {
audio: "dcqiqin",
audioname: ["yue_daqiao"],
trigger: { player: "phaseZhunbeiBegin" },
filter: function (event, player) {
const targets = game.players.slice().concat(game.dead);
return targets.some(
(target) => target.getStorage("dcqiqin").filterInD("d").length
);
},
forced: true,
content: function () {
const targets = game.players.slice().concat(game.dead);
const cards = targets.reduce(
(list, target) => list.addArray(target.getStorage("dcqiqin").filterInD("d")),
[]
);
player.gain(cards, "gain2").gaintag.add("dcqiqin_tag");
},
},
},
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dcqiqin_tag")) return true;
},
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcqiqin_tag")) return false;
},
},
},
dcweiwan: {
audio: 2,
enable: "phaseUse",
filter: (event, player) => {
return (
player.countCards(lib.skill.dcweiwan.position, (card) => {
return lib.skill.dcweiwan.filterCard(card, player);
}) &&
game.hasPlayer((target) => {
return lib.skill.dcweiwan.filterTarget(null, player, target);
})
);
},
filterCard: (card, player) => {
return card.hasGaintag("dcqiqin_tag") && lib.filter.cardDiscardable(card, player);
},
filterTarget: (card, player, target) => {
return target != player && target.countCards("he");
},
position: "h",
check: (card) => {
const player = _status.event.player;
const target = game.players.reduce(
(result, current) => {
if (current === player) return result;
const effect = Math.abs(lib.skill.dcweiwan.ai.result.target(player, current));
return effect > result[1] ? [current, effect] : result;
},
[null, 0]
)[0];
return target ? lib.skill.dcweiwan.getWeiWanEffect(player, card, target) : 0;
},
usable: 1,
content: function* (event, map) {
let player = map.player,
target = event.target;
let suit = get.suit(event.cards[0], player);
let cards = target.getCards(
"hej",
(card) =>
get.suit(card, target) != suit && lib.filter.canBeGained(card, player, target)
);
if (!cards.length) {
player.chat("无牌可得!!");
return;
}
let suits = lib.suit.slice();
suits.reverse();
suits.add("none");
suits.forEach((suit2) => {
let cards2 = cards.filter((card) => get.suit(card, target) == suit2);
if (cards2.length) {
cards2.randomRemove();
cards.removeArray(cards2);
}
});
if (!cards.length) {
player.chat("无牌可得!!");
return;
}
player.gain(cards, target, "give");
switch (cards.length) {
case 1:
target.loseHp();
break;
case 2:
player.addTempSkill("tanbei_effect3");
target.addTempSkill("tanbei_effect1");
break;
case 3:
player.addTempSkill("tanbei_effect3");
target.addTempSkill("tanbei_effect2");
break;
}
},
ai: {
order: 9,
result: {
target: (player, target) => {
const att = get.sgn(get.attitude(player, target)) - 1;
const cards = player.getCards(lib.skill.dcweiwan.position, (card) =>
lib.skill.dcweiwan.filterCard(card, player)
);
return (
att *
cards.reduce((result, card) => {
const effect = lib.skill.dcweiwan.getWeiWanEffect(player, card, target);
return effect > result ? effect : result;
}, 0)
);
},
},
combo: "dcqiqin",
},
getWeiWanEffect: (player, cardx, target) => {
const suit = get.suit(cardx, player);
const cards = target.getCards(
"hej",
(card) =>
get.suit(card, target) !== suit && lib.filter.canBeGained(card, player, target)
);
const num = lib.suits.filter((suit) =>
cards.some((card) => get.suit(card, target) === suit)
).length;
switch (num) {
case 1:
return (
num +
Math.max(0, get.sgn(get.effect(target, { name: "losehp" }, player, player)))
);
case 2:
return (
num +
player.countCards(
"he",
(card) =>
player.canUse(card, target, false) &&
get.effect(target, card, player, player) > 0
)
);
case 3:
return Math.ceil(num / 2);
default:
return num;
}
},
},
//董昭
dcyijia: {
audio: 2,
trigger: { global: "damageEnd" },
filter: function (event, player) {
if (!event.player.isIn()) return false;
if (get.distance(player, event.player) > 1) return false;
return player.canMoveCard(
null,
true,
game.filterPlayer((i) => i != event.player),
event.player,
"canReplace"
);
},
check: function (event, player) {
return player.canMoveCard(
true,
true,
game.filterPlayer((i) => i != event.player),
event.player,
"canReplace"
);
},
prompt2: function (event, player) {
return `将场上一张装备牌移动至${get.translation(
event.player
)}的装备区内(替换原装备)。然后若其因此脱离了一名角色的攻击范围,你摸一张牌。`;
},
logTarget: "player",
line: false,
content: function* (event, map) {
const player = map.player,
trigger = map.trigger,
target = trigger.player;
const inRangeList = game.filterPlayer((current) => current.inRange(target));
yield player.moveCard(
true,
game.filterPlayer((i) => i != target),
target,
"canReplace"
);
const leaveSomeone = inRangeList.some((current) => !current.inRange(target));
if (leaveSomeone) player.draw();
},
ai: {
maixie: true,
expose: 0.2,
threaten: 3.3,
},
},
dcdingji: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
direct: true,
content: function* (event, map) {
const player = map.player;
let result;
result = yield player.chooseTarget(get.prompt2("dcdingji")).set("ai", (target) => {
let att = get.attitude(get.player(), target) / 2;
const delta = 5 - target.countCards("h");
let fix = 1;
const hs = target.getCards("h");
outer: for (let i = 0; i < hs.length - 1; i++) {
const name1 = get.name(hs[i]);
for (let j = i + 1; j < hs.length; j++) {
const name2 = get.name(hs[j]);
if (name1 == name2) {
fix = 0.5;
break outer;
}
}
}
if (delta > 0) {
if (target.hasSkillTag("nogain")) att /= 3;
return Math.sqrt(delta) * att * fix;
}
if (delta > -2 && att > 0) return fix == 0.5 ? 0.1 : -1;
return (-Math.sqrt(-delta) * att) / 2;
});
if (!result.bool) return event.finish();
const target = result.targets[0];
player.logSkill("dcdingji", target);
if (target != player) player.addExpose(0.3);
const delta = 5 - target.countCards("h");
if (delta != 0) {
yield target[delta > 0 ? "draw" : "chooseToDiscard"](Math.abs(delta), true);
}
target.showHandcards();
const hs = target.getCards("h");
let hasSame = false;
outer: for (let i = 0; i < hs.length - 1; i++) {
const name1 = get.name(hs[i]);
for (let j = i + 1; j < hs.length; j++) {
const name2 = get.name(hs[j]);
if (name1 == name2) {
hasSame = true;
break outer;
}
}
}
game.delayex();
if (hasSame) return event.finish();
const list = get.inpileVCardList((info) => {
if (!["basic", "trick"].includes(info[0])) return false;
if (
!target.hasUseTarget(
new lib.element.VCard({ name: info[2], nature: info[3], isCard: true })
)
)
return false;
return hs.some((card) => {
return get.name(card) == info[2] && get.is.sameNature([card, info[3]], true);
});
});
if (!list.length) return event.finish();
result = yield target
.chooseButton(["是否视为使用其中一张牌?", [list, "vcard"]])
.set("ai", (button) => {
return get.player().getUseValue({ name: button.link[2] });
});
if (result.bool) {
target.chooseUseTarget(
new lib.element.VCard({
name: result.links[0][2],
nature: result.links[0][3],
isCard: true,
}),
true,
false
);
}
},
},
//蒯祺
dcliangxiu: {
audio: 2,
enable: "phaseUse",
filter: function (event, player) {
return player.hasCard((card) => {
const type = get.type2(card, player);
return player.hasCard((cardx) => {
if (card == cardx) return false;
return get.type2(cardx, player) != type;
}, "he");
}, "he");
},
filterCard: function (card, player) {
if (!ui.selected.cards.length) return true;
return get.type2(ui.selected.cards[0], player) != get.type2(card, player);
},
selectCard: 2,
check: function (card) {
const player = get.player();
const bannedTypes = [];
bannedTypes.addArray(player.getStorage("dcliangxiu"));
if (!ui.selected.cards.length) {
let val = get.value(card);
if (val > 5.5) return 0;
if (bannedTypes.includes(get.type2(card, player))) return 7.5 - val;
return 5.5 - val;
}
bannedTypes.addArray(ui.selected.cards.map((card) => get.type2(card, player)));
bannedTypes.add(get.type2(card, player));
const filter = (card) => !bannedTypes.includes(get.type2(card, player));
if (!get.cardPile(filter)) return 0;
return 6 - get.value(card);
},
position: "he",
complexCard: true,
onremove: true,
content: function* (event, map) {
const player = map.player;
const cards = [];
const bannedTypes = [];
bannedTypes.addArray(event.cards.map((card) => get.type2(card, player)));
bannedTypes.addArray(player.getStorage("dcliangxiu"));
const filter = (card) => !bannedTypes.includes(get.type2(card, player));
const piles = ["cardPile", "discardPile"];
for (const pile of piles) {
for (let i = 0; i < ui[pile].childNodes.length; i++) {
const card = ui[pile].childNodes[i];
if (filter(card)) {
cards.add(card);
if (cards.length >= 2) break;
}
}
if (cards.length >= 2) break;
}
let result;
if (!cards.length) {
player.chat("没牌了…");
game.log("但是哪里都找不到没有符合条件的牌!");
event.finish();
return;
} else if (cards.length == 1) result = { bool: true, links: cards };
else
result = yield player
.chooseButton(["良秀:获得一张牌", cards], true)
.set("ai", get.buttonValue);
if (result.bool) {
const toGain = result.links;
player.markAuto("dcliangxiu", get.type2(toGain[0], false));
player.when({ global: "phaseChange" }).then(() => {
player.unmarkSkill("dcliangxiu");
});
player.gain(toGain, "gain2");
}
},
intro: {
content: "已因此技能获得过$牌",
onunmark: true,
},
ai: {
order: 2,
result: { player: 1 },
},
},
dcxunjie: {
audio: 2,
trigger: { global: "phaseEnd" },
filter: function (event, player) {
if (["handcard", "hp"].every((i) => player.isTempBanned(`dcxunjie_${i}`))) return false;
return player.hasHistory("gain", (evt) => {
return !evt.getParent("phaseDraw", true);
});
},
direct: true,
content: function* (event, map) {
const player = map.player;
const choices = [];
const choiceList = [
"令一名角色将手牌数摸或弃置至与其体力值相同",
"令一名角色将体力回复或失去至与其手牌数相同",
];
if (!player.isTempBanned("dcxunjie_handcard")) choices.push("选项一");
else
choiceList[0] =
'' + choiceList[0] + "(已被选择过)";
if (!player.isTempBanned("dcxunjie_hp")) choices.push("选项二");
else
choiceList[1] =
'' + choiceList[1] + "(已被选择过)";
let result;
if (_status.connectMode)
game.broadcastAll(() => {
_status.noclearcountdown = true;
});
if (choices.length == 1) result = { control: choices[0] };
else
result = yield player
.chooseControl(choices, "cancel2")
.set("choiceList", choiceList)
.set("prompt", get.prompt("dcxunjie"))
.set("ai", () => {
return get.event("choice");
})
.set(
"choice",
(() => {
const getValue = (index, target) => {
let att = get.attitude(player, target);
att = Math.sign(att) * Math.sqrt(Math.abs(att));
let delt = target.getHp(true) - target.countCards("h");
if (index == 1 && delt < 0) delt = 0;
return (1 - 3 * index) * att * delt;
};
const list = game
.filterPlayer()
.map((current) => {
const val0 = getValue(0, current),
val1 = getValue(1, current);
return [val0, val1, Math.max(val0, val1)];
})
.sort((a, b) => {
return b[2] - a[2];
});
const toChoose = list[0];
if (toChoose[2] <= 0) return "cancel2";
return toChoose[0] > toChoose[1] ? 0 : 1;
})()
);
if (result.control == "cancel2") {
if (_status.connectMode) {
game.broadcastAll(() => {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
return event.finish();
}
let prompt = "";
const choice = result.control,
index = choice == "选项一" ? 0 : 1;
if (choices.length == 1) {
prompt = `###${get.prompt("dcxunjie")}###${
choiceList[index]
}
`;
} else
prompt = `###殉节:请选择一名角色###${choiceList[
index
].replace("一名", "该")}
`;
result = yield player
.chooseTarget(prompt)
.set("ai", (target) => {
const player = get.player(),
index = get.event("index");
let att = get.attitude(player, target);
att = Math.sign(att) * Math.sqrt(Math.abs(att));
let delt = target.getHp(true) - target.countCards("h");
if (index == 1 && delt < 0) delt = 0;
return (1 - 2 * index) * att * delt;
})
.set("index", index);
if (_status.connectMode) {
game.broadcastAll(() => {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
if (!result.bool) return event.finish();
const target = result.targets[0];
player.logSkill("dcxunjie", target);
player.tempBanSkill(`dcxunjie_${index == 0 ? "handcard" : "hp"}`, "roundStart", false);
const delt = (target.getHp(true) - target.countCards("h")) * (1 - 2 * index);
if (delt == 0) event.finish();
else if (index == 0) target[delt > 0 ? "draw" : "chooseToDiscard"](Math.abs(delt), true);
else target[delt > 0 ? "recover" : "loseHp"](Math.abs(delt));
},
},
//乐蔡邕
dcjiaowei: {
audio: 2,
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
group: "dcjiaowei_prevent",
content: function* (event, map) {
const player = map.player;
var cards = player.getCards("h");
player.addGaintag(cards, "dcjiaowei_tag");
},
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dcjiaowei_tag")) return true;
},
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcjiaowei_tag")) return false;
},
},
subSkill: {
prevent: {
audio: "dcjiaowei",
trigger: {
player: "damageBegin4",
},
forced: true,
filter: function (event, player) {
if (!event.source || !event.source.isIn()) return false;
return (
event.source.countCards("h") <=
player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag"))
);
},
content: function* (event, map) {
map.trigger.cancel();
},
ai: {
effect: {
target: function (card, player, target) {
if (get.tag(card, "damage")) {
const num = target.countCards("h", (card) =>
card.hasGaintag("dcjiaowei_tag")
);
let cards = [];
if (card.cards) cards.addArray(card.cards);
if (ui.selected.cards) cards.addArray(ui.selected.cards);
cards = cards.filter((card) => {
if (get.itemtype(card) != "card") return false;
return get.owner(card) == player && get.position(card) == "e";
});
if (player.countCards("h") - cards.length <= num)
return "zeroplayertarget";
}
},
},
},
},
},
},
dcfeibai: {
audio: 2,
trigger: { player: "useCardAfter" },
usable: 1,
locked: false,
filter: function (event, player) {
return player.getHistory("useCard").indexOf(event) > 0;
},
prompt2: function (event, player) {
const history = player.getHistory("useCard");
const ind = history.indexOf(event) - 1,
evt = history[ind];
const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card);
return `随机获得一张字数为${len}的牌`;
},
check: function (event, player) {
const history = player.getHistory("useCard");
const ind = history.indexOf(event) - 1,
evt = history[ind];
const len = get.cardNameLength(event.card) + get.cardNameLength(evt.card);
return (
player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) <= len ||
get.cardPile((card) => {
return get.cardNameLength(card, false) == len;
})
);
},
content: function* (event, map) {
const player = map.player,
trigger = map.trigger;
const history = player.getHistory("useCard");
const ind = history.indexOf(trigger) - 1,
evt = history[ind];
const len = get.cardNameLength(trigger.card) + get.cardNameLength(evt.card);
const card = get.cardPile((card) => {
return get.cardNameLength(card, false) == len;
});
if (card) {
yield player.gain(card, "gain2");
} else {
let str = `没有${len}字的牌…`;
if (len == 5 && Math.random() <= 0.2) str = "五字不行哇";
player.chat(str);
game.log(`但是找不到字数为${len}的牌!`);
}
if (player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) <= len) {
player.storage.counttrigger.dcfeibai--;
game.log(player, "重置了", "#【飞白】");
}
},
mod: {
aiOrder: function (player, card, num) {
const evt = player.getLastUsed();
if (!evt) return;
const len = get.cardNameLength(card) + get.cardNameLength(evt.card);
const cardx = get.cardPile((card) => {
return get.cardNameLength(card, false) == len;
});
if (cardx) return num + 8 + (len == 2 || len == 4 ? 2 : 0);
},
},
},
//庞山民
dccaisi: {
audio: 2,
trigger: { player: "useCardAfter" },
filter: function (event, player) {
return get.type(event.card) == "basic" && _status.currentPhase;
},
prompt2: function (event, player) {
const num = player.countMark("dccaisi_more") + 1;
return `从${player == _status.currentPhase ? "牌堆" : "弃牌"}堆中随机获得${get.cnNumber(
num
)}张非基本牌`;
},
content: function* (event, map) {
const player = map.player,
trigger = map.trigger;
const position = player == _status.currentPhase ? "cardPile" : "discardPile";
let cards = [],
num = player.countMark("dccaisi_more") + 1;
while (num > 0) {
num--;
let card = get[position](
(card) => get.type(card) != "basic" && !cards.includes(card)
);
if (card) cards.add(card);
else break;
}
if (cards.length) yield player.gain(cards, "gain2");
else {
player.chat("没有非基本牌…");
game.log(`但是${position == "discardPile" ? "弃" : ""}牌堆里没有非基本牌!`);
}
const sum = player.getHistory("useSkill", (evt) => evt.skill == "dccaisi").length;
if (sum < player.maxHp) {
player.addTempSkill("dccaisi_more");
player.addMark("dccaisi_more", 1, false);
} else player.tempBanSkill("dccaisi");
},
subSkill: { more: { charlotte: true, onremove: true } },
},
dczhuoli: {
audio: 2,
trigger: { global: "phaseEnd" },
forced: true,
filter: function (event, player) {
return (
player.getHistory("useCard").length > player.getHp() ||
player.getHistory("gain").reduce((sum, evt) => sum + evt.cards.length, 0) >
player.getHp()
);
},
content: function* (event, map) {
const player = map.player;
if (player.maxHp < game.countPlayer2()) {
yield player.gainMaxHp();
}
yield player.recover();
},
},
//魏贾充
dcbeini: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterCard: function (card, player) {
const delt = player.countCards("h") - player.maxHp;
return delt > 0;
},
selectCard: function () {
const player = get.player();
const delt = player.countCards("h") - player.maxHp;
return delt > 0 ? delt : -1;
},
promptfunc: () => {
const player = get.player();
const delt = player.countCards("h") - player.maxHp;
let str = "";
if (delt > 0) str += `弃置${get.cnNumber(delt)}张牌`;
else if (delt == 0) str += `点击“确定”`;
else str += `摸${get.cnNumber(-delt)}张牌`;
return `${str},然后选择两名角色,前者视为对后者使用一张【杀】,且这两者的非锁定技失效。`;
},
content: function* (event, map) {
var player = map.player;
if (player.countCards("h") < player.maxHp) yield player.drawTo(player.maxHp);
if (game.countPlayer() < 2) {
event.finish();
return;
}
var result = yield player
.chooseTarget(
"悖逆:请选择两名角色",
"前者视为对后者使用一张【杀】,且这两名角色的非锁定技失效直到回合结束。",
true,
2,
(card, player, target) => {
var sha = new lib.element.VCard({ name: "sha", isCard: true });
if (ui.selected.targets.length) {
var targetx = ui.selected.targets[0];
return targetx.canUse(sha, target, false);
}
return lib.filter.cardEnabled(sha, target);
}
)
.set("targetprompt", ["打人", "被打"])
.set("multitarget", true)
.set("ai", (target) => {
var aiTargets = get.event("aiTargets");
if (aiTargets) {
return aiTargets[ui.selected.targets.length] == target ? 10 : 0;
}
return 0;
})
.set(
"aiTargets",
(() => {
var targets = [],
eff = 0;
var sha = new lib.element.VCard({ name: "sha", isCard: true });
for (var user of game.filterPlayer()) {
for (var target of game.filterPlayer()) {
if (user == target) continue;
var targetsx = [user, target];
targetsx.forEach((i) => i.addSkill("dcbeini_fengyin2"));
var effx = get.effect(target, sha, user, player);
targetsx.forEach((i) => i.removeSkill("dcbeini_fengyin2"));
if (user == player) effx += 1;
if (get.attitude(player, user) > 0) effx -= 0.1;
if (effx > eff) {
eff = effx;
targets = targetsx;
}
}
}
if (targets.length) return targets;
return null;
})()
);
if (result.bool) {
var user = result.targets[0],
target = result.targets[1];
result.targets.forEach((i) => i.addTempSkill("dcbeini_fengyin"));
var sha = new lib.element.VCard({ name: "sha", isCard: true });
if (user.canUse(sha, target, false)) user.useCard(sha, target, false, "noai");
}
},
ai: {
order: 0.1,
result: {
player: function (player) {
if (player.countCards("h") - player.maxHp >= 3) return 1;
return game.hasPlayer((current) => get.attitude(player, current) <= 0) ? 1 : 0;
},
},
},
subSkill: {
fengyin: {
inherit: "fengyin",
},
fengyin2: {
inherit: "fengyin",
},
},
},
dcshizong: {
audio: 2,
enable: "chooseToUse",
hiddenCard: function (player, name) {
if (get.type(name) != "basic") return false;
return player.countCards("he") >= player.countMark("dcshizong") + 1;
},
filter: function (event, player) {
if (event.type == "wuxie" || event.dcshizong) return false;
if (player.countCards("he") < player.countMark("dcshizong") + 1) return false;
for (const name of lib.inpile) {
if (get.type(name) != "basic") continue;
const card = { name: name, isCard: true };
if (event.filterCard(card, player, event)) return true;
if (name == "sha") {
for (const nature of lib.inpile_nature) {
card.nature = nature;
if (event.filterCard(card, player, event)) return true;
}
}
}
return false;
},
chooseButton: {
dialog: function (event, player) {
const vcards = get.inpileVCardList((info) => {
if (info[0] != "basic") return;
const card = { name: info[2], nature: info[3], isCard: true };
return event.filterCard(card, player, event);
});
return ui.create.dialog("恃纵", [vcards, "vcard"], "hidden");
},
check: function (button) {
if (get.event().getParent().type != "phase") return 1;
const player = get.player();
const card = { name: button.link[2], nature: button.link[3] };
if (
game.hasPlayer((current) => {
return (
player.canUse(card, current) &&
get.effect(current, card, player, player) > 0
);
})
) {
switch (button.link[2]) {
case "tao":
return 5;
case "jiu":
return 3.01;
case "sha":
if (button.link[3] == "fire") return 2.95;
else if (button.link[3] == "thunder") return 2.92;
else return 2.9;
}
}
return 0;
},
backup: function (links, player) {
return {
filterCard: true,
filterTarget: lib.filter.notMe,
selectTarget: 1,
selectCard: () => get.player().countMark("dcshizong") + 1,
viewAs: {
name: links[0][2],
nature: links[0][3],
suit: "none",
number: null,
isCard: true,
},
position: "he",
popname: true,
ignoreMod: true,
ai1: function (card) {
return 1 / (1.1 + Math.max(-1, get.value(card)));
},
ai2: function (target) {
return get.attitude(get.player(), target);
},
precontent: function* (event, map) {
var player = map.player,
target = event.result.targets[0];
player.logSkill("dcshizong", target);
if (!player.countMark("dcshizong"))
player
.when({ global: "phaseAfter" })
.then(() => delete player.storage.dcshizong);
player.addMark("dcshizong", 1, false);
yield player.give(event.result.cards.slice(), target);
var viewAs = new lib.element.VCard({
name: event.result.card.name,
nature: event.result.card.nature,
isCard: true,
});
var result = yield target
.chooseCard(
"恃纵:是否将一张牌置于牌堆底?",
`若如此做,${get.translation(player)}视为使用一张${get.translation(
viewAs.nature
)}【${get.translation(viewAs.name)}】`,
"he"
)
.set("ai", (card) => {
if (get.event("goon")) return 7 - get.value(card);
return 0;
})
.set(
"goon",
get.attitude(target, player) * (player.getUseValue(viewAs) || 1) >= 1
);
var card = event.result.cards[0];
if (result.bool) {
var card = result.cards[0];
game.delayex();
var next = target.loseToDiscardpile(card, ui.cardPile);
next.log = false;
if (get.position(card) == "e") {
game.log(target, "将", card, "置于了牌堆底");
} else {
next.blank = true;
game.log(target, "将一张牌置于了牌堆底");
}
result = yield next;
game.broadcastAll((viewAs) => {
lib.skill.dcshizong_backup2.viewAs = viewAs;
}, lib.skill.dcshizong_backup.viewAs);
var evt = event.getParent();
evt.set("_backupevent", "dcshizong_backup2");
evt.set(
"openskilldialog",
`请选择${get.translation(viewAs.nature)}${get.translation(
viewAs.name
)}的目标`
);
evt.backup("dcshizong_backup2");
evt.set("norestore", true);
evt.set("custom", {
add: {},
replace: { window: function () {} },
});
evt.goto(0);
if (target != _status.currentPhase) player.tempBanSkill("dcshizong");
} else {
target.chat("不放!");
game.log(target, "选择不将牌置于牌堆底");
var evt = event.getParent();
evt.set("dcshizong", true);
evt.goto(0);
}
game.delayx();
},
ai: {
order: 10,
},
};
},
prompt: function (links, player) {
return `###恃纵:选择要交出的牌和目标角色###将${get.cnNumber(
player.countMark("dcshizong") + 1
)}张牌交给一名其他角色,其可以选择将一张牌置于牌堆底,视为你使用一张${get.translation(
links[0][3] || ""
)}${get.translation(links[0][2])}。`;
},
},
ai: {
order: function () {
const player = get.player(),
event = get.event();
if (
event.filterCard({ name: "jiu" }, player, event) &&
get.effect(player, { name: "jiu" }) > 0
) {
return get.order({ name: "jiu" }) + 0.1;
}
return get.order({ name: "sha" }) + 0.1;
},
respondSha: true,
fireAttack: true,
respondShan: true,
skillTagFilter: function (player, tag, arg) {
if (tag == "fireAttack") return true;
if (player.countCards("he") < player.countMark("dcshizong") + 1) return false;
if (tag == "respondSha" && arg != "use") return false;
},
result: {
player: function (player) {
if (_status.event.dying) return get.attitude(player, _status.event.dying);
return 1;
},
},
},
subSkill: {
backup: {},
backup2: {
filterCard: () => false,
selectCard: -1,
precontent: function () {
delete event.result.skill;
},
},
},
},
//张曼成
dclvecheng: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: lib.filter.notMe,
content: function () {
player.addTempSkill("dclvecheng_xiongluan");
player.markAuto("dclvecheng_xiongluan", [target]);
var cards = player.getCards("h", "sha");
if (cards.length) player.addGaintag(cards, "dclvecheng_xiongluan");
},
ai: {
threaten: 3.1,
order: 3.5,
expose: 0.2,
result: {
target: function (player, target) {
if (player.getStorage("dclvecheng_xiongluan").includes(target)) return 0;
if (
target.hasSkillTag(
"freeShan",
false,
{
player: player,
},
true
)
)
return -0.6;
var hs = player.countCards("h", (card) => {
if (!player.canUse(card, target)) return false;
return (
get.name(card) == "sha" && get.effect(target, card, player, player) > 0
);
});
var ts = target.hp;
if (hs >= ts && ts > 1) return -2;
return -1;
},
},
},
subSkill: {
xiongluan: {
trigger: { player: "phaseEnd" },
charlotte: true,
forced: true,
popup: false,
onremove: function (player, skill) {
player.removeGaintag("dclvecheng_xiongluan");
delete player.storage[skill];
},
filter: function (event, player) {
return player.getStorage("dclvecheng_xiongluan").some((i) => i.isIn());
},
content: function () {
"step 0";
event.targets = player.getStorage("dclvecheng_xiongluan").slice();
event.targets.sortBySeat();
"step 1";
if (!event.targets.length) {
event.finish();
return;
}
var target = event.targets.shift();
event.target = target;
target.showHandcards();
var cards = target.getCards("h", "sha");
if (!cards.length) event.redo();
else event.forced = false;
"step 2";
var forced = event.forced;
var prompt2 = forced
? "掠城:选择对" + get.translation(player) + "使用的【杀】"
: "掠城:是否依次对" + get.translation(player) + "使用所有的【杀】?";
target
.chooseToUse(
forced,
function (card, player, event) {
if (get.itemtype(card) != "card" || get.name(card) != "sha")
return false;
return lib.filter.filterCard.apply(this, arguments);
},
prompt2
)
.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", player);
"step 3";
if (result.bool) {
if (target.countCards("h", "sha")) {
event.forced = true;
event.goto(2);
return;
}
}
event.forced = false;
event.goto(1);
},
intro: {
content: "对$使用“掠城”【杀】无任何次数限制",
},
mod: {
cardUsableTarget: function (card, player, target) {
if (!card.cards || card.cards.length != 1) return;
if (
card.name == "sha" &&
card.cards[0].hasGaintag("dclvecheng_xiongluan") &&
player.getStorage("dclvecheng_xiongluan").includes(target)
)
return true;
},
},
},
},
},
dczhongji: {
audio: 2,
trigger: { player: "useCard" },
filter: function (event, player) {
if (player.countCards("h") >= player.maxHp) return false;
var suit = get.suit(event.card);
return !lib.suit.includes(suit) || !player.countCards("h", { suit: suit });
},
check: function (event, player) {
var num = Math.min(20, player.maxHp - player.countCards("h"));
if (num <= 0) return false;
var numx =
player.getHistory("useSkill", (evt) => {
return evt.skill == "dczhongji";
}).length + 1;
if (numx > num) return false;
if (_status.currentPhase != player) return true;
if (
player.hasCard((card) => {
var suit = get.suit(card);
return (
player.hasValueTarget(card) &&
!player.hasCard((cardx) => {
return cardx != card && get.suit(cardx) == suit;
})
);
})
)
return false;
return true;
},
prompt2: function (event, player) {
var num = Math.min(20, player.maxHp - player.countCards("h"));
var str = num > 0 ? "摸" + get.cnNumber(num) + "张牌,然后" : "";
return (
str +
"弃置" +
get.cnNumber(
1 +
player.getHistory("useSkill", (evt) => {
return evt.skill == "dczhongji";
}).length
) +
"张牌"
);
},
content: function () {
"step 0";
var num = Math.min(20, player.maxHp - player.countCards("h"));
if (num > 0) player.draw(num);
"step 1";
var num = player.getHistory("useSkill", (evt) => {
return evt.skill == "dczhongji";
}).length;
player
.chooseToDiscard("螽集:请弃置" + get.cnNumber(num) + "张牌", "he", true, num)
.set("ai", get.unuseful);
},
ai: {
threaten: 3.2,
},
},
//乐周妃
dclingkong: {
audio: 2,
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content: function () {
"step 0";
var cards = player.getCards("h");
player.addGaintag(cards, "dclingkong_tag");
},
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dclingkong_tag")) {
return true;
}
},
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dclingkong_tag")) {
return false;
}
},
},
group: "dclingkong_marker",
subSkill: {
marker: {
audio: "dclingkong",
trigger: { player: ["gainAfter", "loseAsyncAfter"] },
forced: true,
filter: (event, player) => {
if (event.getParent("phaseDraw", true)) return false;
const evt = player.getHistory("gain", (i) => !i.getParent("phaseDraw", true))[0];
if (!evt) return false;
if (event.name == "gain") {
if (evt != event || event.getlx === false) return false;
} else if (evt.getParent() != event) return false;
const hs = player.getCards("h");
if (!hs.length) return false;
const cards = event.getg(player);
return cards.some((card) => hs.includes(card));
},
content: function () {
var hs = player.getCards("h"),
cards = trigger.getg(player);
cards = cards.filter((card) => hs.includes(card));
player.addGaintag(cards, "dclingkong_tag");
game.delayx();
},
},
},
},
dcxianshu: {
audio: 2,
enable: "phaseUse",
filter: (event, player) => {
return (
game.hasPlayer((current) => current != player) &&
player.hasCard((card) => card.hasGaintag("dclingkong_tag"), "h")
);
},
filterCard: (card) => card.hasGaintag("dclingkong_tag"),
filterTarget: lib.filter.notMe,
discard: false,
lose: false,
delay: false,
position: "h",
check: (card) => {
const player = _status.event.player,
event = _status.event,
color = get.color(card);
if (color == "red") {
return (event.getTempCache("dcxianshu", "red") ||
event.putTempCache(
"dcxianshu",
"red",
game
.hasPlayer((current) => {
return (
current != player &&
current.hp <= player.hp &&
current.isDamaged() &&
get.recoverEffect(current, player, player) > 0
);
})
.toString()
)) == "true"
? 7 - get.value(card)
: 0;
} else if (color == "black") {
return (event.getTempCache("dcxianshu", "black") ||
event.putTempCache(
"dcxianshu",
"black",
game
.hasPlayer((current) => {
return (
current != player &&
current.hp >= player.hp &&
get.effect(current, { name: "losehp" }, player, player) > 0
);
})
.toString()
)) == "true"
? 7 - get.value(card)
: 0;
}
return 6 - get.value(card);
},
content: function () {
"step 0";
player.give(cards, target, true);
event.color = get.color(cards[0], player);
"step 1";
if (target.isIn()) {
var num = Math.min(Math.abs(target.getHp() - player.getHp()), 5);
if (num > 0) player.draw(num);
}
"step 2";
if (event.color == "red") {
if (target.getHp() <= player.getHp() && target.isDamaged()) target.recover();
} else if (event.color == "black") {
if (target.getHp() >= player.getHp()) target.loseHp();
}
},
ai: {
combo: "dclingkong",
order: 10,
result: {
player: function (player, target) {
if (!ui.selected.cards.length) return 0;
let num = target.getHp() - player.getHp();
const card = ui.selected.cards[0],
color = get.color(card);
if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged())
num++;
else if (color == "black" && target.getHp() >= player.getHp()) num--;
return Math.min(Math.abs(num), 5) * 1.1;
},
target: function (player, target) {
if (!ui.selected.cards.length) return 0;
const card = ui.selected.cards[0],
color = get.color(card),
val = get.value(card, target);
if (color == "red" && target.getHp() <= player.getHp() && target.isDamaged())
return get.recoverEffect(target, player, target) + val / 1.4;
else if (color == "black" && target.getHp() >= player.getHp())
return get.effect(target, { name: "losehp" }, player, target) + val / 1.4;
return val / 1.4;
},
},
},
},
//吴班
dcyouzhan: {
audio: 2,
trigger: {
global: [
"loseAfter",
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
forced: true,
direct: true,
filter: function (event, player) {
if (player != _status.currentPhase) return false;
return game.hasPlayer((current) => {
if (current == player) return false;
var evt = event.getl(current);
return evt && evt.cards2.length;
});
},
content: function () {
"step 0";
var targets = game.filterPlayer((current) => {
if (current == player) return false;
var evt = trigger.getl(current);
return evt && evt.cards2.length;
});
event.targets = targets;
player.logSkill("dcyouzhan", targets);
"step 1";
event.target = targets.shift();
event.num = trigger.getl(event.target).cards2.length;
"step 2";
player.draw().gaintag = ["dcyouzhan"];
player.addTempSkill("dcyouzhan_limit");
target.addTempSkill("dcyouzhan_effect");
target.addMark("dcyouzhan_effect", 1, false);
target.addTempSkill("dcyouzhan_draw");
if (--event.num) event.redo();
"step 3";
if (targets.length) {
event.goto(1);
}
},
ai: {
damageBonus: true,
skillTagFilter: function (player, tag, arg) {
if (!arg || !arg.target || !arg.target.hasSkill("dcyouzhan_effect")) return false;
},
},
subSkill: {
effect: {
audio: "dcyouzhan",
trigger: {
player: "damageBegin3",
},
filter: function (event, player) {
return player.hasMark("dcyouzhan_effect");
},
forced: true,
charlotte: true,
onremove: true,
content: function () {
"step 0";
trigger.num += player.countMark("dcyouzhan_effect");
player.removeSkill("dcyouzhan_effect");
},
mark: true,
intro: {
content: "本回合下一次受到的伤害+#",
},
ai: {
effect: {
target: function (card, player, target) {
if (get.tag(card, "damage"))
return 1 + 0.5 * target.countMark("dcyouzhan_effect");
},
},
},
},
draw: {
trigger: {
global: "phaseJieshuBegin",
},
forced: true,
charlotte: true,
filter: function (event, player) {
return !player.getHistory("damage").length;
},
content: function () {
player.draw(Math.min(3, player.getHistory("lose").length));
},
},
limit: {
charlotte: true,
onremove: function (player) {
player.removeGaintag("dcyouzhan");
},
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dcyouzhan")) return true;
},
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcyouzhan")) return false;
},
},
},
},
},
//乐蔡文姬
dcshuangjia: {
audio: 2,
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content: function () {
"step 0";
var cards = player.getCards("h");
player.addGaintag(cards, "dcshuangjia_tag");
},
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dcshuangjia_tag")) {
return true;
}
},
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcshuangjia_tag")) {
return false;
}
},
globalTo: function (from, to, distance) {
return (
distance +
Math.min(
5,
to.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag"))
)
);
},
},
},
dcbeifen: {
audio: 2,
trigger: {
player: ["loseAfter"],
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
filter: function (event, player) {
var evt = event.getl(player);
if (!evt || !evt.hs || !evt.hs.length) return false;
if (event.name == "lose") {
for (var i in event.gaintag_map) {
if (event.gaintag_map[i].includes("dcshuangjia_tag")) return true;
}
return false;
}
return player.hasHistory("lose", (evt) => {
if (event != evt.getParent()) return false;
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("dcshuangjia_tag")) return true;
}
return false;
});
},
forced: true,
content: function () {
var suits = lib.suit.slice();
player.countCards("h", (card) => {
if (!card.hasGaintag("dcshuangjia_tag")) return false;
suits.remove(get.suit(card));
});
var cards = [];
while (suits.length) {
var suit = suits.shift();
var card = get.cardPile((cardx) => {
return get.suit(cardx, false) == suit;
});
if (card) cards.push(card);
}
if (cards.length) {
player.gain(cards, "gain2");
}
},
mod: {
cardUsable: function (card, player) {
var len = player.countCards("h");
var cnt = player.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag"));
if (2 * cnt < len) return Infinity;
},
targetInRange: function (card, player) {
var len = player.countCards("h");
var cnt = player.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag"));
if (2 * cnt < len) return true;
},
aiOrder: function (player, card, num) {
if (get.itemtype(card) == "card" && card.hasGaintag("dcshuangjia_tag")) {
var suits = lib.suit.slice();
player.countCards("h", (cardx) => {
if (!cardx.hasGaintag("dcshuangjia_tag")) return false;
if (card == cardx) return false;
suits.remove(get.suit(cardx));
});
if (suits.length) return num + suits.length * 2.5;
}
},
},
},
//孟优
dcmanzhi: {
audio: 2,
trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] },
filter: function (event, player) {
if (event.name == "phaseJieshu") {
var del = 0;
game.getGlobalHistory("changeHp", (evt) => {
if (evt.player != player) return;
for (var phase of lib.phaseName) {
var evtx = evt.getParent(phase);
if (evtx && evtx.name == phase) {
del += evt.num;
break;
}
}
});
if (del != 0) return false;
}
return game.hasPlayer((current) => {
if (current == player) return false;
return (
(!player.hasSkill("dcmanzhi_1") && current.countCards("he")) ||
(!player.hasSkill("dcmanzhi_2") && current.countCards("hej"))
);
});
},
direct: true,
content: function () {
"step 0";
if (_status.connectMode)
game.broadcastAll(function () {
_status.noclearcountdown = true;
});
player
.chooseTarget(get.prompt2("dcmanzhi"), (card, player, target) => {
if (player == target) return false;
return (
(!player.hasSkill("dcmanzhi_1") && target.countCards("he")) ||
(!player.hasSkill("dcmanzhi_2") && target.countCards("hej"))
);
})
.set("ai", (target) => {
return 1 - get.attitude(get.player(), target);
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
var choices = [];
var choiceList = [
"令其交给你两张牌,然后其视为使用一张无距离限制的【杀】",
"你获得其区域内的至多两张牌,然后交给其等量的牌并摸一张牌",
];
var chosen = [player.hasSkill("dcmanzhi_1"), player.hasSkill("dcmanzhi_2")];
if (target.countCards("he") && (!chosen[0] || trigger.name == "phaseZhunbei"))
choices.push("选项一");
else
choiceList[0] =
'' +
choiceList[0] +
(chosen[0] ? "(已被选择过)" : "") +
"";
if (target.countCards("hej") && (!chosen[1] || trigger.name == "phaseZhunbei"))
choices.push("选项二");
else
choiceList[1] =
'' +
choiceList[1] +
(chosen[1] ? "(已被选择过)" : "") +
"";
if (trigger.name == "phaseJieshu") choices.push("cancel2");
player
.chooseControl(choices)
.set("choiceList", choiceList)
.set("ai", () => {
return _status.event.choice;
})
.set(
"choice",
(function () {
if (
target.getUseValue({ name: "sha" }, false) > 5 &&
!player.hasShan() &&
trigger.name == "phaseZhunbei"
)
return 1;
return 0;
})()
)
.set("prompt", "蛮智:请选择一项");
} else {
if (_status.connectMode) {
game.broadcastAll(function () {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
event.finish();
}
"step 2";
if (_status.connectMode) {
game.broadcastAll(function () {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
if (result.control == "cancel2") {
event.finish();
return;
}
player.logSkill("dcmanzhi", target);
if (result.control == "选项一") {
player.addTempSkill("dcmanzhi_1");
target.chooseCard(
Math.min(2, target.countCards("he")),
"he",
"蛮智:请交给" + get.translation(player) + "两张牌",
true
);
} else {
player.addTempSkill("dcmanzhi_2");
player.gainPlayerCard(target, "hej", [1, 2], true);
event.goto(5);
}
"step 3";
if (result.bool) {
target.give(result.cards, player);
} else event.finish();
"step 4";
target.chooseUseTarget("sha", true, "nodistance");
event.finish();
"step 5";
if (result.bool && target.isIn()) {
var num = result.cards.length,
hs = player.getCards("he");
if (!hs.length) event.finish();
else if (hs.length < num) event._result = { bool: true, cards: hs };
else
player.chooseCard(
"he",
true,
num,
"交给" + get.translation(target) + get.cnNumber(num) + "张牌"
);
} else event.finish();
"step 6";
if (result.bool) {
player.give(result.cards, target);
player.draw();
}
},
subSkill: {
1: { charlotte: true },
2: { charlotte: true },
},
},
//孙綝
dczigu: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterCard: true,
position: "he",
selectCard: 1,
check: function (card) {
var player = _status.event.player;
if (!player.hasSkill("dczuowei")) return 6 - get.value(card);
if (
player.countCards("h") == player.countCards("e") + 1 &&
!player.hasCard((card) => player.hasValueTarget(card), "h")
) {
if (get.position(card) == "e") return 0;
return 8 - get.value(card);
}
return 6 - get.value(card);
},
content: function () {
"step 0";
var targets = game.filterPlayer((current) => {
return current.countGainableCards(player, "e");
});
if (targets.length == 0) event._result = { bool: false };
else if (targets.length == 1) event._result = { bool: true, targets: targets };
else
player
.chooseTarget(
"自固:获得一名角色装备区里的一张牌",
true,
(card, player, target) => {
return target.countGainableCards(player, "e");
}
)
.set("ai", (target) => {
if (target == _status.event.player) return 10;
if (get.attitude(_status.event.player, target) < 0) {
if (
target.hasCard((card) => {
return get.value(card, player) >= 6;
})
)
return 12;
return 8;
}
return 0;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.gainPlayerCard("e", target, true);
}
"step 2";
if (
!result.bool ||
target == player ||
!result.cards ||
!result.cards.some((i) => get.owner(i) == player)
)
player.draw();
},
ai: {
order: function (item, player) {
if (!player.hasSkill("dczuowei")) return 9;
if (
player.countCards("h") == player.countCards("e") + 1 &&
!player.hasCard((card) => player.hasValueTarget(card), "h")
)
return 9;
return 1;
},
result: {
player: 1,
},
},
},
dczuowei: {
audio: 2,
trigger: { player: "useCard" },
filter: function (event, player) {
if (_status.currentPhase != player) return false;
if (!player.hasSkill("dczuowei_ban")) return true;
return Math.sign(player.countCards("h") - Math.max(1, player.countCards("e"))) >= 0;
},
direct: true,
locked: false,
content: function () {
"step 0";
var hs = player.countCards("h");
var es = Math.max(1, player.countCards("e"));
var sign = Math.sign(hs - es);
event.sign = sign;
if (sign > 0)
player
.chooseBool(
get.prompt("dczuowei"),
"令" + get.translation(trigger.card) + "不可被响应"
)
.set("ai", () => 1);
else if (sign == 0)
player
.chooseTarget(
get.prompt("dczuowei"),
"对一名其他角色造成1点伤害",
lib.filter.notMe
)
.set("ai", (target) => {
return get.damageEffect(target, _status.event.player, _status.event.player);
});
else
player
.chooseBool(get.prompt("dczuowei"), "摸两张牌,然后本回合你不能再触发该分支")
.set("ai", () => 1);
"step 1";
if (!result.bool) event.finish();
else if (event.sign <= 0 && !event.isMine() && !event.isOnline()) game.delayx();
"step 2";
var sign = event.sign;
if (sign > 0) {
player.logSkill("dczuowei");
trigger.directHit.addArray(game.players);
event.finish();
} else if (sign == 0) {
var target = result.targets[0];
player.logSkill("dczuowei", target);
target.damage();
} else {
player.logSkill("dczuowei");
player.draw(2);
player.addTempSkill("dczuowei_ban");
}
},
subSkill: {
ban: { charlotte: true },
},
mod: {
aiValue: function (player, card, num) {
if (_status.currentPhase != player) return;
const event = get.event();
if (!player.isPhaseUsing()) return;
if (event.type != "phase") return;
const cardsh = [],
cardse = [];
for (const cardx of ui.selected.cards) {
const pos = get.position(cardx);
if (pos == "h") cardsh.add(cardx);
else if (pos == "e") cardse.add(cardx);
}
const hs = player.countCards("h") - cardsh.length,
es = Math.max(1, player.countCards("e") - cardse.length);
const delt = hs - es;
if (delt <= 0) return;
if (get.position(card) == "h" && delt == 1) return num / 1.25;
},
aiUseful: function () {
return lib.skill.dczuowei.mod.aiValue.apply(this, arguments);
},
aiOrder: function (player, card, num) {
if (player.hasSkill("dczuowei_ban") || _status.currentPhase != player) return;
const cardsh = [],
cardse = [];
const pos = get.position(card);
if (pos == "h") cardsh.add(card);
else if (pos == "e") cardse.add(card);
if (get.tag(card, "draw") || get.tag(card, "gain")) {
const hs = player.countCards("h") - cardsh.length,
es = Math.max(
1,
player.countCards("e") - cardse.length + (get.type(card) == "equip")
);
if ((player.hasSkill("dczuowei_ban") && hs < es) || hs == es) return num + 10;
return num / 5;
}
},
},
ai: {
threaten: 3,
reverseEquip: true,
effect: {
player_use: function (card, player, target, current) {
if (_status.currentPhase != player) return;
if (get.type(card) == "equip" && get.cardtag(card, "gifts")) return;
if (player.countCards("h") > Math.max(1, player.countCards("e"))) return [1, 3];
},
},
},
},
//刘宠骆俊
dcminze: {
audio: 2,
enable: "phaseUse",
filterTarget: function (card, player, target) {
if (player.getStorage("dcminze_targeted").includes(target)) return false;
return target.countCards("h") < player.countCards("h");
},
filterCard: function (card, player) {
if (!ui.selected.cards.length) return true;
return get.name(ui.selected.cards[0]) != get.name(card);
},
selectCard: [1, 2],
complexCard: true,
position: "he",
discard: false,
lose: false,
delay: false,
group: "dcminze_draw",
content: function () {
player.give(cards, target);
player.addTempSkill("dcminze_targeted", "phaseUseAfter");
player.markAuto("dcminze_targeted", [target]);
player.addTempSkill("dcminze_given");
player.markAuto(
"dcminze_given",
cards.map((i) => get.name(i, player))
);
},
ai: {
order: 6.5,
expose: 0.2,
},
subSkill: {
targeted: { onremove: true, charlotte: true },
given: {
charlotte: true,
onremove: true,
intro: {
content: "本回合以此法交出的牌名:$",
},
},
draw: {
trigger: { player: "phaseJieshuBegin" },
filter: function (event, player) {
return player.getStorage("dcminze_given").length;
},
forced: true,
locked: false,
content: function () {
var num =
Math.min(5, player.getStorage("dcminze_given").length) -
player.countCards("h");
if (num > 0) player.draw(num);
},
},
},
},
dcjini: {
audio: 2,
trigger: { player: "damageEnd" },
direct: true,
filter: function (event, player) {
return player.maxHp - player.countMark("dcjini_counted") > 0;
},
content: function () {
"step 0";
player
.chooseCard(
get.prompt2("dcjini"),
[1, player.maxHp - player.countMark("dcjini_counted")],
lib.filter.cardRecastable
)
.set("ai", (card) => {
return 6 - get.value(card);
});
"step 1";
if (result.bool) {
var cards = result.cards;
player.logSkill("dcjini");
player.addTempSkill("dcjini_counted");
player.addMark("dcjini_counted", cards.length, false);
event.recast = player.recast(cards);
} else event.finish();
"step 2";
if (
trigger.source &&
trigger.source.isIn() &&
player.hasHistory(
"gain",
(evt) =>
evt.getParent(2) == event.recast &&
evt.cards.some((value) => get.name(value) == "sha")
)
) {
player
.chooseToUse(function (card) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
}, "击逆:是否对" + get.translation(trigger.source) + "使用一张不可被响应的杀?")
.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", trigger.source)
.set("oncard", () => {
_status.event.directHit.addArray(game.players);
});
}
},
subSkill: {
counted: {
onremove: true,
charlotte: true,
},
},
},
//乐綝
dcporui: {
audio: 2,
trigger: { global: "phaseJieshuBegin" },
filter: function (event, player) {
if (player == event.player) return false;
if (
player.countMark("dcporui_round") >= (player.hasMark("dcgonghu_basic") ? 2 : 1) ||
player.countCards("h") == 0
)
return false;
return (
game.hasPlayer((current) => {
if (current == player || current == event.player) return false;
return current.hasHistory("lose", function (evt) {
return evt.cards2.length > 0;
});
}) && player.countCards("he") > 0
);
},
direct: true,
content: function () {
"step 0";
var map = {};
game.countPlayer(function (current) {
if (current == player || current == trigger.player) return false;
if (
current.hasHistory("lose", function (evt) {
return evt.cards2.length > 0;
})
)
map[current.playerid] =
Math.min(
5,
current.getHistory("lose").reduce(function (num, evt) {
return num + evt.cards2.length;
}, 0)
) + 1;
});
player
.chooseCardTarget({
prompt: get.prompt("dcporui"),
prompt2: get.skillInfoTranslation("dcporui", player),
filterCard: function (card, player) {
return lib.filter.cardDiscardable(card, player, "dcporui");
},
position: "he",
filterTarget: function (card, player, target) {
return Object.keys(_status.event.map).includes(target.playerid);
},
ai1: function (card) {
return 7 - get.value(card);
},
ai2: function (target) {
return (
get.effect(
target,
{ name: "sha" },
_status.event.player,
_status.event.player
) * _status.event.map[target.playerid]
);
},
})
.set("map", map);
"step 1";
if (result.bool) {
var target = result.targets[0],
cards = result.cards;
event.target = target;
player.logSkill("dcporui", target);
player.discard(cards);
event.num2 = Math.min(
5,
target.getHistory("lose").reduce(function (num, evt) {
return num + evt.cards2.length;
}, 0)
);
event.num = event.num2 + 1;
player.addTempSkill("dcporui_round", "roundStart");
player.addMark("dcporui_round", 1, false);
} else event.finish();
"step 2";
var card = { name: "sha", isCard: true, storage: { dcporui: true } };
if (player.canUse(card, target, false) && target.isIn()) {
player.useCard(card, target);
event.num--;
} else event.goto(4);
"step 3";
if (event.num > 0) event.goto(2);
"step 4";
if (!player.hasMark("dcgonghu_damage") && target.isIn()) {
var cards = player.getCards("h");
if (cards.length == 0) event._result = { bool: false };
else if (cards.length <= event.num2) event._result = { bool: true, cards: cards };
else
player.chooseCard(
"破锐:交给" + get.translation(target) + get.cnNumber(event.num2) + "张手牌",
true,
event.num2
);
} else event.finish();
"step 5";
if (result.bool) {
player.give(result.cards, target);
}
event.finish();
"step 6";
if (player.hasMark("dcgonghu_basic")) {
if (
!target.hasHistory("damage", (evt) => {
return (
evt.card &&
evt.card.storage &&
evt.card.storage.dcporui &&
evt.getParent("dcporui") == event
);
})
) {
player.recover();
}
}
},
subSkill: {
round: { charlotte: true, onremove: true },
},
ai: {
expose: 0.4,
threaten: 3.8,
},
},
dcgonghu: {
audio: 2,
trigger: {
player: ["loseAfter", "damageEnd"],
source: "damageSource",
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
forced: true,
filter: function (event, player) {
if (event.name == "damage") {
if (player.hasMark("dcgonghu_damage")) return false;
var num = 0;
player.getHistory("damage", (evt) => (num += evt.num));
player.getHistory("sourceDamage", (evt) => (num += evt.num));
return num > 1;
}
if (!_status.currentPhase || _status.currentPhase == player) return false;
if (player.hasMark("dcgonghu_basic")) return false;
if (_status.currentPhase && _status.currentPhase == player) return false;
var evt = event.getl(player);
if (!evt || !evt.cards2 || !evt.cards2.some((i) => get.type2(i, player) == "basic"))
return false;
var num = 0;
player.getHistory("lose", function (evtx) {
if (num < 2) {
if (evtx && evtx.cards2)
num += evtx.cards2.filter((i) => get.type2(i, player) == "basic").length;
}
});
return num >= 2;
},
group: ["dcgonghu_basic", "dcgonghu_trick"],
content: function () {
player.addMark("dcgonghu_" + (trigger.name == "damage" ? "damage" : "basic"), 1, false);
game.log(player, "修改了技能", "#g【破锐】");
},
ai: {
combo: "dcporui",
},
subSkill: {
trick: {
audio: "dcgonghu",
trigger: { player: "useCard2" },
direct: true,
locked: true,
filter: function (event, player) {
if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage"))
return false;
var card = event.card;
if (get.color(card, false) != "red" || get.type(card, null, true) != "trick")
return false;
var info = get.info(card);
if (info.allowMultiple == false) return false;
if (event.targets && !info.multitarget) {
if (
game.hasPlayer(function (current) {
return (
!event.targets.includes(current) &&
lib.filter.targetEnabled2(card, player, current)
);
})
) {
return true;
}
}
return false;
},
content: function () {
"step 0";
var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
player
.chooseTarget(get.prompt("dcgonghu_trick"), function (card, player, target) {
var player = _status.event.player;
return (
!_status.event.targets.includes(target) &&
lib.filter.targetEnabled2(_status.event.card, player, target)
);
})
.set("prompt2", prompt2)
.set("ai", function (target) {
var trigger = _status.event.getTrigger();
var player = _status.event.player;
return get.effect(target, trigger.card, player, player);
})
.set("card", trigger.card)
.set("targets", trigger.targets);
"step 1";
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
"step 2";
if (event.targets) {
player.logSkill("dcgonghu_trick", event.targets);
trigger.targets.addArray(event.targets);
}
},
},
basic: {
audio: "dcgonghu",
trigger: { player: "useCard" },
forced: true,
filter: function (event, player) {
if (!player.hasMark("dcgonghu_basic") || !player.hasMark("dcgonghu_damage"))
return false;
var card = event.card;
return get.color(card, false) == "red" && get.type(card, null, false) == "basic";
},
content: function () {
trigger.directHit.addArray(game.filterPlayer());
game.log(trigger.card, "不可被响应");
},
},
},
},
//张闿
dcxiangshu: {
audio: 2,
trigger: { global: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return event.player != player && event.player.countCards("h") >= event.player.hp;
},
content: function () {
"step 0";
var list = [0, 1, 2, 3, 4, 5, "cancel2"];
player
.chooseControl(list)
.set("prompt", get.prompt2("dcxiangshu"))
.set("ai", () => {
return _status.event.choice;
})
.set(
"choice",
(function () {
if (get.attitude(player, trigger.player) > 0) return "cancel2";
var cards = trigger.player.getCards("h");
var num = 0;
for (var card of cards) {
if (!trigger.player.hasValueTarget(card)) {
num++;
if (num >= 5) break;
}
}
if (cards.length >= 3 && Math.random() < 0.5) num = Math.max(0, num - 1);
return num;
})()
);
"step 1";
if (result.control != "cancel2") {
player.logSkill("dcxiangshu", trigger.player);
var num = result.index;
player.storage.dcxiangshu_lottery = num;
player.addTempSkill("dcxiangshu_lottery", "phaseUseAfter");
} else event.finish();
"step 2";
player
.chooseToDiscard("相鼠:是否弃置一张牌不公布此数字?")
.set("ai", (card) => 2 - get.value(card));
"step 3";
if (!result.bool) {
var num = player.storage.dcxiangshu_lottery;
player.markSkill("dcxiangshu_lottery");
player.popup(num);
game.log(player, "选择了数字", "#g" + num);
}
},
subSkill: {
lottery: {
audio: "dcxiangshu",
trigger: { global: "phaseUseEnd" },
charlotte: true,
forced: true,
onremove: true,
logTarget: "player",
filter: function (event, player) {
return (
typeof player.storage.dcxiangshu_lottery == "number" &&
Math.abs(event.player.countCards("h") - player.storage.dcxiangshu_lottery) <=
1
);
},
content: function () {
var delt = Math.abs(
trigger.player.countCards("h") - player.storage.dcxiangshu_lottery
);
if (delt <= 1 && trigger.player.countGainableCards("he", player) > 0) {
player.gainPlayerCard(trigger.player, "he", true);
}
if (delt == 0) {
trigger.player.damage(player);
}
},
intro: { content: "猜测的数字为#" },
},
},
},
//裴元绍
dcmoyu: {
audio: 2,
init() {
game.addGlobalSkill("dcmoyu_ai");
},
onremove() {
if (!game.hasPlayer(i => i.hasSkill("dcmoyu"), true)) game.removeGlobalSkill("dcmoyu_ai");
},
enable: "phaseUse",
filter(event, player) {
return game.hasPlayer((current) => lib.skill.dcmoyu.filterTarget(null, player, current));
},
filterTarget(card, player, target) {
return player != target && !player.getStorage("dcmoyu_clear").includes(target) && target.countGainableCards(player, "hej");
},
async content(event, trigger, player) {
const target = event.target;
player.addTempSkill("dcmoyu_clear");
player.markAuto("dcmoyu_clear", [target]);
await player.gainPlayerCard(target, "hej", true, 1 + player.hasSkill("dcmoyu_add"));
player.removeSkill("dcmoyu_add");
const num = player.getStorage("dcmoyu_clear").length;
const result = await target
.chooseToUse(
function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
},
"是否对" + get.translation(player) + "使用一张无距离限制的【杀】?"
)
.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", player)
.set("num", num)
.set("oncard", card => {
_status.event.baseDamage = _status.event.getParent().num;
})
.forResult();
if (result.bool) {
if (
player.hasHistory("damage", evt => {
return evt.card && evt.card.name == "sha" && evt.getParent(4) == event;
})
) {
player.tempBanSkill("dcmoyu");
} else {
player.addTempSkill("dcmoyu_add", "phaseChange");
}
}
},
subSkill: {
clear: {
charlotte: true,
onremove: true,
},
ban: {
charlotte: true,
mark: true,
marktext: "欲",
intro: { content: "偷马贼被反打了!" },
},
add: {
charlotte: true,
mark: true,
marktext: "欲",
intro: { content: "欲望加速,下次抢两张!" },
},
ai: {
trigger: { player: "dieAfter" },
filter: () => {
return !game.hasPlayer((i) => i.hasSkill("dcmoyu"), true);
},
silent: true,
forceDie: true,
content: () => {
game.removeGlobalSkill("dcmoyu_ai");
},
ai: {
effect: {
target: function (card, player, target, current) {
if (get.type(card) == "delay" && current < 0) {
var currentx = _status.currentPhase;
if (!currentx || !currentx.isIn()) return;
var list = game.filterPlayer((current) => {
if (current == target) return true;
if (!current.hasSkill("dcmoyu")) return false;
if (current.hasJudge("lebu")) return false;
return get.attitude(current, target) > 0;
});
list.sortBySeat(currentx);
if (list.indexOf(target) != 0) return "zerotarget";
}
},
},
},
},
},
ai: {
order: 9,
threaten: 2.4,
result: {
target: function (player, target) {
var num = get.sgn(get.attitude(player, target));
var eff = get.effect(target, { name: "shunshou" }, player, player) * num;
if (eff * num > 0) return eff / 10;
if (
player.hasShan() &&
!target.hasSkillTag(
"directHit_ai",
true,
{
target: player,
card: { name: "sha" },
},
true
)
)
return eff;
if (
target.hasSha() &&
player.hp +
player.countCards("hs", function (card) {
var mod2 = game.checkMod(
card,
player,
"unchanged",
"cardEnabled2",
player
);
if (mod2 != "unchanged") return mod2;
var mod = game.checkMod(
card,
player,
player,
"unchanged",
"cardSavable",
player
);
if (mod != "unchanged") return mod;
var savable = get.info(card).savable;
if (typeof savable == "function")
savable = savable(card, player, player);
return savable;
}) <=
1
)
return 0;
return eff;
},
},
},
},
oldmoyu: {
audio: "dcmoyu",
init: () => {
game.addGlobalSkill("oldmoyu_ai");
},
onremove: () => {
if (!game.hasPlayer((i) => i.hasSkill("oldmoyu"), true))
game.removeGlobalSkill("oldmoyu_ai");
},
enable: "phaseUse",
filter: function (event, player) {
return (
!player.hasSkill("oldmoyu_ban") &&
game.hasPlayer((current) => lib.skill.oldmoyu.filterTarget(null, player, current))
);
},
filterTarget: function (card, player, target) {
return (
player != target &&
!player.getStorage("oldmoyu_clear").includes(target) &&
target.countGainableCards(player, "hej")
);
},
content: function () {
"step 0";
player.addTempSkill("oldmoyu_clear");
player.markAuto("oldmoyu_clear", [target]);
player.gainPlayerCard(target, "hej", true);
"step 1";
var num = player.getStorage("oldmoyu_clear").length;
target
.chooseToUse(function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
}, "是否对" +
get.translation(player) +
"使用一张无距离限制的【杀】(伤害基数为" +
num +
")?")
.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", player)
.set("num", num)
.set("oncard", (card) => {
_status.event.baseDamage = _status.event.getParent().num;
});
"step 2";
if (result.bool) {
if (
player.hasHistory("damage", (evt) => {
return evt.card && evt.card.name == "sha" && evt.getParent(4) == event;
})
)
player.addTempSkill("oldmoyu_ban");
}
},
subSkill: {
clear: {
charlotte: true,
onremove: true,
},
ban: {
charlotte: true,
mark: true,
marktext: "欲",
intro: { content: "偷马贼被反打了!" },
},
ai: {
trigger: { player: "dieAfter" },
filter: () => {
return !game.hasPlayer((i) => i.hasSkill("oldmoyu"), true);
},
silent: true,
forceDie: true,
content: () => {
game.removeGlobalSkill("oldmoyu_ai");
},
ai: {
effect: {
target: function (card, player, target, current) {
if (get.type(card) == "delay" && current < 0) {
var currentx = _status.currentPhase;
if (!currentx || !currentx.isIn()) return;
var list = game.filterPlayer((current) => {
if (current == target) return true;
if (!current.hasSkill("oldmoyu")) return false;
if (current.hasJudge("lebu")) return false;
return get.attitude(current, target) > 0;
});
list.sortBySeat(currentx);
if (list.indexOf(target) != 0) return "zerotarget";
}
},
},
},
},
},
ai: {
order: 9,
threaten: 2.4,
result: {
target: function (player, target) {
var num = get.sgn(get.attitude(player, target));
var eff = get.effect(target, { name: "shunshou" }, player, player) * num;
if (eff * num > 0) return eff / 10;
if (
player.hasShan() &&
!target.hasSkillTag(
"directHit_ai",
true,
{
target: player,
card: { name: "sha" },
},
true
)
)
return eff;
if (
target.hasSha() &&
player.hp +
player.countCards("hs", function (card) {
var mod2 = game.checkMod(
card,
player,
"unchanged",
"cardEnabled2",
player
);
if (mod2 != "unchanged") return mod2;
var mod = game.checkMod(
card,
player,
player,
"unchanged",
"cardSavable",
player
);
if (mod != "unchanged") return mod;
var savable = get.info(card).savable;
if (typeof savable == "function")
savable = savable(card, player, player);
return savable;
}) <=
player.getStorage("oldmoyu_clear").length + 1
)
return 0;
return eff;
},
},
},
},
//张楚
dcjizhong: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: lib.filter.notMe,
selectTarget: 1,
content: function () {
"step 0";
target.draw(2);
"step 1";
var marked = target.hasMark("dcjizhong");
var cards = target.getCards("h");
if (marked) {
if (cards.length <= 3) event._result = { bool: true, cards: cards };
else target.chooseCard(`集众:交给${get.translation(player)}三张手牌`, 3, true);
} else {
target
.chooseCard(
`集众:交给${get.translation(player)}三张手牌,或点击“取消”获得“信众”标记`,
3
)
.set("ai", (card) => {
if (get.event("goon")) return 20 - get.value(card);
return 1 - get.value(card);
})
.set("goon", get.attitude(target, player) > 0);
}
"step 2";
if (!result.bool) {
target.addMark("dcjizhong", 1);
} else {
target.give(result.cards, player);
}
},
marktext: "信",
intro: {
name: "信众",
name2: "信众",
markcount: () => 0,
content: "已成为信徒",
},
ai: {
order: 9.5,
result: {
target: function (player, target) {
var num = target.countCards("h");
if (num <= 1) return -num;
if (get.attitude(player, target) > 0) return 1;
return -1 / (num / 2 + 1);
},
},
},
},
dcrihui: {
audio: 2,
trigger: { player: "useCardAfter" },
usable: 1,
filter: function (event, player) {
if (!event.targets || event.targets.length != 1 || event.targets[0] == player)
return false;
var card = event.card;
var target = event.targets[0];
var marked = target.hasMark("dcjizhong");
return (
(get.type(card) == "trick" ||
(get.color(card) == "black" && get.type(card) == "basic")) &&
(marked || (!marked && game.hasPlayer((current) => current.hasMark("dcjizhong"))))
);
},
logTarget: (event) => event.targets[0],
prompt2(event, player) {
const target = event.targets[0];
if (target.hasMark("dcjizhong")) return "获得该角色区域内的一张牌";
else {
const card = { name: event.card.name, nature: event.card.nature, isCard: true };
return "令所有有“信众”的角色依次视为对其使用一张" + get.translation(card);
}
},
check(event, player) {
const target = event.targets[0];
if (target.hasMark("dcjizhong")) {
return get.effect(target, { name: "shunshou_copy" }, event, player) > 0;
} else {
const card = { name: event.card.name, nature: event.card.nature, isCard: true };
let eff = 0;
game.countPlayer((current) => {
if (!current.hasMark("dcjizhong") || !current.canUse(card, player, false)) return;
eff += get.effect(target, card, current, player);
});
return eff > 0;
}
},
async content(event, trigger, player) {
const target = trigger.targets[0];
if (target.hasMark("dcjizhong")) {
await player.gainPlayerCard(target, "hej", true);
} else {
const card = { name: trigger.card.name, nature: trigger.card.nature, isCard: true };
const targets = game
.filterPlayer((current) => current.hasMark("dcjizhong"))
.sortBySeat(_status.currentPhase);
for (const current of targets) {
if (target.isIn() && current.isIn() && current.canUse(card, target, false)) {
await current.useCard(card, target, false);
}
}
}
},
ai: {
combo: "dcjizhong",
},
},
dcguangshi: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
filter: function (event, player) {
return !game.hasPlayer((current) => current != player && !current.hasMark("dcjizhong"));
},
forced: true,
content: function () {
player.draw(2);
player.loseHp();
},
ai: {
combo: "dcjizhong",
},
},
//董绾
dcshengdu: {
audio: 2,
trigger: { player: "phaseBegin" },
direct: true,
content: function () {
"step 0";
player.chooseTarget(get.prompt2("dcshengdu"), lib.filter.notMe).set("ai", (target) => {
var player = _status.event.player;
var att = get.attitude(player, target);
var eff = get.effect(
target,
{
name: "sha",
storage: { dcjieling: true },
},
player,
player
);
var value = att / 5;
if (value < 0) value = -value / 1.3;
value = Math.max(value - eff / 20, 0.01);
return value;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcshengdu", target);
target.addMark("dcshengdu", 1);
}
},
intro: { content: "mark" },
group: "dcshengdu_effect",
subSkill: {
effect: {
audio: "dcshengdu",
trigger: { global: "gainAfter" },
filter: function (event, player) {
return (
event.getParent(2).name == "phaseDraw" && event.player.hasMark("dcshengdu")
);
},
forced: true,
logTarget: "player",
content: function () {
var num = trigger.player.countMark("dcshengdu");
player.draw(num * trigger.cards.length);
trigger.player.removeMark("dcshengdu", num);
},
},
},
},
dcjieling: {
audio: 2,
enable: "phaseUse",
position: "hs",
viewAs: {
name: "sha",
storage: { dcjieling: true },
},
filterCard: function (card, player) {
if (player.getStorage("dcjieling_count").includes(get.suit(card))) return false;
if (ui.selected.cards.length) {
return get.suit(card) != get.suit(ui.selected.cards[0]);
}
return true;
},
selectCard: 2,
complexCard: true,
check: function (card) {
return 6 - get.value(card);
},
precontent: function () {
player.addTempSkill("dcjieling_after");
event.getParent().addCount = false;
player.addTempSkill("dcjieling_count", "phaseUseAfter");
player.markAuto(
"dcjieling_count",
event.result.cards.reduce((list, card) => list.add(get.suit(card, player)), [])
);
},
ai: {
order: function (item, player) {
return get.order({ name: "sha" }) + 0.1;
},
},
locked: false,
mod: {
targetInRange: function (card) {
if (card.storage && card.storage.dcjieling) return true;
},
cardUsable: function (card, player, num) {
if (card.storage && card.storage.dcjieling) return Infinity;
},
},
subSkill: {
after: {
charlotte: true,
audio: "dcjieling",
trigger: { global: "useCardAfter" },
filter: function (event, player) {
return (
event.card.name == "sha" && event.card.storage && event.card.storage.dcjieling
);
},
direct: true,
content: function () {
"step 0";
var damaged = game.hasPlayer2((current) => {
return current.hasHistory("damage", (evt) => evt.card == trigger.card);
});
var targets = trigger.targets.filter((i) => i.isIn());
player.logSkill("dcjieling_after", targets);
if (damaged) {
for (var target of targets) {
target.loseHp();
}
} else {
for (var target of targets) {
target.addMark("dcshengdu", 1);
}
}
},
},
count: {
intro: {
content: function (s, p) {
let str = "此阶段已转化过的卡牌花色:";
for (let i = 0; i < s.length; i++) {
str += get.translation(s[i]);
}
return str;
},
},
charlotte: true,
onremove: true,
},
},
},
//袁胤
dcmoshou: {
audio: 2,
trigger: { target: "useCardToTargeted" },
init: function (player, skill) {
if (typeof player.storage[skill] != "number") player.storage[skill] = 0;
},
filter: function (event, player) {
return get.color(event.card) == "black" && event.player != player;
},
frequent: true,
prompt2: function (event, player) {
var num =
(player.getAllHistory("useSkill", (evt) => evt.skill == "dcmoshou").length % 3) + 1;
return "摸" + get.cnNumber(num) + "张牌";
},
content: function () {
var num = player.getAllHistory("useSkill", (evt) => evt.skill == "dcmoshou").length;
player.storage.dcmoshou = num;
player.syncStorage("dcmoshou");
player.markSkill("dcmoshou");
num = ((num - 1) % 3) + 1;
player.draw(num);
},
mark: true,
marktext: "守",
intro: {
markcount: function (storage, player) {
if (typeof storage != "number") return 1;
return (storage % 3) + 1;
},
content: "本局游戏已发动过$次技能",
},
},
dcyunjiu: {
audio: 2,
trigger: { global: "dieAfter" },
direct: true,
content: function () {
"step 0";
var evt = trigger.player.getHistory("lose", (evtx) => {
return evtx.getParent(2) == trigger;
})[0];
if (!evt) event.finish();
else {
var cards = [];
//冷知识,角色死亡后只有手牌区和装备区的牌是被系统弃置的,其余牌的处理方式均为置入弃牌堆
cards.addArray(evt.hs).addArray(evt.es);
event.cards = cards.filterInD("d");
var num = cards.length;
if (num) {
event.videoId = lib.status.videoId++;
var func = function (cards, id) {
var num = cards.length;
var dialog = ui.create.dialog(
get.prompt("dcyunjiu"),
'弃置' +
get.cnNumber(num) +
"张牌,令一名其他角色获得以下这些牌
",
cards
);
dialog.videoId = id;
return dialog;
};
if (player.isOnline2()) {
player.send(func, cards, event.videoId);
}
event.dialog = func(cards, event.videoId);
if (player != game.me || _status.auto) {
event.dialog.style.display = "none";
}
player.chooseCardTarget({
prompt: false,
filterTarget: lib.filter.notMe,
filterCard: lib.filter.cardDiscardable,
selectCard: num,
position: "he",
goon: (function () {
if (!game.hasPlayer((current) => get.attitude(player, current)) > 0)
return false;
var value = 0;
for (var card of cards) {
value += get.value(card, player, "raw") - 1.2;
}
return value > 0;
})(),
ai1: function (card) {
if (_status.event.goon) {
if (
ui.selected.cards.length == _status.event.selectCard[1] - 1 &&
ui.selected.cards.length > 0
)
return 7 - get.value(card);
return 5.5 - get.value(card);
}
return 0;
},
ai2: function (target) {
return (
get.attitude(_status.event.player, target) /
Math.sqrt(target.countCards("h") + 1)
);
},
});
} else event.finish();
}
"step 1";
if (player.isOnline2()) {
player.send("closeDialog", event.videoId);
}
event.dialog.close();
if (result.bool) {
var cardsx = result.cards,
target = result.targets[0];
player.logSkill("dcyunjiu", target);
player.discard(cardsx);
target.gain(cards.filterInD("d"), "gain2").giver = player;
} else event.finish();
"step 2";
player.gainMaxHp();
player.recover();
},
},
//高翔
dcchiying: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return target.hp <= player.hp;
},
content: function () {
"step 0";
var targets = game
.filterPlayer((current) => target.inRange(current) && current != player)
.sortBySeat(player);
event.targets = targets;
if (!targets.length) event.finish();
"step 1";
var current = targets.shift();
if (current.countCards("he")) current.chooseToDiscard("驰应:请弃置一张牌", "he", true);
if (targets.length) event.redo();
"step 2";
if (target != player) {
var cards = [];
game.getGlobalHistory("cardMove", (evt) => {
if (evt.getParent(3) == event) {
cards.addArray(evt.cards.filter((card) => get.type(card) == "basic"));
}
});
cards = cards.filterInD("d");
if (cards.length) target.gain(cards, "gain2");
}
},
ai: {
order: 6,
result: {
target: function (player, target) {
var targets = game.filterPlayer(
(current) => target.inRange(current) && current != player
);
var eff = 0;
for (var targetx of targets) {
var effx = get.effect(targetx, { name: "guohe_copy2" }, player, target);
if (get.attitude(player, targetx) < 0) effx /= 2;
eff += effx;
}
return (
(target == player ? 0.5 : 1) *
eff *
(get.attitude(player, target) <= 0 ? 0.75 : 1)
);
},
},
},
},
//霍峻
dcgue: {
audio: 2,
enable: ["chooseToUse", "chooseToRespond"],
hiddenCard: function (player, name) {
if (player.hasSkill("dcgue_blocker", null, null, false)) return false;
return name == "sha" || name == "shan";
},
filter: function (event, player) {
if (event.dcgue || event.type == "wuxie" || player == _status.currentPhase) return false;
if (player.hasSkill("dcgue_blocker", null, null, false)) return false;
for (var name of ["sha", "shan"]) {
if (event.filterCard({ name: name, isCard: true }, player, event)) return true;
}
return false;
},
chooseButton: {
dialog: function (event, player) {
var vcards = [];
for (var name of ["sha", "shan"]) {
var card = { name: name, isCard: true };
if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]);
}
return ui.create.dialog("孤扼", [vcards, "vcard"], "hidden");
},
check: function (button) {
if (_status.event.player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0;
return 1;
},
backup: function (links, player) {
return {
filterCard: () => false,
selectCard: -1,
viewAs: {
name: links[0][2],
isCard: true,
},
popname: true,
precontent: function () {
"step 0";
player.logSkill("dcgue");
player.addTempSkill("dcgue_blocker");
if (player.countCards("h")) player.showHandcards();
delete event.result.skill;
"step 1";
if (player.countCards("h", { name: ["sha", "shan"] }) > 1) {
var evt = event.getParent();
evt.set("dcgue", true);
evt.goto(0);
delete evt.openskilldialog;
return;
}
game.delayx();
},
};
},
prompt: function (links, player) {
return (
(player.countCards ? "展示所有手牌" : "") +
(player.countCards("h", { name: ["sha", "shan"] }) <= 1
? ",然后视为使用【" + get.translation(links[0][2]) + "】"
: "")
);
},
},
subSkill: { blocker: { charlotte: true } },
ai: {
order: 1,
respondSha: true,
respondShan: true,
skillTagFilter: function (player) {
if (player.hasSkill("dcgue_blocker", null, null, false)) return false;
},
result: {
player: function (player) {
if (player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0;
return 1;
},
},
},
},
dcsigong: {
audio: 2,
trigger: { global: "phaseEnd" },
filter: function (event, player) {
if (player.hasSkill("dcsigong_round")) return false;
if (event.player == player || !event.player.isIn()) return false;
if (!player.canUse("sha", event.player, false)) return false;
var respondEvts = [];
game.countPlayer2((current) =>
respondEvts
.addArray(current.getHistory("useCard"))
.addArray(current.getHistory("respond"))
);
respondEvts = respondEvts.filter((i) => i.respondTo).map((evt) => evt.respondTo);
return event.player.hasHistory("useCard", (evt) => {
return respondEvts.some((list) => list[1] == evt.card);
});
},
direct: true,
content: function () {
"step 0";
var num = 1 - player.countCards("h");
event.num = num;
var prompt2 = "";
if (num >= 0) {
var next = player.chooseBool().set("ai", () => _status.event.goon);
prompt2 +=
(num > 0 ? "摸一张牌," : "") +
"视为对" +
get.translation(trigger.player) +
"使用一张【杀】(伤害基数+1)";
} else {
var next = player
.chooseToDiscard(-num)
.set("ai", (card) => {
if (_status.event.goon) return 5.2 - get.value(card);
return 0;
})
.set("logSkill", ["dcsigong", trigger.player]);
prompt2 +=
"将手牌数弃置至1,视为对" +
get.translation(trigger.player) +
"使用一张【杀】(伤害基数+1)";
}
next.set("prompt", get.prompt("dcsigong", trigger.player));
next.set("prompt2", prompt2);
next.set("goon", get.effect(trigger.player, { name: "sha" }, player, player) > 0);
"step 1";
if (result.bool) {
if (num >= 0) player.logSkill("dcsigong", trigger.player);
if (num > 0) player.draw(num, "nodelay");
event.num = Math.max(1, Math.abs(num));
} else event.finish();
"step 2";
if (player.canUse("sha", trigger.player, false)) {
player.addTempSkill("dcsigong_check");
player
.useCard({ name: "sha", isCard: true }, trigger.player, false)
.set("shanReq", num)
.set("oncard", (card) => {
var evt = _status.event;
evt.baseDamage++;
for (var target of game.filterPlayer(null, null, true)) {
var id = target.playerid;
var map = evt.customArgs;
if (!map[id]) map[id] = {};
map[id].shanRequired = evt.shanReq;
}
});
}
},
subSkill: {
round: { charlotte: true },
check: {
charlotte: true,
forced: true,
popup: false,
trigger: { source: "damageSource" },
filter: function (event, player) {
return (
event.card &&
event.card.name == "sha" &&
event.getParent(3).name == "dcsigong"
);
},
content: function () {
player.addTempSkill("dcsigong_round", "roundStart");
},
},
},
},
//孙寒华
dchuiling: {
audio: 2,
trigger: { player: "useCard" },
forced: true,
direct: true,
filter: function () {
return ui.discardPile.childNodes.length > 0;
},
onremove: true,
mark: true,
marktext: "灵",
intro: {
name2: "灵",
mark: function (dialog, storage, player) {
dialog.addText("共有" + (storage || 0) + "个标记");
dialog.addText("注:图标的颜色代表弃牌堆中较多的颜色");
},
},
global: "dchuiling_hint",
content: function () {
"step 0";
var mark = false;
var red = 0,
black = 0;
for (var i = 0; i < ui.discardPile.childNodes.length; i++) {
var color = get.color(ui.discardPile.childNodes[i]);
if (color == "red") red++;
if (color == "black") black++;
}
if (red == black) event.finish();
else if (red > black) {
player.logSkill("dchuiling");
player.recover();
event.finish();
if (get.color(trigger.card) == "black") mark = true;
event.logged = true;
} else {
if (!event.isMine() && !event.isOnline()) game.delayx();
player
.chooseTarget(
get.prompt("dchuiling"),
"弃置一名角色的一张牌",
(card, player, target) => {
return target.countDiscardableCards(player, "he") > 0;
}
)
.set("ai", (target) => {
return get.effect(target, { name: "guohe_copy2" }, _status.event.player);
});
if (get.color(trigger.card) == "red") mark = true;
}
if (mark) {
if (!event.logged) player.logSkill("dchuiling");
player.addMark("dchuiling", 1);
event.logged = true;
}
"step 1";
if (result.bool) {
var target = result.targets[0];
if (!event.logged) player.logSkill("dchuiling", target);
else player.line(target);
player.discardPlayerCard(target, "he", true);
}
},
subSkill: {
hint: {
trigger: {
global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"],
},
forced: true,
popup: false,
lastDo: true,
forceDie: true,
forceOut: true,
filter: function (event, player) {
if (event._dchuiling_checked) return false;
event._dchuiling_checked = true;
var cards = event.getd();
if (!cards.filterInD("d").length) return false;
return true;
},
markColor: [
["rgba(241, 42, 42, 0.75)", "black"],
["", ""],
["rgba(18, 4, 4, 0.75)", "rgb(200, 200, 200)"],
],
content: function () {
"step 0";
var red = 0,
black = 0;
for (var i = 0; i < ui.discardPile.childNodes.length; i++) {
var color = get.color(ui.discardPile.childNodes[i]);
if (color == "red") red++;
if (color == "black") black++;
}
if (trigger.name.indexOf("lose") == 0) {
var cards = trigger.getd().filterInD("d");
for (var i = 0; i < cards.length; i++) {
var color = get.color(cards[i]);
if (color == "red") red++;
if (color == "black") black++;
}
}
game.broadcastAll(function (ind) {
var bgColor = lib.skill.dchuiling_hint.markColor[ind][0],
text =
'灵';
for (var player of game.players) {
if (player.marks.dchuiling) {
player.marks.dchuiling.firstChild.style.backgroundColor = bgColor;
player.marks.dchuiling.firstChild.innerHTML = text;
}
}
}, Math.sign(black - red) + 1);
},
},
},
mod: {
aiOrder: function (player, card, num) {
if (get.itemtype(card) != "card") return;
var len = ui.discardPile.childNodes.length;
if (!len) {
var type = get.type(card);
if (type == "basic" || type == "trick") {
if (player.getDamagedHp() > 0) {
return num + (get.color(card) == "red" ? 15 : 10);
}
return num + 10;
}
return;
}
if (len > 40) return;
var red = 0,
black = 0;
for (var i = 0; i < ui.discardPile.childNodes.length; i++) {
var color = get.color(ui.discardPile.childNodes[i]);
if (color == "red") red++;
if (color == "black") black++;
}
if (red == black) {
var type = get.type(card);
if (type == "basic" || type == "trick") {
if (player.getDamagedHp() > 0) {
return num + (get.color(card) == "red" ? 15 : 10);
}
return num + 10;
}
return;
} else {
var color = get.color(card);
if ((color == "red" && red < black) || (color == "black" && red > black))
return num + 10;
}
},
},
},
dcchongxu: {
audio: 2,
enable: "phaseUse",
limited: true,
skillAnimation: true,
animationColor: "wood",
derivation: ["dctaji", "dcqinghuang"],
filterCard: () => false,
selectCard: [0, 1],
prompt: function () {
return (
"限定技。你可以失去〖汇灵〗,增加" +
Math.min(game.countPlayer(), _status.event.player.countMark("dchuiling")) +
"点体力上限,然后获得〖踏寂〗和〖清荒〗。"
);
},
filter: function (event, player) {
return player.countMark("dchuiling") >= 4;
},
content: function () {
"step 0";
player.awakenSkill("dcchongxu");
player.removeSkills("dchuiling");
player.gainMaxHp(Math.min(game.countPlayer(), player.countMark("dchuiling")));
"step 1";
player.addSkills(["dctaji", "dcqinghuang"]);
},
ai: {
combo: "dchuiling",
order: function (itemp, player) {
if (
player.hasCard((card) => {
return get.type(card) != "equip" && player.getUseValue(card) > 1;
}, "h")
)
return 12;
return 0.1;
},
result: {
player: function (player) {
var count = player.countMark("dchuiling");
if (count >= game.countPlayer() - 1) return 1;
return count >= 6 || player.hp <= 2 ? 1 : 0;
},
},
},
},
dctaji: {
audio: 2,
trigger: {
player: "loseAfter",
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
forced: true,
locked: false,
filter: function (event, player) {
var evt = event.getl(player);
return evt && evt.hs && evt.hs.length;
},
content: function () {
"step 0";
var evt = trigger.getParent();
var effects = [
[
"useCard",
function () {
"step 0";
var targets = game.filterPlayer((current) => {
return current.countDiscardableCards(player, "he") && current != player;
});
if (!targets.length) event.finish();
else
player
.chooseTarget(
"踏寂:弃置其他角色一张牌",
true,
(card, player, target) => {
return _status.event.targets.includes(target);
}
)
.set("targets", targets)
.set("ai", (target) => {
return get.effect(
target,
{ name: "guohe_copy2" },
_status.event.player
);
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.line(target);
player.discardPlayerCard(target, "he", true);
}
},
],
[
"respond",
function () {
player.draw();
},
],
[
"discard",
function () {
player.recover();
},
],
[
"other",
function () {
player.addSkill("dctaji_damage");
player.addMark("dctaji_damage", 1, false);
game.log(player, "下一次对其他角色造成的伤害", "#g+1");
},
],
];
var name = evt.name;
if (trigger.name == "loseAsync") name = evt.type;
var list = ["useCard", "respond", "discard", "other"];
if (!list.includes(name)) name = "other";
for (var i = 0; i < 1 + player.countMark("dcqinghuang_add"); i++) {
if (!list.length) break;
if (!list.includes(name)) name = list.randomRemove(1)[0];
if (name == "useCard") list.remove("useCard");
for (var effect of effects) {
if (effect[0] == name) {
list.remove(name);
var next = game.createEvent("dctaji_" + name);
next.player = player;
next.setContent(effect[1]);
break;
}
}
}
},
subSkill: {
damage: {
trigger: { source: "damageBegin1" },
forced: true,
charlotte: true,
onremove: true,
filter: function (event, player) {
return event.player != player;
},
content: function () {
trigger.num += player.countMark("dctaji_damage");
player.removeSkill("dctaji_damage");
},
intro: {
content: "下次对其他角色造成伤害时,此伤害+#",
},
},
},
},
dcqinghuang: {
audio: 2,
trigger: { player: "phaseUseBegin" },
filter: function (event, player) {
return player.maxHp > 1;
},
check: function (event, player) {
var num1 = player.countCards("h");
var num2 = player.countCards("h", (card) => player.hasValueTarget(card));
var num3 = player.getHandcardLimit();
if (player.isDamaged()) {
return num2 > 1 || num1 - num2 - num3 > 0;
} else {
return (
num2 > 2 + Math.max(0, 3 - player.hp) || (player.hp > 2 && num1 - num2 - num3 > 2)
);
}
},
content: function () {
player.loseMaxHp();
player.addTempSkill("dcqinghuang_add");
player.addMark("dcqinghuang_add", 1, false);
},
ai: {
combo: "dctaji",
},
subSkill: {
add: {
charlotte: true,
onremove: true,
},
},
},
//孟节
dcyinlu: {
audio: 2,
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
locked: false,
derivation: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"],
global: ["dcyinlu_lequan", "dcyinlu_huoxi", "dcyinlu_zhangqi", "dcyinlu_yunxiang"],
group: "dcyinlu_move",
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
hasMark: function (target) {
return lib.skill.dcyinlu.derivation.some((i) => target.hasMark(i));
},
content: function () {
"step 0";
event.marks = lib.skill.dcyinlu.derivation.slice(0, 3);
if (game.countPlayer() <= 2) event.goto(3);
"step 1";
player
.chooseTarget("引路:令三名角色分别获得〖引路〗标记", true, 3)
.set("targetprompt", () => {
return get.translation(
lib.skill.dcyinlu.derivation[ui.selected.targets.length - 1]
);
})
.set("complexSelect", true)
.set("ai", (target) => {
var player = _status.event.player;
if (ui.selected.targets.length == 2)
return get.effect(target, { name: "losehp" }, player, player);
return get.attitude(player, target);
});
"step 2";
if (result.bool) {
var targets = result.targets;
player.line(targets);
for (var i = 0; i < targets.length; i++) {
targets[i].addMark(event.marks[i]);
}
}
event.goto(5);
"step 3";
player.logSkill("dcyinlu", game.players);
var list = [];
for (var mark of event.marks) {
list.push([
mark,
'",
]);
}
var target = game.filterPlayer((i) => i != player)[0];
if (!game.hasPlayer((current) => current != player)) target = player;
event.target = target;
player
.chooseButton([
"引路:令" + get.translation(target) + "获得2枚〖引路〗标记",
[list, "textbutton"],
])
.set("ai", (button) => {
var mark = button.link;
if (mark == "dcyinlu_lequan") return 9;
if (mark == "dcyinlu_zhangqi") return 10;
return 8;
})
.set("forced", true)
.set("selectButton", 2)
.set("forcebutton", true);
"step 4";
if (result.bool) {
var marks = result.links;
for (var mark of marks) target.addMark(mark, 1);
event.marks.removeArray(marks);
for (var mark of event.marks) player.addMark(mark, 1);
}
"step 5";
player.addMark("dcyinlu_yunxiang", 1);
player.addMark("dcyinlu_xiang", 1);
game.log(player, "获得了1点芸香值");
},
subSkill: {
move: {
audio: "dcyinlu",
trigger: {
player: "phaseZhunbeiBegin",
global: "die",
},
direct: true,
filter: function (event, player) {
if (event.name == "die") {
return lib.skill.dcyinlu.hasMark(event.player);
}
return game.hasPlayer((current) => {
return lib.skill.dcyinlu.hasMark(current);
});
},
content: function () {
"step 0";
if (trigger.name == "die") {
var marks = lib.skill.dcyinlu.derivation.filter((mark) =>
trigger.player.hasMark(mark)
);
event.marks = marks;
event.goto(3);
} else {
if (_status.connectMode)
game.broadcastAll(function () {
_status.noclearcountdown = true;
});
player
.chooseTarget(
get.prompt("dcyinlu_move"),
"移动一名角色的〖引路〗标记",
2,
(card, player, target) => {
if (ui.selected.targets.length == 0)
return lib.skill.dcyinlu.hasMark(target);
return true;
}
)
.set("ai", (target) => {
var player = _status.event.player;
if (ui.selected.targets.length == 0) {
var owned = lib.skill.dcyinlu.derivation.filter((i) =>
target.hasMark(i)
);
var att = get.attitude(player, target);
if (att > 0) {
if (owned.includes("dcyinlu_zhangqi"))
return target.hasCard({ suit: "spade" }, "he") ? 5 : 10;
if (
owned.includes("dcyinlu_lequan") &&
target.isHealthy() &&
game.hasPlayer((current) => {
return (
current != target &&
get.recoverEffect(current, player, player) > 0
);
})
)
return 2;
return 0;
}
if (att < 0) {
if (owned.some((i) => i != "dcyinlu_zhangqi")) return 8;
return 0;
}
if (
owned.includes("dcyinlu_zhangqi") &&
game.hasPlayer((current) => {
return (
current != target &&
get.effect(
current,
{ name: "losehp" },
player,
player
) > 0
);
})
)
return 3;
return 1;
} else {
var targetx = ui.selected.targets[0];
var att = get.attitude(player, targetx),
att2 = get.attitude(player, target);
var owned = lib.skill.dcyinlu.derivation.filter((i) =>
targetx.hasMark(i)
);
if (att > 0) {
if (owned.includes("dcyinlu_zhangqi")) return -att2;
if (owned.includes("dcyinlu_lequan"))
return get.recoverEffect(target, player, player);
} else if (att < 0) {
if (owned.some((i) => i != "dcyinlu_zhangqi")) return att2;
} else {
if (owned.includes("dcyinlu_zhangqi"))
return get.effect(
target,
{ name: "losehp" },
player,
player
);
return att2;
}
}
return Math.random();
})
.set("complexTarget", true);
}
"step 1";
if (result.bool) {
var marks = lib.skill.dcyinlu.derivation;
var targets = result.targets,
owned = marks.filter((mark) => targets[0].hasMark(mark));
event.targets = targets;
if (owned.length == 1) event._result = { bool: true, control: owned[0] };
else {
player
.chooseControl(owned)
.set(
"prompt",
"引路:选择要移动" + get.translation(targets[0]) + "的标记"
)
.set(
"choiceList",
owned.map((mark) => {
return (
'【' +
get.translation(mark) +
"】
" +
lib.translate[mark + "_info"] +
"
"
);
})
)
.set("displayIndex", false)
.set("ai", () => {
return _status.event.choice;
})
.set(
"choice",
(function () {
var att = get.attitude(player, targets[0]),
att2 = get.attitude(player, targets[1]);
if (att > 0) {
if (owned.includes("dcyinlu_zhangqi") && att2 < 0)
return "dcyinlu_zhangqi";
if (owned.includes("dcyinlu_lequan") && att2 > 0)
return "dcyinlu_lequan";
} else if (att < 0) {
var marksx = owned.filter((i) => i != "dcyinlu_zhangqi");
if (marksx.length && att2 > 0) return marksx[0];
return owned[0];
} else {
if (owned.includes("dcyinlu_zhangqi"))
return "dcyinlu_zhangqi";
}
if (owned.length > 1) owned.remove("dcyinlu_zhangqi");
return owned[0];
})()
);
}
} else {
if (_status.connectMode)
game.broadcastAll(function () {
delete _status.noclearcountdown;
game.stopCountChoose();
});
event.finish();
}
"step 2";
if (_status.connectMode)
game.broadcastAll(function () {
delete _status.noclearcountdown;
game.stopCountChoose();
});
var mark = result.control,
count = targets[0].countMark(mark);
player.logSkill("dcyinlu_move", targets, false);
player.line2(targets, mark == "dcyinlu_zhangqi" ? "fire" : "green");
targets[0].removeMark(mark, count);
targets[1].addMark(mark, count);
event.finish();
"step 3";
player
.chooseTarget("引路:是否转移“" + get.translation(event.marks[0]) + "”标记?")
.set("ai", (target) => {
var player = _status.event.player,
mark = _status.event.mark;
if (mark == "dcyinlu_zhangqi")
return get.effect(target, { name: "losehp" }, player, player) + 0.1;
if (mark == "dcyinlu_lequan")
return (
get.recoverEffect(target, player, player) +
get.attitude(player, target) / 5
);
return get.attitude(player, target);
})
.set("mark", event.marks[0]);
"step 4";
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcyinlu_move", target);
var count = trigger.player.countMark(event.marks[0]);
trigger.player.removeMark(event.marks[0], count, false);
target.addMark(event.marks[0], count);
}
"step 5";
event.marks.shift();
if (event.marks.length) event.goto(3);
},
},
lequan: {
trigger: { player: "phaseJieshuBegin" },
direct: true,
charlotte: true,
filter: function (event, player) {
return (
player.hasMark("dcyinlu_lequan") &&
game.hasPlayer((current) => current.hasSkill("dcyinlu"))
);
},
marktext: "乐",
intro: {
name: "乐泉",
name2: "乐泉",
markcount: () => 0,
content: "结束阶段,你可以弃置一张♦牌并回复1点体力。",
},
content: function () {
"step 0";
player
.chooseToDiscard(
"乐泉:是否弃置一张♦牌并回复1点体力?",
{ suit: "diamond" },
"he"
)
.set("ai", (card) => {
if (_status.event.goon) return 7 - get.value(card);
return 0;
})
.set("logSkill", "dcyinlu_lequan")
.set("goon", get.recoverEffect(player, player));
"step 1";
if (result.bool) {
player.recover();
}
},
},
huoxi: {
trigger: { player: "phaseJieshuBegin" },
direct: true,
charlotte: true,
filter: function (event, player) {
return (
player.hasMark("dcyinlu_huoxi") &&
game.hasPlayer((current) => current.hasSkill("dcyinlu"))
);
},
marktext: "藿",
intro: {
name: "藿溪",
name2: "藿溪",
markcount: () => 0,
content: "结束阶段,你可以弃置一张♥牌并摸两张牌。",
},
content: function () {
"step 0";
player
.chooseToDiscard("藿溪:是否弃置一张♥牌并摸两张牌?", { suit: "heart" }, "he")
.set("ai", (card) => {
return 6 - get.value(card);
})
.set("logSkill", "dcyinlu_huoxi");
"step 1";
if (result.bool) {
player.draw(2);
}
},
},
zhangqi: {
trigger: { player: "phaseJieshuBegin" },
forced: true,
direct: true,
charlotte: true,
filter: function (event, player) {
return (
player.hasMark("dcyinlu_zhangqi") &&
game.hasPlayer((current) => current.hasSkill("dcyinlu"))
);
},
marktext: "瘴",
intro: {
name: "瘴气",
name2: "瘴气",
markcount: () => 0,
content: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。",
},
content: function () {
"step 0";
player
.chooseToDiscard("瘴气:弃置一张♠牌,或失去1点体力", { suit: "spade" }, "he")
.set("ai", (card) => {
if (_status.event.goon) return 7 - get.value(card);
return 0;
})
.set("logSkill", "dcyinlu_zhangqi")
.set("goon", get.effect(player, { name: "losehp" }, player) < 0);
"step 1";
if (!result.bool) {
player.logSkill("dcyinlu_zhangqi");
player.loseHp();
}
},
},
yunxiang: {
trigger: { player: ["phaseJieshuBegin", "damageBegin4"] },
direct: true,
charlotte: true,
filter: function (event, player) {
if (!game.hasPlayer((current) => current.hasSkill("dcyinlu"))) return false;
if (event.name == "phaseJieshu") return player.hasMark("dcyinlu_yunxiang");
return player.hasMark("dcyinlu_yunxiang") && player.hasMark("dcyinlu_xiang");
},
onremove: function (player) {
delete player.storage.dcyinlu_xiang;
},
marktext: "芸",
intro: {
name: "芸香",
name2: "芸香",
markcount: function (storage, player) {
return player.countMark("dcyinlu_xiang");
},
content: function (storage, player) {
return (
"①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。当前芸香值:" +
player.countMark("dcyinlu_xiang")
);
},
},
content: function () {
"step 0";
if (trigger.name == "phaseJieshu") {
player
.chooseToDiscard(
"芸香:是否弃置一张♣牌,获得1枚“香”?",
{ suit: "club" },
"he"
)
.set("ai", (card) => {
return (
6 -
get.value(card) +
2.5 * _status.event.player.countMark("dcyinlu_xiang")
);
})
.set("logSkill", "dcyinlu_yunxiang");
} else {
player
.chooseBool(
"芸香:是否移去所有“香”,令此伤害-" +
player.countMark("dcyinlu_xiang") +
"?"
)
.set("ai", () => {
return _status.event.bool;
})
.set("bool", get.damageEffect(player, trigger.source, player) < 0);
}
"step 1";
if (result.bool) {
if (trigger.name == "phaseJieshu") {
player.addMark("dcyinlu_xiang", 1, false);
game.log(player, "获得了1点芸香值");
} else {
player.logSkill("dcyinlu_yunxiang");
var num = player.countMark("dcyinlu_xiang");
player.removeMark("dcyinlu_xiang", num, false);
game.log(player, "扣减了", num, "点芸香值");
trigger.num = Math.max(0, trigger.num - num);
}
}
},
},
},
},
dcyouqi: {
audio: 2,
trigger: { global: "loseAfter" },
filter: function (event, player) {
if (event.getParent(3).name.indexOf("dcyinlu_") != 0 || player == event.player)
return false;
return true;
},
derivation: "dcyouqi_faq",
direct: true,
forced: true,
content: function () {
if (
Math.random() < 1.25 - 0.25 * get.distance(player, trigger.player) ||
get.isLuckyStar(player)
) {
player.logSkill("dcyouqi");
player.gain(trigger.cards.filterInD("d"), "gain2");
}
},
ai: {
combo: "dcyinlu",
},
},
//孙资刘放
dcqinshen: {
audio: 2,
trigger: { player: "phaseDiscardEnd" },
frequent: true,
prompt2: function () {
return "摸" + get.cnNumber(lib.skill.dcqinshen.getNum()) + "张牌";
},
getNum: function () {
var list = lib.suit.slice();
game.getGlobalHistory("cardMove", function (evt) {
if (evt.name != "lose" && evt.name != "cardsDiscard") return false;
if (evt.name == "lose" && evt.position != ui.discardPile) return false;
for (var card of evt.cards) list.remove(get.suit(card, false));
});
return list.length;
},
filter: function (event, player) {
return lib.skill.dcqinshen.getNum() > 0;
},
content: function () {
player.draw(lib.skill.dcqinshen.getNum());
},
},
dcweidang: {
audio: 2,
trigger: { global: "phaseJieshuBegin" },
/**
* @deprecated
*/
getLength: (card) => get.cardNameLength(card),
direct: true,
filter: function (event, player) {
var num = lib.skill.dcqinshen.getNum();
return (
event.player != player &&
(_status.connectMode
? player.countCards("he")
: player.hasCard((card) => get.cardNameLength(card) == num, "he"))
);
},
content: function () {
"step 0";
var num = lib.skill.dcqinshen.getNum();
event.num = num;
player
.chooseCard(
get.prompt("dcweidang"),
"将一张字数为" +
num +
"的牌置于牌堆底,然后获得一张字数为" +
num +
"的牌。若你能使用此牌,你使用之。",
"he",
(card, player, target) => {
return get.cardNameLength(card) == _status.event.num;
}
)
.set("num", num)
.set("ai", (card) => {
return 5 - get.value(card);
});
"step 1";
if (result.bool) {
player.logSkill("dcweidang"), player.lose(result.cards[0], ui.cardPile);
game.broadcastAll(function (player) {
var cardx = ui.create.card();
cardx.classList.add("infohidden");
cardx.classList.add("infoflip");
player.$throw(cardx, 1000, "nobroadcast");
}, player);
game.delayx();
} else event.finish();
"step 2";
var card = get.cardPile((cardx) => get.cardNameLength(cardx) == num);
if (card) {
player.gain(card, "gain2");
if (player.hasUseTarget(card)) {
player.chooseUseTarget(card, true);
}
}
},
},
//三袁
dcneifa: {
audio: 2,
trigger: { player: "phaseUseBegin" },
content: function () {
"step 0";
player.draw(3);
player.chooseToDiscard(true, "he").set("ai", function (cardx) {
var player = _status.event.player;
var num = 0;
var hs = player.getCards("h");
var muniu = player.getEquip("muniu");
if (muniu && muniu.cards) hs = hs.concat(muniu.cards);
if (get.type(cardx) == "basic") {
var shas = hs.filter(function (card) {
return (
card != cardx &&
get.name(card, player) == "sha" &&
player.hasValueTarget(card, false)
);
});
var numx = player.countCards("h", function (card) {
return get.type2(card, player) == "trick";
});
num +=
Math.min(numx, Math.max(0, shas.length - player.getCardUsable("sha"))) * 0.65;
num +=
Math.min(
player.getCardUsable("sha") + numx,
shas.filter(function (card) {
return (
game.countPlayer(function (current) {
return (
player.canUse(card, current) &&
get.effect(current, card, player, player) > 0
);
}) > 1
);
}).length
) * 1.1;
var taos = Math.min(
player.maxHp - player.hp,
hs.filter(function (card) {
return cardx != card && get.name(card, player) == "tao";
}).length
);
num += taos * player.getDamagedHp() * 1.2;
} else if (get.type2(cardx) == "trick") {
var numx = Math.sqrt(
Math.min(
5,
player.countCards("h", function (card) {
return get.type(card, player) == "basic";
})
)
);
num +=
hs.filter(function (card) {
return (
card != cardx &&
get.type2(card) == "trick" &&
player.hasValueTarget(card)
);
}).length * 0.65;
} else num = 4;
return num * 1.5 - get.value(cardx);
});
"step 1";
if (
result.bool &&
result.cards &&
result.cards.length &&
get.type(result.cards[0]) != "equip"
) {
var name = get.type(result.cards[0]) == "basic" ? "dcneifa_basic" : "dcneifa_trick";
player.addTempSkill(name, "phaseUseAfter");
var num = Math.min(
5,
player.countCards("h", function (cardx) {
var type = get.type(cardx, player);
return (name == "dcneifa_basic") != (type == "basic") && type != "equip";
})
);
if (num > 0) player.addMark(name, num, false);
else player.storage[name] = 0;
}
},
ai: {
threaten: 2.33,
},
},
dcneifa_basic: {
mark: true,
marktext: "伐",
onremove: true,
intro: {
name: "内伐 - 基本牌",
content:
"本回合内不能使用锦囊牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。",
},
mod: {
cardEnabled: function (card, player) {
if (get.type(card, "trick") == "trick") return false;
},
cardSavable: function (card, player) {
if (get.type(card, "trick") == "trick") return false;
},
cardUsable: function (card, player, num) {
if (card.name == "sha") {
return num + player.countMark("dcneifa_basic");
}
},
},
trigger: { player: "useCard2" },
filter: function (event, player) {
if (event.card.name != "sha") return false;
return game.hasPlayer(function (current) {
return !event.targets.includes(current) && player.canUse(event.card, current, false);
});
},
direct: true,
content: function () {
"step 0";
player
.chooseTarget(
get.prompt("dcneifa"),
"为" + get.translation(trigger.card) + "额外指定一个目标",
function (card, player, target) {
return (
!_status.event.sourcex.includes(target) &&
player.canUse(_status.event.card, target, false)
);
}
)
.set("sourcex", trigger.targets)
.set("ai", function (target) {
var player = _status.event.player;
return get.effect(target, _status.event.card, player, player);
})
.set("card", trigger.card);
"step 1";
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
"step 2";
player.logSkill("dcneifa", event.targets);
trigger.targets.addArray(event.targets);
},
},
dcneifa_trick: {
trigger: { player: "useCard2" },
direct: true,
mark: true,
marktext: "伐",
onremove: true,
mod: {
cardEnabled: function (card, player) {
if (get.type(card) == "basic") return false;
},
cardSavable: function (card, player) {
if (get.type(card) == "basic") return false;
},
},
intro: {
name: "内伐 - 锦囊牌",
content: "本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标。",
},
filter: function (event, player) {
if (get.type(event.card) != "trick") return false;
if (event.targets && event.targets.length > 0) return true;
var info = get.info(event.card);
if (info.allowMultiple == false) return false;
if (event.targets && !info.multitarget) {
if (
game.hasPlayer(function (current) {
return (
!event.targets.includes(current) &&
lib.filter.targetEnabled2(event.card, player, current)
);
})
) {
return true;
}
}
return false;
},
content: function () {
"step 0";
var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标";
player
.chooseTarget(get.prompt("dcneifa"), function (card, player, target) {
var player = _status.event.player;
if (_status.event.targets.includes(target)) return true;
return lib.filter.targetEnabled2(_status.event.card, player, target);
})
.set("prompt2", prompt2)
.set("ai", function (target) {
var trigger = _status.event.getTrigger();
var player = _status.event.player;
return (
get.effect(target, trigger.card, player, player) *
(_status.event.targets.includes(target) ? -1 : 1)
);
})
.set("targets", trigger.targets)
.set("card", trigger.card);
"step 1";
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
"step 2";
if (event.targets) {
player.logSkill("dcneifa", event.targets);
if (trigger.targets.includes(event.targets[0]))
trigger.targets.removeArray(event.targets);
else trigger.targets.addArray(event.targets);
}
},
},
//桥蕤
dcaishou: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
filter: function (event, player) {
return player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h");
},
forced: true,
locked: false,
group: ["dcaishou_draw", "dcaishou_lose"],
subfrequent: ["draw"],
content: function () {
"step 0";
player.discard(player.getCards("h", (card) => card.hasGaintag("dcaishou_tag")));
"step 1";
var len = 0;
player.getHistory("lose", (evt) => {
if (evt.getParent(2) == event) len += evt.cards.length;
});
if (len > Math.max(0, player.hp) && player.maxHp < 9) {
player.gainMaxHp();
}
},
subSkill: {
draw: {
audio: "dcaishou",
trigger: { player: "phaseJieshuBegin" },
frequent: function (event, player) {
return player.maxHp > 1;
},
prompt2: function (event, player) {
return "摸" + get.cnNumber(player.maxHp) + "张牌,称为“隘”";
},
check: function (event, player) {
return player.maxHp > 1;
},
content: function () {
player.draw(player.maxHp).gaintag = ["dcaishou_tag"];
},
},
lose: {
audio: "dcaishou",
trigger: {
player: "loseAfter",
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
forced: true,
locked: false,
filter: function (event, player) {
if (player == _status.currentPhase) return false;
var evt = event.getl(player);
if (
!evt ||
!evt.hs ||
!evt.hs.length ||
player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h")
)
return false;
if (event.name == "lose") {
for (var i in event.gaintag_map) {
if (event.gaintag_map[i].includes("dcaishou_tag")) return true;
}
return false;
}
return player.hasHistory("lose", function (evt) {
if (event != evt.getParent()) return false;
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("dcaishou_tag")) return true;
}
return false;
});
},
content: function () {
player.loseMaxHp();
},
},
},
},
dcsaowei: {
audio: 2,
trigger: { global: "useCardAfter" },
filter: function (event, player) {
return (
event.player != player &&
event.card.name == "sha" &&
event.targets.length &&
!event.targets.includes(player) &&
event.targets.every((current) => player.inRange(current) && current.isIn()) &&
player.hasCard((card) => card.hasGaintag("dcaishou_tag"), "h")
);
},
direct: true,
content: function () {
"step 0";
player.chooseCardTarget({
position: "hs",
prompt: get.prompt("dcsaowei"),
prompt2: "将一张“隘”当做【杀】对" + get.translation(trigger.targets) + "使用",
targets: trigger.targets,
filterCard: function (card, player) {
if (get.itemtype(card) == "card" && !card.hasGaintag("dcaishou_tag"))
return false;
return _status.event.targets.every((current) =>
player.canUse(get.autoViewAs({ name: "sha" }, [card]), current, false)
);
},
filterTarget: function (card, player, target) {
if (!_status.event.targets.includes(target)) return false;
card = get.autoViewAs({ name: "sha" }, [card]);
return lib.filter.filterTarget.apply(this, arguments);
},
selectTarget: -1,
ai1: function (card) {
var player = _status.event.player;
if (
player.isHealthy() &&
player.hasSkill("dcaishou") &&
player.countCards("h", (card) => card.hasGaintag("dcaishou_tag") == 1)
)
return 0;
var eff = 0;
for (var target of _status.event.targets) {
eff += get.effect(
target,
get.autoViewAs({ name: "sha" }, [card]),
player,
player
);
}
if (eff > 0) return 6.5 + eff / 10 - get.value(card);
return 0;
},
ai2: () => 1,
});
"step 1";
if (result.bool) {
var cards = result.cards,
targets = result.targets;
event.cards = cards;
var next = player.useCard({ name: "sha" }, cards, targets, false, "dcsaowei");
player
.when("useCardAfter")
.filter((event) => event == next)
.then(() => {
if (player.hasHistory("sourceDamage", (evt) => evt.card == trigger.card)) {
var cards = trigger.cards.filterInD();
if (cards.length > 0) player.gain(cards, "gain2");
}
});
}
},
},
//向朗
dckanji: {
audio: 2,
enable: "phaseUse",
usable: 2,
filter: function (event, player) {
return player.countCards("h");
},
content: function () {
"step 0";
player.showHandcards();
"step 1";
var suits = [];
player.getCards("h", (card) => suits.add(get.suit(card)));
if (suits.length == player.countCards("h")) {
player.draw(2);
event.suitsLength = suits.length;
player.addTempSkill("dckanji_check");
}
},
subSkill: {
check: {
trigger: { player: "gainAfter" },
filter: function (event, player) {
if (event.getParent(2).name != "dckanji") return false;
var len = event.getParent(2).suitsLength;
var suits = [];
player.getCards("h", (card) => suits.add(get.suit(card)));
return suits.length >= 4 && len < 4;
},
charlotte: true,
forced: true,
popup: false,
content: function () {
player.skip("phaseDiscard");
game.log(player, "跳过了", "#y弃牌阶段");
},
},
},
ai: {
order: 9,
result: {
player: function (player, target) {
var count = player.countCards("h");
if (count > 4) return false;
var suits = [];
player.getCards("h", (card) => suits.add(get.suit(card)));
return suits.length == count ? 1 : 0;
},
},
},
},
dcqianzheng: {
audio: 2,
trigger: { target: "useCardToTargeted" },
usable: 2,
filter: function (event, player) {
return (
event.player != player &&
(get.type(event.card) == "trick" || event.card.name == "sha") &&
player.countCards("he") > 1
);
},
async cost(event, trigger, player) {
const str =
",若重铸的牌中没有" +
get.translation(get.type2(trigger.card)) +
"牌,你于" +
get.translation(trigger.cards) +
"进入弃牌堆后获得之";
event.result = await player
.chooseCard(
get.prompt("dcqianzheng"),
"重铸两张牌" + (trigger.cards.length ? str : "") + "。",
2,
"he",
lib.filter.cardRecastable
)
.set("ai", (card) => {
var val = get.value(card);
if (get.type2(card) == _status.event.type) val += 0.5;
return 6 - val;
})
.set("type", get.type2(trigger.card))
.forResult();
},
async content(event, trigger, player) {
if (event.cards.every((card) => get.type2(card) != get.type2(trigger.card))) {
trigger.getParent().dcqianzheng = true;
player.addTempSkill("dcqianzheng_gain");
}
await player.recast(event.cards);
},
subSkill: {
gain: {
trigger: { global: "cardsDiscardAfter" },
filter: function (event, player) {
var evt = event.getParent();
if (evt.name != "orderingDiscard") return false;
return evt.relatedEvent.dcqianzheng && event.cards.filterInD("d").length;
},
charlotte: true,
forced: true,
popup: false,
content: function () {
player.gain(trigger.cards.filterInD("d"), "gain2");
},
},
},
},
//秦朗
dchaochong: {
audio: 2,
trigger: { player: "useCardAfter" },
filter: function (event, player) {
return player.getHandcardLimit() != player.countCards("h");
},
direct: true,
locked: false,
content: function () {
"step 0";
var del = player.getHandcardLimit() - player.countCards("h");
event.delta = del;
if (del > 0) {
player
.chooseBool(
get.prompt("dchaochong"),
"摸" + get.cnNumber(Math.min(5, del)) + "张牌,然后令你的手牌上限-1"
)
.set("ai", () => {
var player = _status.event.player;
if (
player.isPhaseUsing() &&
player.hasCard(
(cardx) => player.hasUseTarget(cardx) && player.hasValueTarget(cardx),
"hs"
)
)
return false;
return true;
});
} else if (del < 0) {
player
.chooseToDiscard(
get.prompt("dchaochong"),
"弃置" + get.cnNumber(-del) + "张手牌,然后令你的手牌上限+1",
-del
)
.set("ai", (card) => {
var player = _status.event.player;
if (
player.isPhaseUsing() &&
player.hasCard((cardx) => player.hasValueTarget(cardx), "hs")
)
return 6 - player.getUseValue(card);
return 5 - get.value(card);
})
.set("logSkill", "dchaochong");
}
"step 1";
if (result.bool) {
if (event.delta > 0) {
player.logSkill("dchaochong");
player.draw(Math.min(5, event.delta));
lib.skill.dchaochong.change(player, -1);
} else if (event.delta < 0) {
lib.skill.dchaochong.change(player, 1);
}
}
},
change: function (player, num) {
if (typeof player.storage.dchaochong !== "number") player.storage.dchaochong = 0;
if (!num) return;
player.storage.dchaochong += num;
player.markSkill("dchaochong");
game.log(player, "的手牌上限", "#g" + (num > 0 ? "+" : "") + num);
},
markimage: "image/card/handcard.png",
intro: {
content: function (storage, player) {
var num = player.storage.dchaochong;
return "手牌上限" + (num >= 0 ? "+" : "") + num;
},
},
mod: {
maxHandcard: function (player, num) {
return num + player.countMark("dchaochong");
},
},
ai: { threaten: 2.2 },
},
dcjinjin: {
audio: 2,
trigger: {
source: "damageSource",
player: "damageEnd",
},
usable: 2,
logTarget: "source",
check: function (event, player) {
if (typeof player.storage.dchaochong != "number" || player.storage.dchaochong == 0)
return true;
var evt = event.getParent("useCard");
if (evt && evt.player == player && event.source == player) return false;
if (player.isPhaseUsing() && player.storage.dchaochong == -1) return true;
return Math.abs(player.storage.dchaochong) >= 2;
},
prompt2: function (event, player) {
var str = "";
if (typeof player.storage.dchaochong == "number" && player.storage.dchaochong != 0) {
str += "重置因〖佞宠〗增加或减少的手牌上限,";
}
var num = Math.abs(player.countMark("dchaochong")) || 1;
if (event.source && event.source.isIn()) {
str +=
"令伤害来源弃置至多" +
get.cnNumber(num) +
"张牌,然后你摸" +
num +
"-X张牌(X为其弃置的牌数)";
} else str += "你摸" + get.cnNumber(num) + "张牌";
return str;
},
content: function () {
"step 0";
var del = Math.abs(player.countMark("dchaochong")) || 1;
event.delta = del;
player.storage.dchaochong = 0;
if (player.hasSkill("dchaochong", null, false, false)) player.markSkill("dchaochong");
game.log(player, "重置了手牌上限");
if (trigger.source && trigger.source.isIn()) {
trigger.source
.chooseToDiscard(
get.translation(player) + "对你发动了【矜谨】",
"弃置至多" +
get.cnNumber(del) +
"张牌,然后" +
get.translation(player) +
"摸" +
del +
"-X张牌(X为你弃置的牌数)。",
[1, del],
"he"
)
.set("ai", (card) => {
if (_status.event.goon) return 5.5 - get.value(card);
return 0;
})
.set("goon", get.attitude(trigger.source, player) < 0);
}
"step 1";
var num = event.delta;
if (result.bool) num -= result.cards.length;
if (num > 0) player.draw(num);
},
ai: {
combo: "dchaochong",
maixie: true,
maixie_hp: true,
threaten: 0.85,
effect: {
target: function (card, player, target) {
if (get.tag(card, "damage")) {
if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
if (!target.hasFriend()) return;
var num = 0;
if (typeof target.storage.dcninchong == "number")
num = Math.abs(target.storage.dcninchong);
if (num <= 0) return;
return [1, Math.min(1, num / 3)];
}
},
},
},
},
//二傅
dcxuewei: {
audio: 2,
trigger: { player: "phaseJieshuBegin" },
direct: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("dcxuewei"), (card, player, target) => {
return target.hp <= player.hp;
})
.set("ai", (target) => {
var player = _status.event.player;
return get.effect(target, { name: "tao" }, player, player) + 0.1;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcxuewei", target);
player.addTempSkill("dcxuewei_shelter", { player: "phaseBegin" });
player.markAuto("dcxuewei_shelter", [target]);
}
},
ai: { threaten: 1.1 },
subSkill: {
shelter: {
audio: "dcxuewei",
trigger: { global: "damageBegin4" },
filter: function (event, player) {
return player.getStorage("dcxuewei_shelter").includes(event.player);
},
charlotte: true,
forced: true,
onremove: true,
logTarget: "player",
marktext: "卫",
intro: { content: "保护对象:$" },
content: function () {
"step 0";
trigger.cancel();
"step 1";
player.loseHp();
if (trigger.player != player) game.asyncDraw([player, trigger.player]);
else player.draw("nodelay");
"step 2";
game.delayx();
},
ai: {
filterDamage: true,
skillTagFilter: function (player, tag, arg) {
if (arg && arg.player && arg.player.hasSkillTag("jueqing", false, player))
return false;
return true;
},
},
},
},
},
dcyuguan: {
audio: 2,
trigger: { global: "phaseEnd" },
filter: function (event, player) {
var num = player.getDamagedHp();
if (num == 0) return false;
return !game.hasPlayer((current) => {
return current.getDamagedHp() > num;
});
},
check: function (event, player) {
var num = player.getDamagedHp() - 1;
if (num <= 0) return false;
return game.hasPlayer((target) => {
return get.attitude(player, target) > 0 && target.maxHp - target.countCards("h") > 1;
});
},
content: function () {
"step 0";
player.loseMaxHp();
"step 1";
var num = player.getDamagedHp();
if (!player.isIn() || !num) event.finish();
else
player
.chooseTarget(
"御关:令至多" + get.cnNumber(num) + "名角色将手牌摸至体力上限",
Math.min(game.countPlayer(), [1, num]),
true
)
.set("ai", (target) => {
return (
get.attitude(_status.event.player, target) *
Math.max(0.1, target.maxHp - target.countCards("h"))
);
});
"step 2";
if (result.bool) {
var targets = result.targets.sortBySeat(_status.currentPhase);
player.line(targets);
for (var target of targets) {
target.drawTo(target.maxHp);
}
}
},
},
//郑浑
dcqiangzhi: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
if (target == player) return false;
return (
target.countDiscardableCards(player, "he") +
player.countDiscardableCards(player, "he") >=
3
);
},
content: function () {
"step 0";
var dialog = [];
dialog.push("强峙:弃置你与" + get.translation(target) + "的共计三张牌");
if (player.countCards("h"))
dialog.addArray(['你的手牌
', player.getCards("h")]);
if (player.countCards("e"))
dialog.addArray(['你的装备
', player.getCards("e")]);
if (target.countCards("h")) {
dialog.add('' + get.translation(target) + "的手牌
");
if (player.hasSkillTag("viewHandcard", null, target, true))
dialog.push(target.getCards("h"));
else dialog.push([target.getCards("h"), "blank"]);
}
if (target.countCards("e"))
dialog.addArray([
'' + get.translation(target) + "的装备
",
target.getCards("e"),
]);
player
.chooseButton(3, true)
.set("createDialog", dialog)
.set("filterButton", (button) => {
if (
!lib.filter.canBeDiscarded(
button.link,
_status.event.player,
get.owner(button.link)
)
)
return false;
return true;
})
.set("filterOk", () => {
return ui.selected.buttons.length == 3;
})
.set("ai", (button) => {
var player = _status.event.player;
var target = _status.event.getParent().target;
var card = button.link;
if (get.owner(card) == player) {
if (_status.event.damage) return 15 - get.value(card);
if (
player.hp >= 3 ||
get.damageEffect(player, target, player) >= 0 ||
(player.hasSkill("dcpitian") &&
player.getHandcardLimit() - player.countCards("h") >= 1 &&
player.hp > 1)
)
return 0;
if (ui.selected.buttons.length == 0) return 10 - get.value(card);
return 0;
} else {
if (_status.event.damage) return 0;
return -(get.sgnAttitude(player, target) || 1) * get.value(card);
}
})
.set(
"damage",
get.damageEffect(target, player, player) > 10 &&
player.countCards("he", (card) => {
return (
lib.filter.canBeDiscarded(card, player, player) && get.value(card) < 5
);
}) >= 3
);
"step 1";
if (result.bool) {
var links = result.links;
var list1 = [],
list2 = [];
event.players = [player, target];
for (var card of links) {
if (get.owner(card) == player) list1.push(card);
else list2.push(card);
}
if (list1.length && list2.length) {
game.loseAsync({
lose_list: [
[player, list1],
[target, list2],
],
discarder: player,
}).setContent("discardMultiple");
event.finish();
} else if (list2.length) target.discard(list2);
else player.discard(list1);
if (list2.length >= 3) event.players.reverse();
} else event.finish();
"step 2";
event.players[0].line(event.players[1]);
event.players[1].damage(event.players[0]);
},
ai: {
expose: 0.2,
order: 4,
result: {
target: function (player, target) {
return (
(get.effect(target, { name: "guohe_copy2" }, player, target) / 2) *
(target.countDiscardableCards(player, "he") >= 2 ? 1.25 : 1) +
get.damageEffect(target, player, target) / 3
);
},
},
},
},
dcpitian: {
audio: 2,
trigger: {
player: ["loseAfter", "damageEnd"],
global: "loseAsyncAfter",
},
forced: true,
locked: false,
group: "dcpitian_draw",
filter: function (event, player) {
if (event.name == "damage") return true;
return event.type == "discard" && event.getl(player).cards2.length > 0;
},
content: function () {
player.addMark("dcpitian_handcard", 1, false);
player.addSkill("dcpitian_handcard");
game.log(player, "的手牌上限", "#y+1");
},
subSkill: {
draw: {
audio: "dcpitian",
trigger: { player: "phaseJieshuBegin" },
filter: function (event, player) {
return player.countCards("h") < player.getHandcardLimit();
},
prompt2: function (event, player) {
return (
"摸" +
get.cnNumber(
Math.min(5, player.getHandcardLimit() - player.countCards("h"))
) +
"张牌,重置因〖辟田〗增加的手牌上限"
);
},
check: function (event, player) {
return (
player.getHandcardLimit() - player.countCards("h") >
Math.min(2, player.hp - 1)
);
},
content: function () {
"step 0";
var num = Math.min(5, player.getHandcardLimit() - player.countCards("h"));
if (num > 0) player.draw(num);
"step 1";
player.removeMark(
"dcpitian_handcard",
player.countMark("dcpitian_handcard"),
false
);
game.log(player, "重置了", "#g【辟田】", "增加的手牌上限");
},
},
handcard: {
markimage: "image/card/handcard.png",
intro: {
content: function (storage, player) {
return "手牌上限+" + storage;
},
},
charlotte: true,
mod: {
maxHandcard: function (player, num) {
return num + player.countMark("dcpitian_handcard");
},
},
},
},
ai: {
effect: {
target: function (card, player, target) {
if (get.tag(card, "discard")) return 0.9;
if (get.tag(card, "damage")) return 0.95;
},
},
},
},
//新服二赵
dcqingren: {
audio: 2,
trigger: { player: "phaseJieshuBegin" },
frequent: true,
filter: function (event, player) {
return player.hasHistory("useSkill", (evt) =>
["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill)
);
},
content: function () {
player.draw(
player.getHistory("useSkill", (evt) =>
["yizan_use", "yizan_use_backup"].includes(evt.sourceSkill || evt.skill)
).length
);
},
ai: {
combo: "yizan_use",
},
},
dclongyuan: {
audio: "xinfu_longyuan",
forced: true,
unique: true,
juexingji: true,
trigger: {
global: "phaseEnd",
},
skillAnimation: true,
animationColor: "orange",
filter: function (event, player) {
return player.countMark("yizan_use") >= 3;
},
content: function () {
player.awakenSkill("dclongyuan");
player.draw(2);
player.recover();
player.storage.yizan = true;
},
derivation: "yizan_rewrite",
ai: {
combo: "yizan_use",
},
},
//黄皓
dcqinqing: {
audio: 2,
trigger: { player: "phaseJieshuBegin" },
direct: true,
filter: function (event, player) {
var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0];
if (!zhu || !zhu.isIn()) return false;
return game.hasPlayer((current) => {
return current != player && current.inRange(zhu);
});
},
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("dcqinqing"), function (card, player, target) {
var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0];
return (
target != player &&
target.inRange(zhu) &&
target.countDiscardableCards(player, "he") > 0
);
})
.set("ai", function (target) {
var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0];
var he = target.countCards("he");
if (get.attitude(_status.event.player, target) > 0) {
if (target.countCards("h") > zhu.countCards("h") + 1) return 0.1;
} else {
if (he > zhu.countCards("h") + 1) return 2;
if (he > 0) return 1;
}
return 0;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("dcqinqing", target);
if (target.countCards("he")) player.discardPlayerCard(target, "he", true);
} else {
event.finish();
}
"step 2";
var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0];
if (zhu && zhu.isIn()) {
if (target.countCards("h") > zhu.countCards("h")) player.draw();
}
},
},
dccunwei: {
audio: 2,
trigger: { target: "useCardToTargeted" },
forced: true,
filter: function (event, player) {
return (
player != event.player &&
get.type2(event.card) == "trick" &&
(event.targets.length == 1 || player.countCards("he") > 0)
);
},
content: function () {
if (trigger.targets.length == 1) player.draw();
else if (player.countCards("he") > 0)
player.chooseToDiscard("he", true, "存畏:请弃置一张牌");
},
ai: {
halfneg: true
},
},
//刘辟
dcjuying: {
audio: 2,
trigger: { player: "phaseUseEnd" },
filter: function (event, player) {
return (
player.getCardUsable("sha", true) >
player.getHistory("useCard", (evt) => {
return (
evt.getParent("phaseUse") == event &&
evt.card.name == "sha" &&
evt.addCount !== false
);
}).length
);
},
direct: true,
content: function () {
"step 0";
player
.chooseButton([
get.prompt("dcjuying"),
[
[
["sha", "你于下回合使用【杀】的次数上限+1"],
["hand", "本回合手牌上限+2"],
["draw", "摸三张牌"],
],
"textbutton",
],
])
.set("ai", function (button) {
var player = _status.event.player,
choice = button.link;
if (choice == "draw") return 10;
if (choice == "sha") return 9;
var del = 3 - player.hp;
if (choice == "hand" && player.needsToDiscard() > 0 && del <= 0) return 8;
return 0;
})
.set("selectButton", [1, 3]);
"step 1";
if (result.bool) {
player.logSkill("dcjuying");
var choices = result.links;
event.choices = choices;
if (choices.includes("sha")) {
player.addMark("dcjuying_sha", 1, false);
player.addSkill("dcjuying_sha");
}
if (choices.includes("hand")) {
player.addMark("dcjuying_hand", 1, false);
player.addTempSkill("dcjuying_hand");
}
if (choices.includes("draw")) {
player.draw(3);
}
} else event.finish();
"step 2";
var num = event.choices.length - Math.max(0, player.hp);
if (num > 0) {
player.chooseToDiscard(true, "he");
}
},
ai: {
effect: {
player_use: function (card, player, target) {
if (
typeof card == "object" &&
player.isPhaseUsing() &&
card.name == "sha" &&
player.getCardUsable("sha") == 1
)
return "zeroplayertarget";
},
target_use: function (card, player, target) {
if (card.name == "jiu" && player.getCardUsable("sha") == 2) return [1, 1];
},
},
},
subSkill: {
sha: {
trigger: { player: "phaseBegin" },
filter: function (event, player) {
return player.countMark("dcjuying_sha") > 0;
},
silent: true,
firstDo: true,
charlotte: true,
onremove: true,
content: function () {
player.addMark("dcjuying_effect", player.countMark("dcjuying_sha"), false);
player.addTempSkill("dcjuying_effect");
player.removeSkill("dcjuying_sha");
},
intro: { content: "下回合使用【杀】的次数上限+#" },
},
effect: {
onremove: true,
charlotte: true,
mod: {
cardUsable: function (card, player, num) {
if (card.name == "sha") return num + player.countMark("dcjuying_effect");
},
},
intro: { content: "本回合使用【杀】的次数上限+#" },
},
hand: {
onremove: true,
charlotte: true,
mod: {
maxHandcard: function (player, num) {
return num + 2 * player.countMark("dcjuying_hand");
},
},
},
},
},
//新服加强魏贾诩
dcjianshu: {
audio: "jianshu",
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.countCards("h", { color: "black" }) > 0;
},
filterTarget: function (card, player, target) {
if (target == player) return false;
if (ui.selected.targets.length) {
return (
ui.selected.targets[0] != target &&
!ui.selected.targets[0].hasSkillTag("noCompareSource") &&
target.countCards("h") &&
!target.hasSkillTag("noCompareTarget")
);
}
return true;
},
targetprompt: ["发起者", "拼点目标"],
filterCard: { color: "black" },
discard: false,
lose: false,
delay: false,
check: function (card) {
if (_status.event.player.hp == 1) return 8 - get.value(card);
return 6 - get.value(card);
},
selectTarget: 2,
multitarget: true,
content: function () {
"step 0";
player.give(cards, targets[0], "give");
"step 1";
targets[0].chooseToCompare(targets[1]);
"step 2";
player.addTempSkill("dcjianshu_check", "phaseUseAfter");
if (result.bool) {
var cards = targets[0].getCards("he", function (card) {
return lib.filter.cardDiscardable(card, targets[0], "dcjianshu");
});
if (cards.length > 0) targets[0].discard(cards.randomGet());
targets[1].loseHp();
} else if (result.tie) {
targets[0].loseHp();
targets[1].loseHp();
} else {
var cards = targets[1].getCards("he", function (card) {
return lib.filter.cardDiscardable(card, targets[1], "dcjianshu");
});
if (cards.length > 0) targets[1].discard(cards.randomGet());
targets[0].loseHp();
}
},
subSkill: {
check: {
trigger: { global: "dieAfter" },
charlotte: true,
forced: true,
popup: false,
filter: function (event, player) {
return event.getParent(3).name == "dcjianshu";
},
content: function () {
delete player.getStat("skill").dcjianshu;
},
},
},
ai: {
expose: 0.4,
order: 4,
result: {
target: function (player, target) {
if (ui.selected.targets.length) return -1;
return -0.5;
},
},
},
},
dcyongdi: {
audio: "yongdi",
audioname: ["xinping"],
unique: true,
limited: true,
enable: "phaseUse",
filterTarget: function (card, player, target) {
return target.hasSex("male");
},
animationColor: "thunder",
skillAnimation: "legend",
mark: true,
intro: {
content: "limited",
},
content: function () {
"step 0";
player.awakenSkill("dcyongdi");
//player.logSkill('dcyongdi',target);
if (!game.hasPlayer((current) => current.maxHp < target.maxHp)) {
target.gainMaxHp();
}
"step 1";
if (target.isMinHp()) {
target.recover();
}
"step 2";
if (target.isMinHandcard()) {
target.draw(Math.min(5, target.maxHp));
}
"step 3";
game.delayx();
},
ai: {
expose: 0.3,
order: 1,
result: {
target: function (player, target) {
var val = 0;
var bool1 = !game.hasPlayer((current) => current.maxHp < target.maxHp),
bool2 = target.isMinHp(),
bool3 = target.isMinHandcard();
if (bool1) val += 6.5;
if (bool2) {
if (bool1) target.maxHp++;
val += Math.max(0, get.recoverEffect(target, player, player));
if (bool1) target.maxHp--;
}
if (bool3) {
var num = Math.max(0, Math.min(5, target.maxHp + (bool1 ? 1 : 0)));
val += 5 * num;
}
return val;
},
},
},
},
//雷普
dcsilve: {
audio: 2,
trigger: {
player: "enterGame",
global: "phaseBefore",
},
forced: true,
locked: false,
direct: true,
onremove: ["dcsilve", "dcsilve_self"],
filter: function (event, player) {
return (
game.hasPlayer((current) => current != player) &&
(event.name != "phase" || game.phaseNumber == 0)
);
},
content: function () {
"step 0";
player
.chooseTarget(
"私掠:请选择一名其他角色",
"选择一名其他角色(暂时仅你可见),称为“私掠”角色,且你获得后续效果",
true,
(card, player, target) => {
return target != player && !player.getStorage("dcsilve").includes(target);
}
)
.set("ai", (target) => {
var att = get.attitude(_status.event.player, target);
if (att > 0) return att + 1;
if (att == 0) return Math.random();
return att;
})
.set("animate", false);
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcsilve");
player.markAuto("dcsilve", [target]);
player.addSkill("dcsilve_rob");
player.addSkill("dcsilve_revenge");
target.addSkill("dcsilve_target");
if (!target.storage.dcsilve_target) target.storage.dcsilve_target = [];
target.storage.dcsilve_target.push(player);
}
},
subSkill: {
rob: {
audio: "dcsilve",
trigger: { global: "damageSource" },
filter: function (event, player) {
if (!player.getStorage("dcsilve").includes(event.source)) return false;
if (!event.player.isIn() || event.player == player) return false;
if (player.getStorage("dcsilve_robbed").includes(event.player)) return false;
return event.player.countCards("he") > 0;
},
charlotte: true,
prompt2: function (event, player) {
return "获得" + get.translation(event.player) + "一张牌";
},
logTarget: "player",
content: function () {
player.addTempSkill("dcsilve_robbed");
player.markAuto("dcsilve_self", [trigger.player]);
if (trigger.player.countGainableCards(player, "he") > 0) {
player.markAuto("dcsilve_robbed", [trigger.player]);
player.gainPlayerCard(trigger.player, "he", true);
}
if (trigger.source && trigger.source != player)
trigger.source.markSkill("dcsilve_target");
},
},
revenge: {
audio: "dcsilve",
trigger: { global: "damageEnd" },
filter: function (event, player) {
if (!player.getStorage("dcsilve").includes(event.player)) return false;
if (
!event.player.isIn() ||
!event.source ||
!event.source.isIn() ||
event.source == player
)
return false;
return true;
},
forced: true,
locked: false,
charlotte: true,
direct: true,
content: function () {
"step 0";
if (trigger.player && trigger.player != player)
trigger.player.markSkill("dcsilve_target");
player.markAuto("dcsilve_self", [trigger.player]);
player
.chooseToUse(
"私掠:对" +
get.translation(trigger.source) +
"使用一张【杀】,或弃置一张手牌",
function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
}
)
.set("targetRequired", true)
.set("complexSelect", true)
.set("filterTarget", function (card, player, target) {
if (
target != _status.event.source &&
!ui.selected.targets.includes(_status.event.source)
)
return false;
return lib.filter.targetEnabled.apply(this, arguments);
})
.set("source", trigger.source)
.set("logSkill", "dcsilve_revenge");
"step 1";
if (!result.bool) {
if (player.countCards("h") > 0)
player.chooseToDiscard("h", true).set("logSkill", "dcsilve_revenge");
}
},
},
self: {
marktext: "私",
intro: {
name: "私掠",
content: function (storage, player) {
if (!storage || !storage.length) return "没有打劫对象";
if (storage[0] == player) return "已绑定" + get.translation(player) + "自己";
return "打劫对象:" + get.translation(storage);
},
},
},
target: {
marktext: "掠",
intro: {
name: "私掠",
content: function (storage, player) {
return "被" + get.translation(storage) + "盯上了!";
},
},
},
robbed: { onremove: true, charlotte: true },
},
},
dcshuaijie: {
audio: 2,
enable: "phaseUse",
limited: true,
skillAnimation: true,
animationColor: "thunder",
filter: function (event, player) {
var targets = player.getStorage("dcsilve").filter((i) => i.isIn());
if (!targets.length) return true;
return (
targets.filter((target) => {
return player.hp > target.hp && player.countCards("e") > target.countCards("e");
}).length == targets.length
);
},
content: function () {
"step 0";
player.awakenSkill("dcshuaijie");
player.loseMaxHp();
var choices = [];
var choiceList = ["获得“私掠”角色至多三张牌", "从牌堆中获得三张类型各不相同的牌"];
var targets = player.getStorage("dcsilve").filter((i) => i.isIn());
event.targets = targets;
if (targets.length) choices.push("选项一");
else choiceList[0] = '' + choiceList[0] + "";
choices.push("选项二");
player
.chooseControl(choices)
.set("prompt", "衰劫:选择一项")
.set("choiceList", choiceList)
.set("ai", () => _status.event.choice)
.set(
"choice",
(function () {
var eff = 0;
for (var target of targets) {
eff += get.effect(target, { name: "shunshou_copy2" }, player, player) * 2;
}
eff -= get.effect(player, { name: "dongzhuxianji" }, player, player);
return eff > 0 && choices.includes("选项一") ? "选项一" : "选项二";
})()
);
"step 1";
if (result.control == "选项一") {
if (targets.length) {
for (var target of targets) {
if (target.countGainableCards(player, "he") > 0) {
player.line(target);
player.gainPlayerCard(target, "he", true, [1, 3]);
}
}
}
} else {
var cards = [];
for (var i = 0; i < 3; i++) {
var card = get.cardPile((cardx) => {
return (
cards.filter((cardxx) => get.type2(cardxx) == get.type2(cardx)).length ==
0
);
});
if (card) cards.push(card);
}
if (cards.length) player.gain(cards, "gain2");
}
"step 2";
var targets = player.getStorage("dcsilve").filter((i) => i.isIn());
for (var target of targets) {
target.unmarkAuto("dcsilve_target", [player]);
}
delete player.storage.dcsilve;
delete player.storage.dcsilve_self;
player.markAuto("dcsilve", [player]);
player.markAuto("dcsilve_self", [player]);
},
ai: {
combo: "dcsilve",
order: 8,
result: {
player: function (player) {
var targets = player.getStorage("dcsilve").filter((i) => i.isIn());
if (!targets.length) return 1;
var att = 0;
targets.forEach((i) => (att += get.attitude(player, i)));
if (att < 0) return 1;
return 0;
},
},
},
},
//庞会
dcyiyong: {
audio: 2,
trigger: {
source: "damageBegin1",
},
//usable:2,
filter: function (event, player) {
return player.countDiscardableCards(player, "he") > 0 && player != event.player;
},
check: function (event, player) {
return (
get.attitude(player, event.player) < 0 &&
player.countCards(
"he",
(card) =>
lib.filter.cardDiscardable(card, player, "dcyiyong") &&
get.value(card, player) < 7
) > 0
);
},
logTarget: "player",
content: function () {
"step 0";
event.list = [player];
event.cards0 = [];
event.cards1 = [];
if (trigger.player.countDiscardableCards(trigger.player, "he") > 0) {
event.list.push(trigger.player);
}
if (!event.isMine() && !event.isOnline()) game.delayx();
player
.chooseCardOL(
event.list,
"he",
true,
[1, Infinity],
"异勇:弃置任意张牌",
(card, player, target) => {
return lib.filter.cardDiscardable(card, player, "dcyiyong");
}
)
.set("ai", (card) => {
var evt = _status.event.getParent(2);
var source = evt.player,
player = _status.event.player,
target = evt.list[1];
if (!target) return get.unuseful(card);
if (player == source) {
var total = 0,
need = 0;
target.countCards("he", (card) => {
if (
lib.filter.cardDiscardable(card, target, "dcyiyong") &&
get.value(card) < 5
)
need += get.number(card);
});
for (var i of ui.selected.cards) total += get.number(i);
if (total >= need + 5) return 0;
var val = 6;
if (
target.hp <= 2 &&
!target.hasSkillTag("filterDamage", null, {
player: player,
card: evt.getTrigger().card,
})
)
val += 2 + get.number(card) / 5;
if (target.countCards("he", (card) => get.value(card) < 5) >= 3)
val -= 3 + get.number(card) / 5;
return val - get.value(card);
}
if (
ui.selected.cards.length > 1 &&
ui.selected.cards.length + 2 >= source.countCards("he")
)
return 0;
if (
player.hp <= 2 &&
!target.hasSkillTag("filterDamage", null, {
player: player,
card: evt.getTrigger().card,
})
)
return 10 - get.value(card);
return 5 - get.value(card);
});
"step 1";
var lose_list = [],
cards = [];
for (var i = 0; i < result.length; i++) {
var current = event.list[i],
cards2 = result[i].cards;
cards.push(cards2);
event["cards" + i] = cards2;
event.cards = cards;
lose_list.push([current, cards2]);
}
game.loseAsync({ lose_list: lose_list }).setContent("discardMultiple");
"step 2";
var getn = function (cards) {
return cards.map((i) => get.number(i, false)).reduce((p, c) => p + c, 0);
};
var num0 = getn(event.cards0),
num1 = getn(event.cards1);
if (num0 <= num1) {
player.draw(event.cards1.length);
}
if (num0 >= num1) {
trigger.num++;
}
},
},
//乐就
dccuijin: {
audio: 2,
trigger: { global: "useCard" },
filter: function (event, player) {
return (
(event.card.name == "sha" || event.card.name == "juedou") &&
(event.player == player || player.inRange(event.player)) &&
player.countCards("he") > 0
);
},
direct: true,
content: function () {
"step 0";
if (player != game.me && !player.isOnline()) game.delayx();
var target = trigger.player;
event.target = target;
player
.chooseToDiscard(
"he",
get.prompt("dccuijin", target),
"弃置一张牌并令" +
get.translation(trigger.player) +
"使用的" +
get.translation(trigger.card) +
"伤害+1,但若其未造成伤害,则你摸两张牌并对其造成1点伤害。"
)
.set("ai", function (card) {
if (_status.event.goon) return 7 - get.value(card);
return 0;
})
.set("goon", lib.skill.cuijin.checkx(trigger, player)).logSkill = [
"dccuijin",
target,
];
"step 1";
if (result.bool) {
if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1;
trigger.baseDamage++;
player.addSkill("dccuijin_damage");
player.markAuto("dccuijin_damage", [trigger.card]);
if (!player.storage.dccuijin_map)
player.storage.dccuijin_map = { cards: [], targets: [] };
player.storage.dccuijin_map.cards.push(trigger.card);
player.storage.dccuijin_map.targets.push(trigger.targets.slice());
}
},
subSkill: {
damage: {
trigger: {
global: [
"damage",
"damageCancelled",
"damageZero",
"shaMiss",
"useCardToExcluded",
"useCardToEnd",
"eventNeutralized",
"useCardAfter",
"shaCancelled",
],
},
forced: true,
silent: true,
firstDo: true,
charlotte: true,
onremove: true,
filter: function (event, player, name) {
if (!event.card) return false;
var cards = player.getStorage("dccuijin_damage");
if (!cards.includes(event.card)) return false;
return true;
},
content: function () {
"step 0";
var card = trigger.card,
idx = player.storage.dccuijin_map.cards.indexOf(card);
if (event.triggername == "useCardAfter") {
var cards = player.getStorage("dccuijin_damage");
cards = cards.remove(card);
if (!cards.length) {
player.removeSkill("dccuijin_damage");
delete player.storage.dccuijin_map;
} else if (idx !== -1) {
player.storage.dccuijin_map.cards.splice(idx, 1);
player.storage.dccuijin_map.targets.splice(idx, 1);
}
event.finish();
} else if (idx !== -1) {
var target, source;
if (trigger.name.indexOf("damage") == 0) {
target = trigger.player;
source = trigger.source;
} else {
target = trigger.target;
source = trigger.player;
}
if (
player.storage.dccuijin_map.targets[idx].includes(target) &&
!target.hasHistory("damage", (evt) => {
return evt.card == card;
})
) {
player.logSkill("dccuijin_damage", source);
player.storage.dccuijin_map.targets[idx].remove(target);
player.draw(2);
if (source && source.isIn()) {
player.line(trigger.player, "green");
trigger.player.damage();
}
}
}
"step 1";
game.delayx();
},
},
},
},
//陈矫
dcxieshou: {
trigger: {
global: "damageEnd",
},
usable: 1,
filter: function (event, player) {
return get.distance(player, event.player) <= 2 && event.player.isIn();
},
check: function (event, player) {
return get.attitude(player, event.player) > 4;
},
locked: false,
logTarget: "player",
onremove: true,
change: function (player, num) {
player.addSkill("dcxieshoux");
if (typeof player.storage.dcxieshoux !== "number") player.storage.dcxieshoux = 0;
if (!num) return;
player.storage.dcxieshoux += num;
if (player.storage.dcxieshoux != 0) player.markSkill("dcxieshoux");
else player.unmarkSkill("dcxieshoux");
game.log(player, "的手牌上限", (num > 0 ? "+" : "") + num);
},
content: function () {
"step 0";
lib.skill.dcxieshou.change(player, -1);
"step 1";
var list = [],
target = trigger.player;
event.target = target;
var choiceList = ["回复1点体力", "复原,摸两张牌"];
if (target.getDamagedHp() == 0)
choiceList[0] = '' + choiceList[0] + "";
else list.push("选项一");
list.push("选项二");
target
.chooseControl(list)
.set("choiceList", choiceList)
.set("prompt", get.translation(player) + "对你发动了【协守】,请选择一项");
"step 2";
if (result.control == "选项一") {
target.recover();
} else {
target.link(false);
target.draw(2);
}
},
ai: {
expose: 0.3,
},
},
dcxieshoux: {
markimage: "image/card/handcard.png",
intro: {
content: function (storage, player) {
var num = player.storage.dcxieshoux;
return "手牌上限" + (num >= 0 ? "+" : "") + num;
},
},
charlotte: true,
mod: {
maxHandcard: function (player, num) {
return num + (player.storage.dcxieshoux || 0);
},
},
},
dcqingyan: {
trigger: {
target: "useCardToTargeted",
},
filter: function (event, player) {
return event.player != player && get.color(event.card) == "black";
},
usable: 2,
async cost(event, trigger, player) {
if (player.countCards("h") < player.hp) {
event.result = await player
.chooseBool(
get.prompt("dcqingyan"),
"将手牌摸至体力上限(摸" +
get.cnNumber(player.maxHp - player.countCards("h")) +
"张牌)"
)
.set("ai", () => 1)
.forResult();
} else {
event.result = await player
.chooseToDiscard(
get.prompt("dcqingyan"),
"弃置一张手牌令你的手牌上限+1",
"chooseonly"
)
.set("ai", (card) => 6 - get.value(card))
.forResult();
}
},
async content(event, trigger, player) {
if (event.cards && event.cards.length) {
await player.discard(event.cards);
lib.skill.dcxieshou.change(player, 1);
} else {
player.drawTo(player.maxHp);
}
},
},
dcqizi: {
mod: {
cardSavable: function (card, player, target) {
if (
get.distance(player, target) > 2 &&
card.name == "tao" &&
target == _status.event.dying
)
return false;
},
},
ai: {
neg: true
},
},
//公孙度
dczhenze: {
audio: 2,
trigger: { player: "phaseDiscardBegin" },
direct: true,
content: function () {
"step 0";
var getCond = (player) => Math.sign(player.countCards("h") - Math.max(0, player.hp));
var me = getCond(player);
var recovers = game.filterPlayer((current) => getCond(current) == me),
loses = game.filterPlayer().removeArray(recovers);
event.recovers = recovers;
event.loses = loses;
var list = [];
if (loses.length) list.push("选项一");
if (recovers.length) list.push("选项二");
list.push("cancel2");
var sign = [
["≥", "<"],
["≠", "="],
["≤", ">"],
];
var choiceList = [
"令所有手牌数" +
sign[me + 1][0] +
"体力值的角色失去1点体力" +
(loses.length ? "(" + get.translation(loses) + ")" : ""),
"令所有手牌数" +
sign[me + 1][1] +
"体力值的角色回复1点体力" +
(recovers.length ? "(" + get.translation(recovers) + ")" : ""),
];
if (!loses.length)
choiceList[0] = '' + choiceList[0] + "";
if (!recovers.length)
choiceList[1] = '' + choiceList[1] + "";
player
.chooseControl(list)
.set("choiceList", choiceList)
.set("prompt", get.prompt("dczhenze"))
.set("ai", () => _status.event.choice)
.set(
"choice",
(() => {
var effect = 0;
if (list.length == 2) {
if (list.includes("选项一")) {
loses.forEach(
(i) =>
(effect += get.effect(i, { name: "losehp" }, player, player))
);
if (effect > 0) return "选项一";
} else {
recovers.forEach(
(i) => (effect += get.recoverEffect(i, player, player))
);
if (effect > 0) return "选项二";
}
} else {
loses.forEach(
(i) => (effect += get.effect(i, { name: "losehp" }, player, player))
);
recovers.forEach((i) => (effect += get.recoverEffect(i, player, player)));
if (effect > 0) return "选项二";
return "选项一";
}
})()
);
"step 1";
if (result.control == "cancel2") {
event.finish();
} else {
var lose = result.control == "选项一",
targets = event[lose ? "loses" : "recovers"];
player.logSkill("dczhenze", targets);
for (var i of targets) {
i[lose ? "loseHp" : "recover"]();
}
}
},
},
dcanliao: {
audio: 2,
enable: "phaseUse",
filter: function (event, player) {
if (
(player.getStat().skill.dcanliao || 0) >=
game.countPlayer((current) => current.group == "qun")
)
return false;
return true;
},
filterTarget: function (card, player, target) {
return target.countCards("he");
},
content: function () {
"step 0";
player
.choosePlayerCard(target, "he", true)
.set("filterButton", function (button) {
var card = button.link,
owner = get.owner(card);
return !owner || owner.canRecast(card, _status.event.player);
})
.set("ai", function (card) {
if (get.attitude(_status.event.player, _status.event.getParent().target) >= 0)
return -get.buttonValue(card);
return get.buttonValue(card);
});
"step 1";
if (result.bool) target.recast(result.links);
},
ai: {
expose: 0.1,
result: {
target: function (player, target) {
if (
target.hasCard((card) => get.value(card) >= 6, "e") &&
get.attitude(player, target) < 0
)
return -1;
return 1;
},
},
},
},
//王烈
dcchongwang: {
audio: 2,
trigger: { global: "useCard" },
direct: true,
filter: function (event, player) {
if (player == event.player) return false;
var type = get.type(event.card);
if (type != "basic" && type != "trick") return false;
var history = game.getAllGlobalHistory("useCard");
var index = history.indexOf(event);
if (index > 0) return history[index - 1].player == player;
return false;
},
content: function () {
"step 0";
var source = trigger.player;
var list = [["exclude", "令" + get.translation(trigger.card) + "无效"]];
var cards = trigger.cards.filterInD();
if (source.isIn() && cards.length > 0)
list.push(["gain", "令" + get.translation(source) + "收回" + get.translation(cards)]);
player
.chooseButton([
get.prompt("dcchongwang", source),
[list, "textbutton"],
"noforcebutton",
])
.set("ai", function (button) {
var player = _status.event.player,
choice = button.link;
var evt = _status.event.getTrigger();
if (choice == "exclude") {
var effect = 0;
if (!evt.targets.length && get.info(evt.card, false).notarget)
effect -= get.effect(evt.player, evt.card, evt.player, player);
for (var i of evt.targets) {
effect -= get.effect(i, evt.card, evt.player, player);
}
return effect;
} else {
var cards = evt.cards.filterInD();
return get.value(cards, evt.player) * get.attitude(player, evt.player);
}
});
"step 1";
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
} else event.finish();
"step 2";
if (result.bool) {
player.logSkill("dcchongwang", trigger.player);
if (result.links[0] == "gain") {
player.addTempSkill("dcchongwang_gain");
trigger._dcchongwang = true;
} else {
trigger.targets.length = 0;
trigger.all_excluded = true;
game.log(trigger.card, "被无效了");
}
}
},
ai: {
threaten: 3.5,
directHit_ai: true,
},
subSkill: {
gain: {
trigger: { global: "useCardAfter" },
charlotte: true,
forced: true,
popup: false,
filter: function (event, player) {
return event._dcchongwang;
},
content: function () {
trigger.player.gain(trigger.cards.filterInD(), "gain2");
},
},
},
},
dchuagui: {
audio: 2,
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current != player && current.countCards("he") > 0;
});
},
content: function () {
"step 0";
var min = Math.max.apply(
Math,
game.filterPlayer().map(function (current) {
return 1 + current.getFriends().length;
})
);
var max = Math.min(
min,
game.countPlayer(function (current) {
return current != player && current.countCards("he") > 0;
})
);
player
.chooseTarget(
get.prompt("dchuagui"),
"令至多" + get.cnNumber(max) + "名角色进行囚徒困境选择",
[1, max],
function (card, player, target) {
return target != player && target.countCards("he") > 0;
}
)
.set("animate", false)
.set("ai", function (target) {
return -get.attitude(_status.event.player, target);
});
"step 1";
if (result.bool) {
player.logSkill("dchuagui");
event.players = result.targets.slice(0);
event._global_waiting = true;
} else event.finish();
"step 2";
var send = function (source) {
var next = game.createEvent("dchuagui_choose", false);
next.player = game.me;
next.source = source;
next.setContent(lib.skill.dchuagui.contentx);
game.resume();
};
var sendback = function (result, player) {
if (!Array.isArray(result)) {
result = [
Math.random() < 0.5 ? "仅展示牌" : "交出牌",
player.getCards("he").randomGet(),
];
}
event.results.push([player, result]);
};
event.ai_targets = [];
event.results = [];
var players = game
.filterPlayer(function (current) {
return current != player;
})
.sortBySeat();
var time = 10000;
if (lib.configOL && lib.configOL.choose_timeout)
time = parseInt(lib.configOL.choose_timeout) * 1000;
for (var i = 0; i < players.length; i++) {
players[i].showTimer(time);
if (!event.players.includes(players[i])) continue;
if (players[i].isOnline()) {
event.withol = true;
players[i].send(send, player);
players[i].wait(sendback);
} else if (players[i] == game.me) {
event.withme = true;
var next = game.createEvent("dchuagui_choose", false);
next.player = game.me;
next.source = player;
next.setContent(lib.skill.dchuagui.contentx);
if (_status.connectMode) game.me.wait(sendback);
} else {
event.ai_targets.push(players[i]);
}
}
if (event.ai_targets.length) {
event.ai_targets.randomSort();
setTimeout(function () {
event.interval = setInterval(
function () {
var target = event.ai_targets.shift();
var att = get.attitude(target, player),
hs = target.getCards("he");
hs.sort((b, a) => get.value(b, target) - get.value(a, target));
var choice = "仅展示牌",
card = hs[0];
if (att < -2 && Math.random() > (get.value(card, target) - 3) / 5)
choice = "交出牌";
sendback([choice, card], target);
if (!event.ai_targets.length) {
clearInterval(event.interval);
if (event.withai) game.resume();
}
},
_status.connectMove ? 750 : 75
);
}, 500);
}
"step 3";
if (event.withme) {
if (_status.connectMode) game.me.unwait(result, game.me);
else {
if (!Array.isArray(result)) {
result = [
Math.random() < 0.5 ? "仅展示牌" : "交出牌",
player.getCards("he").randomGet(),
];
}
event.results.push([player, result]);
}
}
"step 4";
if (event.withol && !event.resultOL) {
game.pause();
}
"step 5";
if (event.ai_targets.length > 0) {
event.withai = true;
game.pause();
}
"step 6";
delete event._global_waiting;
for (var i of game.players) i.hideTimer();
event.videoId = lib.status.videoId++;
game.broadcastAll(
function (name, id, results) {
var dialog = ui.create.dialog(
name + "发动了技能【化归】",
"hidden",
"forcebutton"
);
dialog.videoId = id;
dialog.classList.add("scroll1");
dialog.classList.add("scroll2");
dialog.classList.add("fullwidth");
dialog.classList.add("fullheight");
dialog.buttonss = [];
var list = ["仅展示牌的玩家", "交出牌的玩家"];
for (var i = 0; i < list.length; i++) {
dialog.add('' + list[i] + "
");
var buttons = ui.create.div(".buttons", dialog.content);
dialog.buttonss.push(buttons);
buttons.classList.add("popup");
buttons.classList.add("guanxing");
}
dialog.open();
var getx = function () {
var item = results.shift();
var card = item[1][1],
index = item[1][0] == "仅展示牌" ? 0 : 1;
var button = ui.create.button(card, "card", dialog.buttonss[index]);
button.querySelector(".info").innerHTML = (function (target) {
if (target._tempTranslate) return target._tempTranslate;
var name = target.name;
if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"];
return get.translation(name);
})(item[0]);
if (results.length > 0) setTimeout(getx, 500);
};
setTimeout(getx, 500);
},
get.translation(player),
event.videoId,
event.results.slice(0)
);
game.delay(0, 2000 + event.results.length * 500);
"step 7";
game.broadcastAll("closeDialog", event.videoId);
var shown = [],
given = [];
for (var i of event.results) {
(i[1][0] == "仅展示牌" ? shown : given).push(i);
}
var list = given.length > 0 ? given : shown;
var cards = [],
targets = [];
for (var i of list) {
cards.push(i[1][1]);
targets.push(i[0]);
//i[0].$give(i[1][1],player);
}
player.line(targets);
player.gain(cards, "give");
//step 8
//game.delayx();
},
contentx: function () {
"step 0";
event._global_waiting = true;
event.result = ["仅展示牌", player.getCards("he").randomGet()];
var str = get.translation(source);
player
.chooseControl("仅展示牌", "交出牌")
.set("choiceList", [
"仅展示一张牌。但如果所有人都选择了仅展示,则" + str + "获得这张牌",
"将一张牌交给" + str,
])
.set("_global_waiting", true);
"step 1";
event.result[0] = result.control;
player.chooseCard("he", true).set("_global_waiting", true);
"step 2";
event.result[1] = result.cards[0];
},
},
//陈珪
dcyingtu: {
audio: 2,
trigger: {
global: ["gainAfter", "loseAsyncAfter"],
},
usable: 1,
getIndex(event, player) {
var targets = [];
if (lib.skill.dcyingtu.filterx(event, player, player.getNext()))
targets.add(player.getNext());
if (lib.skill.dcyingtu.filterx(event, player, player.getPrevious()))
targets.add(player.getPrevious());
return targets.sortBySeat(_status.currentPhase);
},
filterx: function (event, player, target) {
var evt = event.getParent("phaseDraw");
if (evt && target == evt.player) return false;
return (
event.getg(target).length > 0 &&
target.hasCard(function (card) {
return lib.filter.canBeGained(card, target, player);
}, "he")
);
},
logTarget(event, player, triggername, target) {
return target;
},
check(event, player, triggername, source) {
var target = source == player.getNext() ? player.getPrevious() : player.getNext();
return Math.min(0, get.attitude(player, target)) >= get.attitude(player, source);
},
prompt2:
"获得该角色的一张牌,然后将一张牌交给该角色的对位角色。若你给出的是装备牌,则其使用其得到的牌。",
content: function () {
"step 0";
var target = event.targets[0];
event.target = target;
event.side = target == player.getPrevious() ? "getNext" : "getPrevious";
player.gainPlayerCard(target, true, "he");
"step 1";
var he = player.getCards("he");
if (he.length > 0) {
var target = player[event.side]();
event.target = target;
if (he.length == 1) event._result = { bool: true, cards: he };
else player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌");
} else event.finish();
"step 2";
if (result.bool) {
var card = result.cards[0];
event.card = card;
player.line(target);
player.give(card, target);
} else event.finish();
"step 3";
if (
target.getCards("h").includes(card) &&
get.type(card, null, target) == "equip" &&
target.canUse(card, target)
)
target.chooseUseTarget(card, true, "nopopup");
},
},
dccongshi: {
audio: 2,
trigger: { global: "useCardAfter" },
forced: true,
filter: function (event, player) {
return get.type(event.card, null, false) == "equip" && event.player.isMaxEquip();
},
content: function () {
player.draw();
},
},
//黄权
dcquanjian: {
audio: 2,
enable: "phaseUse",
usable: 2,
filter: function (event, player) {
return game.hasPlayer((current) => current != player);
},
chooseButton: {
dialog: function (event, player) {
var dialog = ui.create.dialog("劝谏:令一名其他角色…", "hidden");
dialog.add([
[
["damage", "对其攻击范围内的一名角色造成1点伤害"],
[
"draw",
"将其手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌",
],
],
"textbutton",
]);
return dialog;
},
filter: function (button, player) {
return !player.hasSkill("dcquanjian_" + button.link, null, null, false);
},
check: () => 1 + Math.random(),
backup: function (links) {
return get.copy(lib.skill["dcquanjian_" + links[0]]);
},
prompt: function (links) {
if (links[0] == "damage") return "令一名其他角色对攻击范围内的另一名角色造成1点伤害";
return "令一名其他角色将手牌数调整至手牌上限(至多摸至五张)且本回合内不能使用手牌";
},
},
ai: {
order: 2,
result: { player: 1 },
},
subSkill: {
backup: { audio: "dcquanjian" },
damage: {
audio: "dcquanjian",
selectTarget: 2,
filterTarget: function (card, player, target) {
if (!ui.selected.targets.length) return target != player;
return ui.selected.targets[0].inRange(target);
},
complexTarget: true,
complexSelect: true,
filterCard: () => false,
selectCard: -1,
targetprompt: ["造成伤害", "受到伤害"],
multitarget: true,
content: function () {
"step 0";
player.addTempSkill("dcquanjian_damage", "phaseUseAfter");
targets[0]
.chooseControl()
.set("choiceList", [
"对" + get.translation(targets[1]) + "造成1点伤害",
"本回合下次受到的伤害+1",
])
.set("ai", function () {
return _status.event.eff >= 0 ? 0 : 1;
})
.set("eff", get.damageEffect(targets[1], targets[0], targets[0]));
"step 1";
if (result.index == 0) {
targets[1].damage(targets[0]);
} else {
target.addMark("dcquanjian_effect", 1, false);
target.addTempSkill("dcquanjian_effect");
}
},
ai: {
result: {
player: function (player, target) {
if (ui.selected.targets.length == 0) {
if (
!game.hasPlayer(
(current) =>
current.inRangeOf(target) &&
get.damageEffect(current, target, player) > 0
)
)
return 0;
if (get.attitude(player, target) > 0) return 2;
return 1;
}
return get.damageEffect(target, ui.selected.targets[0], player, player);
},
},
},
},
draw: {
audio: "dcquanjian",
filterTarget: function (card, player, target) {
if (target == player) return false;
var num = target.countCards("h");
if (num > target.getHandcardLimit()) return true;
return num < Math.min(5, target.getHandcardLimit());
},
filterCard: () => false,
selectCard: -1,
content: function () {
"step 0";
player.addTempSkill("dcquanjian_draw", "phaseUseAfter");
var num1 = target.countCards("h"),
num2 = target.getHandcardLimit();
var num = 0;
if (num1 > num2) {
event.index = 0;
num = num1 - num2;
target
.chooseControl()
.set("choiceList", [
"弃置" + get.cnNumber(num) + "张手牌",
"本回合下次受到的伤害+1",
])
.set("ai", function () {
var player = _status.event.player;
if (
_status.event.number == 1 &&
player.hasCard(function (card) {
return (
lib.filter.cardDiscardable(
card,
player,
"dcquanjian_draw"
) && get.value(card) < 5
);
}, "h")
)
return 0;
return 1;
})
.set("number", num);
} else {
event.index = 1;
num = Math.min(num2, 5) - num1;
if (num <= 0) event.finish();
else
target
.chooseControl()
.set("choiceList", [
"摸" + get.cnNumber(num) + "张牌,且本回合内不能使用或打出手牌",
"本回合下次受到的伤害+1",
])
.set("ai", function () {
return 0;
});
}
event.num = num;
"step 1";
if (result.index == 0) {
if (event.index == 0) target.chooseToDiscard("h", true, num);
else target.draw(num);
} else {
target.addMark("dcquanjian_effect", 1, false);
target.addTempSkill("dcquanjian_effect");
event.finish();
}
"step 2";
target.addTempSkill("dcquanjian_disable");
},
ai: {
result: {
target: function (player, target) {
var num1 = target.countCards("h"),
num2 = target.getHandcardLimit();
if (num1 > num2) return -1;
return Math.min(5, num2) - num1;
},
},
},
},
effect: {
charlotte: true,
trigger: { player: "damageBegin3" },
forced: true,
onremove: true,
marktext: "谏",
content: function () {
trigger.num += player.countMark(event.name);
player.removeSkill(event.name);
},
intro: { content: "下次受到的伤害+#" },
ai: { threaten: 2.5 },
},
disable: {
charlotte: true,
mod: {
cardEnabled(card, player) {
if (card.cards) {
const hs = player.getCards("h");
if (card.cards.some((card) => hs.includes(card))) return false;
}
},
cardSavable(card, player) {
if (card.cards) {
const hs = player.getCards("h");
if (card.cards.some((card) => hs.includes(card))) return false;
}
},
},
mark: true,
marktext: "禁",
intro: { content: "不能使用或打出手牌" },
ai: { threaten: 2.5 },
},
},
},
dctujue: {
audio: 2,
trigger: { player: "dying" },
direct: true,
limited: true,
skillAnimation: true,
animationColor: "gray",
filter: function (event, player) {
return player.countCards("he") > 0;
},
content: function () {
"step 0";
player
.chooseTarget(lib.filter.notMe, get.prompt2("dctujue"))
.set("ai", function (target) {
if (_status.event.skip) return 0;
return 200 + get.attitude(_status.event.player, target);
})
.set("skip", player.countCards("hs", { name: ["tao", "jiu"] }) + player.hp > 0);
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("dctujue", target);
player.awakenSkill("dctujue");
var cards = player.getCards("he");
player.give(cards, target);
player.recover(cards.length);
player.draw(cards.length);
}
},
},
//尹夫人
dcyingyu: {
audio: 2,
trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] },
direct: true,
filter: function (event, player) {
if (event.name == "phaseJieshu" && !player.storage.dcyingyu) return false;
return (
game.countPlayer(function (current) {
return current.countCards("h") > 0;
}) > 1
);
},
content: function () {
"step 0";
player
.chooseTarget(
2,
get.prompt("dcyingyu"),
"展示两名角色的各一张手牌。若这两张牌花色不同,则你可以令其中一名角色获得另一名角色的展示牌。",
function (card, player, target) {
return target.countCards("h") > 0;
}
)
.set("ai", function (target) {
var player = _status.event.player;
if (!ui.selected.targets.length) return get.attitude(player, target);
return 1 - get.attitude(player, target);
});
"step 1";
if (result.bool) {
var targets = result.targets.sortBySeat();
event.targets = targets;
event.cards = [];
player.logSkill("dcyingyu", targets);
player.choosePlayerCard(targets[0], true, "h");
} else event.finish();
"step 2";
var card = result.cards[0];
player.line(targets[0]);
player.showCards(
card,
get.translation(player) + "对" + get.translation(targets[0]) + "发动了【媵予】"
);
event.cards.push(card);
player.choosePlayerCard(targets[1], true, "h");
"step 3";
var card = result.cards[0];
player.line(targets[1]);
player.showCards(
card,
get.translation(player) + "对" + get.translation(targets[1]) + "发动了【媵予】"
);
event.cards.push(card);
if (get.suit(cards[0], targets[0]) == get.suit(cards[1], targets[1])) event.finish();
"step 4";
var str1 = get.translation(targets[0]),
str2 = get.translation(targets[1]);
player
.chooseControl("cancel2")
.set("choiceList", [
"令" + str1 + "获得" + str2 + "的" + get.translation(cards[1]),
"令" + str2 + "获得" + str1 + "的" + get.translation(cards[0]),
])
.set("goon", get.attitude(player, targets[0]) > 0 ? 0 : 1)
.set("ai", () => _status.event.goon);
"step 5";
if (result.control != "cancel2") {
var i = result.index;
targets[1 - i].give(cards[1 - i], targets[i], "give");
}
},
onremove: true,
},
dcyongbi: {
audio: 2,
enable: "phaseUse",
filter: function (event, player) {
return (
player.countCards("h") > 0 &&
game.hasPlayer((current) => lib.skill.dcyongbi.filterTarget(null, player, current))
);
},
filterTarget: function (card, player, target) {
return target != player && target.hasSex("male");
},
selectCard: -1,
filterCard: true,
position: "h",
limited: true,
skillAnimation: true,
animationColor: "fire",
discard: false,
lose: false,
content: function () {
"step 0";
player.awakenSkill("dcyongbi");
if (player.hasSkill("dcyingyu", null, null, false)) player.storage.dcyingyu = true;
player.give(cards, target);
"step 1";
var list = [];
for (var i of cards) {
list.add(get.suit(i, player));
if (list.length >= 3) break;
}
if (list.length >= 2) {
player.addMark("dcyongbi_eff1", 2, false);
player.addSkill("dcyongbi_eff1");
target.addMark("dcyongbi_eff1", 2, false);
target.addSkill("dcyongbi_eff1");
}
if (list.length >= 3) {
player.addMark("dcyongbi_eff2", 1, false);
player.addSkill("dcyongbi_eff2");
target.addMark("dcyongbi_eff2", 1, false);
target.addSkill("dcyongbi_eff2");
}
},
ai: {
order: 1,
result: {
target: function (player, target) {
if (player.hasUnknown()) return 0;
var zhu = get.zhu(player);
if (zhu && get.attitude(player, zhu) > 0) {
if (target == zhu) return 4;
}
return 1;
},
},
},
subSkill: {
eff1: {
mod: {
maxHandcard: (player, num) => num + player.countMark("dcyongbi_eff1"),
},
charlotte: true,
onremove: true,
marktext: "拥",
intro: { content: "手牌上限+#" },
},
eff2: {
trigger: { player: "damageBegin4" },
forced: true,
filter: function (event, player) {
return event.num > 1;
},
content: function () {
trigger.num -= player.countMark("dcyongbi_eff2");
},
charlotte: true,
onremove: true,
marktext: "嬖",
intro: { content: "受到大于1的伤害时,此伤害-#" },
},
},
},
//吕旷吕翔
dcshuhe: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.countCards("h") > 0;
},
filterCard: true,
position: "h",
discard: false,
lose: false,
delay: false,
check: function (cardx) {
var player = _status.event.player;
var num1 = get.number(cardx),
players = game.filterPlayer();
var goon = false,
effect = 0;
for (var current of players) {
var cards = current.getCards("ej", function (card) {
var num = get.number(card);
return num == num1;
});
if (cards.length) {
goon = true;
var att = get.attitude(player, current);
for (var card of cards) {
if (get.position(card) == "e") {
var val = get.value(card, current);
if (att <= 0) effect += val;
else effect -= val / 2;
} else {
var eff = get.effect(
current,
{ name: card.viewAs || card.name },
player,
player
);
effect -= get.sgn(att) * eff;
}
}
}
}
if (goon) {
if (effect > 0) return 6 + effect - get.value(cardx);
return 0;
}
return game.hasPlayer(function (current) {
return current != player && get.attitude(player, current) > 0;
})
? 6 - get.value(cardx)
: 0;
},
content: function () {
"step 0";
player.showCards(cards, get.translation(player) + "发动了【数合】");
player.addMark("dcliehou", 1);
"step 1";
event.cards2 = [];
var num1 = get.number(cards[0], player);
var lose_list = [],
players = game.filterPlayer();
for (var current of players) {
var cards = current.getCards("ej", function (card) {
var num = get.number(card);
return num == num1;
});
if (cards.length > 0) {
player.line(current, "thunder");
current.$throw(cards);
lose_list.push([current, cards]);
event.cards2.addArray(cards);
}
}
if (lose_list.length) {
event.lose_list = lose_list;
game.loseAsync({
lose_list: lose_list,
}).setContent("chooseToCompareLose");
} else {
event.goto(3);
player
.chooseTarget(
true,
lib.filter.notMe,
"将" + get.translation(event.cards[0]) + "交给一名其他角色"
)
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
});
}
"step 2";
var cards = event.cards2;
if (cards.length > 0) {
if (event.lose_list) game.delayx();
player.gain(cards, "gain2");
}
event.finish();
"step 3";
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
player.give(cards, target);
}
},
ai: {
order: 2,
result: {
player: 1,
},
},
},
dcliehou: {
audio: 2,
trigger: { player: "phaseDrawBegin2" },
forced: true,
filter: function (event, player) {
return !event.numFixed;
},
content: function () {
var num = Math.min(5, 1 + player.countMark("dcliehou"));
trigger.num += num;
trigger._dcliehou = num;
},
group: "dcliehou_discard",
subSkill: {
discard: {
trigger: { player: "phaseDrawEnd" },
forced: true,
filter: function (event, player) {
return typeof event._dcliehou == "number";
},
content: function () {
"step 0";
var num = trigger._dcliehou;
player
.chooseToDiscard(
num,
"he",
"弃置" + get.cnNumber(num) + "张牌,或失去1点体力"
)
.set("ai", function (card) {
if (_status.event.goon) return 6 - get.value(card);
return 26 - get.value(card);
})
.set(
"goon",
player.hp > Math.max(1, 4 - num) ||
get.effect(player, { name: "losehp" }, player, player) > 0
);
"step 1";
if (!result.bool) player.loseHp();
},
},
},
marktext: "爵",
intro: {
name: "列侯(爵)",
name2: "爵",
content: "〖列侯〗的摸牌数+#",
},
},
//管亥
suoliang: {
audio: 2,
trigger: { source: "damageSource" },
logTarget: "player",
usable: 1,
filter: function (event, player) {
return (
event.player != player && event.player.maxHp > 0 && event.player.countCards("he") > 0
);
},
check: function (event, player) {
return get.attitude(player, event.player) <= 0;
},
content: function () {
"step 0";
var target = trigger.player;
event.target = target;
player.choosePlayerCard(
target,
true,
"he",
[1, target.maxHp],
"选择" + get.translation(target) + "的至多" + get.cnNumber(target.maxHp) + "张牌"
);
"step 1";
if (result.bool) {
player.showCards(
result.cards,
get.translation(player) + "对" + get.translation(target) + "发动了【索粮】"
);
var cards = result.cards.filter(function (card) {
var suit = get.suit(card, target);
if (suit != "heart" && suit != "club") return false;
return lib.filter.canBeGained(card, target, player);
});
if (cards.length) player.gain(cards, target, "giveAuto", "bySelf");
else {
var cards = result.cards.filter(function (card) {
return lib.filter.canBeDiscarded(card, target, player);
});
if (cards.length) target.discard(cards, "notBySelf");
}
}
},
},
qinbao: {
audio: 2,
trigger: { player: "useCard" },
forced: true,
filter: function (event, player) {
return (
(event.card.name == "sha" || get.type(event.card, null, false) == "trick") &&
game.hasPlayer(function (current) {
return current != player && current.countCards("h") >= player.countCards("h");
})
);
},
content: function () {
var hs = player.countCards("h");
trigger.directHit.addArray(
game.filterPlayer(function (current) {
return current != player && current.countCards("h") >= hs;
})
);
},
ai: {
threaten: 1.4,
directHit_ai: true,
skillTagFilter: function (player, tag, arg) {
return (
player.countCards("h", function (card) {
return !ui.selected.cards.includes(card);
}) <= arg.target.countCards("h")
);
},
},
},
//胡昭
midu: {
audio: 2,
enable: "phaseUse",
usable: 1,
chooseButton: {
dialog: function (event, player) {
var dialog = ui.create.dialog("弥笃:选择要废除或恢复的装备栏或判定区", "hidden");
dialog.classList.add("withbg");
dialog.noforcebutton = true;
var list1 = [],
list2 = [];
for (var i = 1; i < 6; i++) {
for (var j = 0; j < player.countEnabledSlot(i); j++) {
list1.push(i);
}
if (player.hasDisabledSlot(i)) list2.push(i);
}
(player.isDisabledJudge() ? list2 : list1).push(-1);
var addTable = function (list, bool) {
const adds = [];
for (var i of list) {
adds.push([
[i, bool],
i > 0 ? get.translation("equip" + i) + "栏" : "判定区",
]);
}
dialog.add([adds, "tdnodes"]);
};
if (list1.length) {
dialog.addText("未废除");
addTable(list1, true);
}
if (list2.length) {
dialog.addText("已废除");
addTable(list2, false);
}
return dialog;
},
filter: function (button, player) {
if (!ui.selected.buttons.length) return true;
if (!ui.selected.buttons[0].link[1]) return false;
return button.link[1];
},
check: function (button) {
var player = _status.event.player;
if (!button.link[1]) {
if (button.link[0] <= 0) return -10;
if (
player.hasCard(function (card) {
return get.subtype(card) == "equip" + button.link[0];
}, "hs")
)
return 15;
return 10;
}
if (
button.link[0] <= 0 ||
(player.hasEmptySlot(button.link[0]) &&
!player.hasCard(function (card) {
return (
get.subtype(card) == "equip" + button.link[0] &&
player.canUse(card, player) &&
get.effect(player, card, player, player) > 0
);
}, "hs"))
)
return 5;
return 0;
},
select: [1, Infinity],
backup: function (links, player) {
if (!links[0][1]) {
return {
audio: "midu",
selectCard: -1,
selectTarget: -1,
filterCard: () => false,
filterTarget: () => false,
equip: links[0][0],
content: function () {
var pos = lib.skill.midu_backup.equip;
if (pos <= 0) player.enableJudge();
else player.enableEquip(pos);
player.addTempSkills("rehuomo", { player: "phaseBegin" });
},
};
} else {
return {
audio: "midu",
selectCard: -1,
filterCard: () => false,
filterTarget: true,
equip: links.map((i) => i[0]).sort(),
content: function () {
var list = lib.skill.midu_backup.equip,
num = list.length,
bool = false;
if (list.includes(-1)) {
list.remove(-1);
bool = true;
}
if (list.length > 0) player.disableEquip(list);
if (bool) player.disableJudge();
target.draw(num);
},
ai: {
tag: {
draw: 1,
},
result: {
target: 2,
},
},
};
}
},
prompt: function (links, player) {
if (!links[0][1]) {
return "恢复一个装备栏或判定区并获得〖活墨〗";
}
var numc = get.cnNumber(links.length);
return "废除" + numc + "个区域并令一名角色摸" + numc + "张牌";
},
},
derivation: "rehuomo",
ai: {
order: 8,
result: { player: 1 },
},
subSkill: { backup: {} },
},
xianwang: {
mod: {
globalTo: function (source, player, distance) {
var num = player.countDisabledSlot();
if (num > 0) return distance + (num > 2 ? 2 : 1);
},
globalFrom: function (source, player, distance) {
var num = source.countDisabledSlot();
if (num > 0) return distance - (num > 2 ? 2 : 1);
},
},
},
//刘巴
dczhubi: {
audio: 2,
trigger: {
global: ["loseAfter", "loseAsyncAfter"],
},
filter: function (event, player) {
if (event.type != "discard" || event.getlx === false) return false;
for (var i of event.cards) {
if (get.suit(i, event.player) == "diamond") return true;
}
return false;
},
prompt2: "检索一张【无中生有】并置于牌堆顶",
content: function () {
var card = get.cardPile(function (card) {
return card.name == "wuzhong" && get.suit(card) != "diamond";
});
if (card) {
game.log(player, "将", card, "置于牌堆顶");
card.fix();
ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
game.updateRoundNumber();
game.delayx();
}
},
},
dcliuzhuan: {
audio: 2,
group: ["dcliuzhuan_mark", "dcliuzhuan_gain"],
mod: {
targetEnabled: function (card) {
if (card.cards) {
for (var i of card.cards) {
if (i.hasGaintag("dcliuzhuan_tag")) return false;
}
} else if (get.itemtype(card) == "card") {
if (card.hasGaintag("dcliuzhuan_tag")) return false;
}
},
},
subSkill: {
gain: {
audio: "dcliuzhuan",
trigger: { global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter"] },
forced: true,
logTarget: () => _status.currentPhase,
filter: function (event, player) {
var current = _status.currentPhase;
if (!current) return false;
if (event.name == "cardsDiscard") {
var evtx = event.getParent();
if (evtx.name != "orderingDiscard") return false;
var evtx2 = evtx.relatedEvent || evtx.getParent();
return current.hasHistory("lose", function (evtx3) {
var evtx4 = evtx3.relatedEvent || evtx3.getParent();
if (evtx2 != evtx4) return false;
for (var i in evtx3.gaintag_map) {
if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true;
}
});
//return false;
} else if (event.name == "lose") {
if (event.player != current || event.position != ui.discardPile) return false;
for (var i in event.gaintag_map) {
if (event.gaintag_map[i].includes("dcliuzhuan_tag")) return true;
}
return false;
}
return current.hasHistory("lose", function (evt) {
if (evt.getParent() != event || evt.position != ui.discardPile) return false;
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("dcliuzhuan_tag")) return true;
}
});
},
content: function () {
var cards,
current = _status.currentPhase;
if (trigger.name == "lose")
cards = trigger.hs.filter(function (i) {
return (
trigger.gaintag_map[i.cardid] &&
trigger.gaintag_map[i.cardid].includes("dcliuzhuan_tag") &&
get.position(i, true) == "d"
);
});
else if (trigger.name == "cardsDiscard") {
var evtx = trigger.getParent();
var evtx2 = evtx.relatedEvent || evtx.getParent();
var bool = false;
var history = current.getHistory("lose", function (evtx3) {
var evtx4 = evtx3.relatedEvent || evtx3.getParent();
if (evtx2 != evtx4) return false;
for (var i in evtx3.gaintag_map) {
if (evtx3.gaintag_map[i].includes("dcliuzhuan_tag")) return true;
}
});
cards = trigger.cards.filter(function (i) {
for (var evt of history) {
if (
evt.gaintag_map[i.cardid] &&
evt.gaintag_map[i.cardid].includes("dcliuzhuan_tag") &&
get.position(i, true) == "d"
)
return true;
}
return false;
});
} else {
cards = [];
current.getHistory("lose", function (evt) {
if (evt.getParent() != trigger || evt.position != ui.discardPile)
return false;
for (var card of evt.hs) {
if (get.position(card, true) != "d") continue;
var i = card.cardid;
if (
evt.gaintag_map[i] &&
evt.gaintag_map[i].includes("dcliuzhuan_tag")
)
cards.push(card);
}
});
}
if (cards && cards.length > 0) player.gain(cards, "gain2");
},
},
mark: {
trigger: { global: "gainBegin" },
forced: true,
popup: false,
silent: true,
lastDo: true,
filter: function (event, player) {
if (player == event.player || event.player != _status.currentPhase) return false;
var evt = event.getParent("phaseDraw");
if (evt && evt.name == "phaseDraw") return false;
return true;
},
content: function () {
trigger.gaintag.add("dcliuzhuan_tag");
trigger.player.addTempSkill("dcliuzhuan_tag");
},
},
tag: {
charlotte: true,
onremove: (player, skill) => player.removeGaintag(skill),
},
},
},
//张勋
suizheng: {
audio: 2,
trigger: { player: "phaseJieshuBegin" },
direct: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt("suizheng"), "令一名角色下回合内获得〖随征〗效果")
.set("", function (target) {
var player = _status.event.player,
att = get.attitude(player, target);
if (target.hasJudge("lebu")) return att / 2;
return (
att *
get.threaten(target) *
Math.sqrt(
2 + player == target
? player.countCards("h", "sha") * 2
: target.countCards("h")
)
);
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("suizheng", target);
target.addMark("suizheng_effect", 1, false);
target.markAuto("suizheng_source", [player]);
target.addTempSkill("suizheng_effect", {
player: player == target ? "phaseJieshuBefore" : "phaseAfter",
});
}
},
subSkill: {
effect: {
audio: "suizheng",
charlotte: true,
mod: {
targetInRange: function (card) {
if (card.name == "sha") return true;
},
cardUsable: function (card, player, num) {
if (card.name == "sha") return num + player.countMark("suizheng_effect");
},
},
trigger: { player: "phaseUseEnd" },
forced: true,
popup: false,
filter: function (event, player) {
var list = player.getStorage("suizheng_source");
if (!list.filter((i) => i.isIn().length)) return false;
return player.hasHistory("sourceDamage", function (evt) {
return evt.player.isIn() && evt.getParent("phaseUse") == event;
});
},
content: function () {
"step 0";
var targets = player.getStorage("suizheng_source").slice(0).sortBySeat();
event.targets = targets;
"step 1";
var target = targets.shift();
event.target = target;
var list = [];
player.getHistory("sourceDamage", function (evt) {
if (evt.player.isIn() && evt.getParent("phaseUse") == trigger)
list.add(evt.player);
});
if (!list.length) event.finish();
else if (target.isIn()) {
list = list.filter(function (i) {
return target.canUse("sha", i, false);
});
if (list.length > 0)
target
.chooseTarget(
"随征:是否对一名角色使用【杀】?",
function (card, player, target) {
return _status.event.targets.includes(target);
}
)
.set("targets", list)
.set("ai", function (target) {
var player = _status.event.player;
return get.effect(target, { name: "sha" }, player, player);
});
} else event._result = { bool: false };
"step 2";
if (result.bool) {
target.useCard(
{
name: "sha",
isCard: true,
},
result.targets,
false,
"suizheng_effect"
);
}
if (targets.length > 0) event.goto(1);
},
onremove: function (player) {
delete player.storage.suizheng_effect;
delete player.storage.suizheng_source;
},
intro: { content: "使用【杀】无距离限制且次数上限+#" },
},
},
},
//纪灵
dcshuangren: {
audio: 2,
trigger: { player: "phaseUseBegin" },
direct: true,
preHidden: true,
filter: function (event, player) {
return (
player.countCards("h") > 0 &&
game.hasPlayer(function (current) {
return current != player && player.canCompare(current);
})
);
},
content: function () {
"step 0";
var goon;
if (player.needsToDiscard() > 1) {
goon = player.hasCard(function (card) {
return card.number > 10 && get.value(card) <= 5;
});
} else if (player.hasSha()) {
goon = player.hasCard(function (card) {
return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3;
});
} else {
goon = player.hasCard(function (card) {
return get.value(card) <= 5;
});
}
player
.chooseTarget(get.prompt2("dcshuangren"), function (card, player, target) {
return player.canCompare(target);
})
.set("ai", function (target) {
var player = _status.event.player;
if (_status.event.goon && get.attitude(player, target) < 0) {
return get.effect(target, { name: "sha" }, player, player);
}
return 0;
})
.set("goon", goon)
.setHiddenSkill(event.name);
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("dcshuangren", target);
player.chooseToCompare(target);
} else {
event.finish();
}
"step 2";
if (result.bool) {
var target = event.target;
if (
game.hasPlayer(function (current) {
if (target == current || target.group != current.group) return false;
return player.canUse("sha", current, false);
})
) {
var str = "请选择视为使用【杀】的目标";
var str2 =
"操作提示:选择一名角色B,或选择包含A(" +
get.translation(target) +
")在内的两名角色A和B(B的势力需为" +
get.translation(target.group) +
"势力)";
player
.chooseTarget([1, 2], str, str2, true, function (card, player, target) {
if (!player.canUse("sha", target, false)) return false;
var current = _status.event.target;
if (target == current) return true;
if (target.group != current.group) return false;
if (!ui.selected.targets.length) return true;
return ui.selected.targets[0] == current;
//return current==target;
})
.set("ai", function (target) {
var player = _status.event.player;
return get.effect(target, { name: "sha" }, player, player);
})
.set("target", target)
.set("complexTarget", true);
} else {
player.useCard({ name: "sha", isCard: true }, target, false);
event.finish();
}
} else {
player.addTempSkill("dcshuangren_debuff", "phaseUseAfter");
event.finish();
}
"step 3";
if (result.bool && result.targets && result.targets.length) {
player.useCard({ name: "sha", isCard: true }, result.targets, false);
}
},
subSkill: {
debuff: {
charlotte: true,
mod: {
cardEnabled: function (card) {
if (card.name == "sha") return false;
},
},
},
},
},
//羊祜
dcdeshao: {
audio: 2,
usable: 2,
trigger: { target: "useCardToTargeted" },
filter: function (event, player) {
return player != event.player && get.color(event.card) == "black";
},
logTarget: "player",
check: function (event, player) {
var eff = get.effect(player, { name: "draw" }, player, player);
if (
player.countCards("h") + 1 <= event.player.countCards("h") &&
event.player.countCards("he") > 0
)
eff += get.effect(event.player, { name: "guohe_copy2" }, player, player);
return eff;
},
content: function () {
"step 0";
player.draw();
"step 1";
var target = trigger.player;
if (player.countCards("h") <= target.countCards("h") && target.countCards("he") > 0) {
player.discardPlayerCard(target, true, "he");
player.addExpose(0.2);
}
},
},
dcmingfa: {
audio: 2,
trigger: { player: "useCardAfter" },
direct: true,
filter: function (event, player) {
return (
player.isPhaseUsing() &&
(event.card.name == "sha" || get.type(event.card) == "trick") &&
event.cards.filterInD().length > 0 &&
!player.getExpansions("dcmingfa").length
);
},
content: function () {
"step 0";
var str,
cards = trigger.cards.filterInD(),
card = trigger.card;
if (
cards.length == 1 &&
card.name == cards[0].name &&
(card.nature || false) == (cards[0].nature || false)
)
str = get.translation(cards[0]);
else str = get.translation(trigger.card) + "(" + get.translation(cards) + ")";
var cardx = {
name: trigger.card.name,
nature: trigger.card.nature,
isCard: true,
};
player
.chooseTarget(
lib.filter.notMe,
get.prompt("dcmingfa"),
"将" +
str +
"作为“明伐”牌置于武将牌上,并选择一名其他角色。该角色下回合结束时对其执行〖明伐〗的后续效果。"
)
.set("card", cardx)
.set(
"goon",
(function () {
var getMax = function (card) {
return Math.max.apply(
Math,
game
.filterPlayer(function (current) {
return (
current != player &&
lib.filter.targetEnabled2(card, player, current)
);
})
.map(function (i) {
return (
get.effect(i, card, player, player) *
Math.sqrt(
Math.min(i.getHandcardLimit(), 1 + i.countCards("h"))
)
);
})
.concat([0])
);
};
var eff1 = getMax(cardx);
if (
player.hasCard(function (card) {
if (
(card.name != "sha" && get.type(card) != "trick") ||
!player.hasValueTarget(card, null, true)
)
return false;
return (
getMax({
name: get.name(card),
nature: get.nature(card),
isCard: true,
}) >= eff1
);
}, "hs")
)
return false;
return true;
})()
)
.set("ai", function (target) {
if (!_status.event.goon) return 0;
var player = _status.event.player,
card = _status.event.card;
if (!lib.filter.targetEnabled2(card, player, target)) return 0;
return (
get.effect(target, card, player, player) *
Math.sqrt(Math.min(target.getHandcardLimit(), 1 + target.countCards("h")))
);
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcmingfa", target);
var card = {
name: trigger.card.name,
nature: trigger.card.nature,
isCard: true,
};
player.storage.dcmingfa_info = [card, target];
player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("dcmingfa");
}
},
group: "dcmingfa_use",
ai: { expose: 0.2 },
intro: {
mark: function (dialog, storage, player) {
var cards = player.getExpansions("dcmingfa");
if (!cards.length) return "没有“明伐”牌";
else dialog.add(cards);
var info = player.storage.dcmingfa_info;
if (info) {
dialog.addText(
"记录牌:" +
get.translation(info[0]) +
"
记录目标:" +
get.translation(info[1])
);
}
},
content: "expansion",
},
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
delete player.storage.dcmingfa_info;
},
subSkill: {
use: {
audio: "dcmingfa",
trigger: { global: ["phaseEnd", "die"] },
forced: true,
filter: function (event, player) {
if (!player.storage.dcmingfa_info || !player.getExpansions("dcmingfa").length)
return false;
return event.player == player.storage.dcmingfa_info[1];
},
content: function () {
"step 0";
var target = trigger.player;
event.target = target;
var card = player.storage.dcmingfa_info[0];
delete player.storage.dcmingfa_info;
event.card = card;
event.count = Math.max(1, Math.min(5, target.countCards("h")));
if (!event.player.isIn()) event.goto(2);
"step 1";
event.count--;
if (target.isIn() && lib.filter.targetEnabled2(card, player, target)) {
player.useCard(get.copy(card), target);
if (event.count > 0) event.redo();
}
"step 2";
var cards = player.getExpansions("dcmingfa");
if (cards.length > 0) player.loseToDiscardpile(cards);
},
},
},
},
//蔡瑁张允
lianzhou: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
filter: function (event, player) {
if (!player.isLinked()) return true;
return game.hasPlayer(function (current) {
return current != player && current.hp == player.hp && !current.isLinked();
});
},
content: function () {
"step 0";
if (!player.isLinked()) player.link();
"step 1";
var num = game.countPlayer(function (current) {
return current != player && current.hp == player.hp && !current.isLinked();
});
if (num > 0) {
player
.chooseTarget(
[1, num],
"选择横置任意名体力值等于你的角色",
function (card, player, current) {
return (
current != player && current.hp == player.hp && !current.isLinked()
);
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.effect(target, { name: "tiesuo" }, player, player);
});
} else event.finish();
"step 2";
if (result.bool) {
var targets = result.targets.sortBySeat();
player.line(targets, "green");
for (var i of targets) i.link();
}
},
ai: { halfneg: true },
},
jinglan: {
audio: 2,
trigger: { source: "damageSource" },
forced: true,
content: function () {
var delta = player.countCards("h") - player.hp;
if (delta > 0) player.chooseToDiscard("h", 4, true);
else if (delta == 0) {
player.chooseToDiscard("he", true);
player.recover();
} else {
player.damage("fire", "nosource");
player.draw(5);
}
},
ai: { halfneg: true },
},
//滕公主
xingchong: {
audio: 2,
trigger: { global: "roundStart" },
direct: true,
filter: function (event, player) {
return player.maxHp > 0;
},
content: function () {
"step 0";
var list = [];
for (var i = 0; i <= Math.min(5, player.maxHp); i++) {
list.push(get.cnNumber(i) + "张");
}
list.push("cancel2");
player
.chooseControl(list)
.set("prompt", get.prompt("xingchong"))
.set("prompt2", "请首先选择摸牌的张数")
.set("ai", function () {
var player = _status.event.player,
num1 = player.maxHp,
num2 = player.countCards("h");
if (num1 <= num2) return 0;
return Math.ceil((num1 - num2) / 2);
});
"step 1";
if (result.control != "cancel2") {
player.logSkill("xingchong");
var num2 = result.index;
if (num2 > 0) player.draw(num2);
var num = Math.min(5, player.maxHp) - num2;
if (num == 0) event.finish();
else event.num = num;
} else event.finish();
"step 2";
if (player.countCards("h") > 0) {
player
.chooseCard(
"h",
[1, Math.min(player.countCards("h"), event.num)],
"请选择要展示的牌"
)
.set("ai", () => 1 + Math.random());
} else event.finish();
"step 3";
if (result.bool) {
var cards = result.cards;
player.showCards(cards, get.translation(player) + "发动了【幸宠】");
player.addGaintag(cards, "xingchong");
player.addTempSkill("xingchong_effect", "roundStart");
}
},
subSkill: {
effect: {
audio: "xingchong",
trigger: {
player: ["loseAfter"],
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
filter: function (event, player) {
var evt = event.getl(player);
if (!evt || !evt.cards2 || !evt.cards2.length) return false;
if (event.name == "lose") {
for (var i in event.gaintag_map) {
if (event.gaintag_map[i].includes("xingchong")) return true;
}
return false;
}
return player.hasHistory("lose", function (evt) {
if (event != evt.getParent()) return false;
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("xingchong")) return true;
}
return false;
});
},
forced: true,
popup: false,
charlotte: true,
onremove: function (player) {
player.removeGaintag("xingchong");
},
content: function () {
"step 0";
if (trigger.delay === false) game.delayx();
"step 1";
player.logSkill("xingchong_effect");
var num = 0;
if (trigger.name == "lose") {
for (var i in trigger.gaintag_map) {
if (trigger.gaintag_map[i].includes("xingchong")) num++;
}
} else
player.getHistory("lose", function (evt) {
if (trigger != evt.getParent()) return false;
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("xingchong")) num++;
}
});
player.draw(2 * num);
},
},
},
},
liunian: {
audio: 2,
trigger: { global: "phaseEnd" },
forced: true,
filter: function (event, player) {
return game.hasGlobalHistory("cardMove", function (evt) {
return evt.washCard && (evt.shuffleNumber == 1 || evt.shuffleNumber == 2);
});
},
content: function () {
"step 0";
if (
game.hasGlobalHistory("cardMove", function (evt) {
return evt.washCard && evt.shuffleNumber == 1;
})
) {
player.gainMaxHp();
game.delayx();
}
"step 1";
if (
game.hasGlobalHistory("cardMove", function (evt) {
return evt.washCard && evt.shuffleNumber == 2;
})
) {
player.recover();
game.delayx();
} else event.finish();
"step 2";
player.addSkill("liunian_effect");
player.addMark("liunian_effect", 10, false);
},
subSkill: {
effect: {
charlotte: true,
mod: {
maxHandcard: function (player, num) {
return num + player.countMark("liunian_effect");
},
},
marktext: "年",
intro: {
content: "手牌上限+#",
},
},
},
},
//黄承彦
dcjiezhen: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return target != player;
},
content: function () {
var skills = target.getSkills(null, false, false).filter(function (i) {
if (i == "bazhen") return;
var info = get.info(i);
return (
info &&
!get.is.locked(i) &&
!info.limited &&
!info.juexingji &&
!info.zhuSkill &&
!info.charlotte
);
});
target.addAdditionalSkills("dcjiezhen_blocker", "bazhen");
target.addSkill("dcjiezhen_blocker");
target.markAuto("dcjiezhen_blocker", skills);
player.addSkill("dcjiezhen_clear");
player.markAuto("dcjiezhen_clear", [target]);
},
ai: {
order: 1,
result: {
target: function (player, target) {
var skills = target.getSkills(null, false, false).filter(function (i) {
if (i == "bazhen") return;
var info = get.info(i);
return (
info &&
!get.is.locked(i) &&
!info.limited &&
!info.juexingji &&
!info.zhuSkill &&
!info.charlotte
);
});
if (!skills.length && target.hasEmptySlot(2)) return 1;
return -0.5 * skills.length;
},
},
},
subSkill: {
blocker: {
init: function (player, skill) {
player.addSkillBlocker(skill);
},
onremove: function (player, skill) {
player.removeSkillBlocker(skill);
player.removeAdditionalSkill(skill);
delete player.storage.dcjiezhen_blocker;
},
charlotte: true,
locked: true,
skillBlocker: function (skill, player) {
return (
skill != "bazhen" &&
skill != "dcjiezhen_blocker" &&
!lib.skill[skill].charlotte &&
player.getStorage("dcjiezhen_blocker").includes(skill)
);
},
mark: true,
marktext: "阵",
intro: {
markcount: () => 0,
content: function (storage, player, skill) {
if (storage.length) return "失效技能:" + get.translation(storage);
return "无失效技能";
},
},
},
clear: {
audio: "dcjiezhen",
charlotte: true,
trigger: {
global: ["judgeAfter", "die"],
player: "phaseBegin",
},
forced: true,
forceDie: true,
onremove: true,
filter: function (event, player) {
if (event.name == "die") {
return (
player == event.player ||
player.getStorage("dcjiezhen_clear").includes(event.player)
);
} else if (event.name == "judge") {
return (
event.skill == "bagua" &&
player.getStorage("dcjiezhen_clear").includes(event.player)
);
}
return player.getStorage("dcjiezhen_clear").length > 0;
},
logTarget: function (event, player) {
if (event.name != "phase") return event.player;
return player.getStorage("dcjiezhen_clear");
},
content: function () {
"step 0";
var targets = player.getStorage("dcjiezhen_clear");
if (trigger.name == "die" && player == trigger.player) {
for (var target of targets) {
target.removeSkill("dcjiezhen_blocker");
}
player.removeSkill("dcjiezhen_clear");
event.finish();
return;
}
if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat();
else event.targets = [trigger.player];
"step 1";
var target = targets.shift();
var storage = player.getStorage("dcjiezhen_clear");
if (storage.includes(target)) {
storage.remove(target);
target.removeSkill("dcjiezhen_blocker");
if (target.isIn() && target.countGainableCards(player, "hej") > 0)
player.gainPlayerCard(target, "hej", true);
}
if (targets.length > 0) {
event.redo();
} else {
player.removeSkill("dcjiezhen_clear");
}
},
},
},
derivation: "bazhen",
},
dczecai: {
audio: 2,
trigger: { global: "roundStart" },
limited: true,
skillAnimation: true,
direct: true,
animationColor: "soil",
filter: function (event, player) {
return game.roundNumber > 1;
},
getMax: function () {
var getNum = function (current) {
var history = current.actionHistory;
var num = 0;
for (var i = history.length - 2; i >= 0; i--) {
for (var j = 0; j < history[i].useCard.length; j++) {
if (get.type2(history[i].useCard[j].card, false) == "trick") num++;
}
if (history[i].isRound) break;
}
return num;
};
var max = 0,
current = false,
targets = game.filterPlayer();
for (var target of targets) {
var num = getNum(target);
if (num > max) {
max = num;
current = target;
} else if (num == max) current = false;
}
return current;
},
content: function () {
"step 0";
event.target = lib.skill.dczecai.getMax();
var str = "令一名其他角色于本轮内获得〖集智〗";
if (event.target && event.target != player)
str +=
";若选择的目标为" + get.translation(event.target) + ",则其获得一个额外的回合";
player
.chooseTarget(lib.filter.notMe, get.prompt("dczecai"), str)
.set("maximum", event.target)
.set("ai", function (target) {
if (target != _status.event.maximum) return 0;
return get.attitude(_status.event.player, target);
});
"step 1";
if (result.bool) {
player.awakenSkill("dczecai");
var target = result.targets[0];
player.logSkill("dczecai", target);
target.addAdditionalSkills("dczecai_effect", "rejizhi");
target.addTempSkill("dczecai_effect", "roundStart");
if (target == event.target) {
var evt = trigger;
target.insertPhase();
if (evt.player != target && !evt._finished) {
evt.finish();
evt._triggered = 5;
var evtx = evt.player.insertPhase();
delete evtx.skill;
}
}
}
},
derivation: "rejizhi",
subSkill: {
effect: {
charlotte: true,
mark: true,
marktext: "才",
intro: { content: "已拥有技能〖集智〗" },
},
},
},
dcyinshi: {
audio: 2,
trigger: { player: "damageBegin" },
usable: 1,
filter: function (event, player) {
return !event.card || get.color(event.card) == "none";
},
forced: true,
content: function () {
trigger.cancel();
},
group: "dcyinshi_gain",
subSkill: {
gain: {
audio: "dcyinshi",
trigger: { global: "judgeEnd" },
forced: true,
filter: function (event, player) {
return (
event.skill == "bagua" &&
event.result.card &&
get.position(event.result.card, true) == "o"
);
},
content: function () {
player.gain(trigger.result.card, "gain2");
},
},
},
},
//高览
xizhen: {
audio: 2,
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return (
current != player &&
(player.canUse("sha", current, false) || player.canUse("juedou", current, false))
);
});
},
content: function () {
"step 0";
player
.chooseTarget(
get.prompt("xizhen"),
"视为对一名角色使用【杀】或【决斗】",
function (card, player, target) {
return (
target != player &&
(player.canUse("sha", target, false) ||
player.canUse("juedou", target, false))
);
}
)
.set("ai", function (target) {
var player = _status.event.player;
var eff1 = 0,
eff2 = 0;
if (player.canUse("sha", target, false))
eff1 = get.effect(target, { name: "sha" }, player, player);
if (player.canUse("juedou", target, false))
eff2 = get.effect(target, { name: "juedou" }, player, player);
var effx = Math.max(eff1, eff2);
if (effx <= 0) return 0;
if (target.isHealthy()) effx *= 3;
if (get.attitude(player, target) > 0) effx *= 1.6;
return effx;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("xizhen", target);
var list = [];
if (player.canUse("sha", target, false)) list.push("sha");
if (player.canUse("juedou", target, false)) list.push("juedou");
if (list.length == 1) event._result = { control: list[0] };
else
player
.chooseControl(list)
.set("prompt", "视为对" + get.translation(target) + "使用…")
.set("ai", function () {
var player = _status.event.player,
target = _status.event.getParent().target;
var eff1 = get.effect(target, { name: "sha" }, player, player),
eff2 = get.effect(target, { name: "juedou" }, player, player);
return eff1 > eff2 ? 0 : 1;
});
} else event.finish();
"step 2";
player.useCard({ name: result.control, isCard: true }, target, false);
"step 3";
if (target.isIn()) {
player.storage.xizhen_effect = target;
player.addTempSkill("xizhen_effect", "phaseUseAfter");
}
},
subSkill: {
effect: {
audio: "xizhen",
charlotte: true,
onremove: true,
trigger: { global: ["useCard", "respond"] },
logTarget: function (event, player) {
return player.storage.xizhen_effect;
},
forced: true,
filter: function (event, player) {
return (
Array.isArray(event.respondTo) &&
event.respondTo[0] == player &&
player.storage.xizhen_effect &&
player.storage.xizhen_effect.isIn()
);
},
content: function () {
"step 0";
var target = player.storage.xizhen_effect;
event.target = target;
target.recover();
"step 1";
player.draw(target.isHealthy() ? 2 : 1);
},
mark: "character",
intro: { content: "已指定$为目标" },
},
},
},
//管宁
dunshi: {
audio: 2,
enable: ["chooseToUse", "chooseToRespond"],
usable: 1,
init: function (player, skill) {
if (!player.storage[skill]) player.storage[skill] = [["sha", "shan", "tao", "jiu"], 0];
},
hiddenCard: function (player, name) {
if (
player.storage.dunshi &&
player.storage.dunshi[0].includes(name) &&
!player.getStat("skill").dunshi
)
return true;
return false;
},
marktext: "席",
mark: true,
intro: {
markcount: function (storage) {
return storage[1];
},
content: function (storage, player) {
if (!storage) return;
var str = "";
if (!storage[0].length) {
str += "已无可用牌";
} else {
str += "剩余可用牌:";
str += get.translation(storage[0]);
}
str += "
“席”标记数量:";
str += storage[1];
return str;
},
},
filter: function (event, player) {
if (event.type == "wuxie") return false;
var storage = player.storage.dunshi;
if (!storage || !storage[0].length) return false;
for (var i of storage[0]) {
var card = { name: i, isCard: true };
if (event.filterCard(card, player, event)) return true;
}
return false;
},
chooseButton: {
dialog: function (event, player) {
var list = [];
var storage = player.storage.dunshi;
for (var i of storage[0]) list.push(["基本", "", i]);
return ui.create.dialog("遁世", [list, "vcard"], "hidden");
},
filter: function (button, player) {
var evt = _status.event.getParent();
return evt.filterCard({ name: button.link[2], isCard: true }, player, evt);
},
check: function (button) {
var card = { name: button.link[2] },
player = _status.event.player;
if (_status.event.getParent().type != "phase") return 1;
if (card.name == "jiu") return 0;
if (card.name == "sha" && player.hasSkill("jiu")) return 0;
return player.getUseValue(card, null, true);
},
backup: function (links, player) {
return {
audio: "dunshi",
filterCard: function () {
return false;
},
popname: true,
viewAs: {
name: links[0][2],
isCard: true,
},
selectCard: -1,
precontent: function () {
player.addTempSkill("dunshi_damage");
player.storage.dunshi_damage = event.result.card.name;
},
};
},
prompt: function (links, player) {
return "选择【" + get.translation(links[0][2]) + "】的目标";
},
},
ai: {
respondSha: true,
respondShan: true,
skillTagFilter: function (player, tag, arg) {
var storage = player.storage.dunshi;
if (!storage || !storage[0].length) return false;
if (player.getStat("skill").dunshi) return false;
switch (tag) {
case "respondSha":
return (
(_status.event.type != "phase" ||
player == game.me ||
player.isUnderControl() ||
player.isOnline()) &&
storage[0].includes("sha")
);
case "respondShan":
return storage[0].includes("shan");
case "save":
if (arg == player && storage[0].includes("jiu")) return true;
return storage[0].includes("tao");
}
},
order: 2,
result: {
player: function (player) {
if (_status.event.type == "dying") {
return get.attitude(player, _status.event.dying);
}
return 1;
},
},
},
initList: function () {
var list,
skills = [];
var banned = ["xunyi", "mbyilie"];
if (get.mode() == "guozhan") {
list = [];
for (var i in lib.characterPack.mode_guozhan) list.push(i);
} else if (_status.connectMode) list = get.charactersOL();
else {
list = [];
for (var i in lib.character) {
if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue;
list.push(i);
}
}
for (var i of list) {
if (i.indexOf("gz_jun") == 0) continue;
for (var j of lib.character[i][3]) {
var skill = lib.skill[j];
if (!skill || skill.zhuSkill || banned.includes(j)) continue;
if (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg)) continue;
var info = get.translation(j);
for (var ix = 0; ix < info.length; ix++) {
if (/仁|义|礼|智|信/.test(info[ix]) == true) {
skills.add(j);
break;
}
}
}
}
_status.dunshi_list = skills;
},
subSkill: {
backup: { audio: "dunshi" },
damage: {
audio: "dunshi",
trigger: { global: "damageBegin2" },
forced: true,
charlotte: true,
filter: function (event, player) {
return event.source == _status.currentPhase;
},
onremove: true,
logTarget: "source",
content: function () {
"step 0";
event.cardname = player.storage.dunshi_damage;
player.removeSkill("dunshi_damage");
event.target = trigger.source;
var card = get.translation(trigger.source),
card2 = get.translation(event.cardname),
card3 = get.translation(trigger.player);
var list = [
"防止即将对" +
card3 +
"造成的伤害,并令" +
card +
"获得一个技能名中包含“仁/义/礼/智/信”的技能",
"从〖遁世〗中删除【" + card2 + "】并获得一枚“席”",
"减1点体力上限,然后摸等同于“席”数的牌",
];
var next = player.chooseButton([
"遁世:请选择两项",
[
list.map((item, i) => {
return [i, item];
}),
"textbutton",
],
]);
next.set("forced", true);
next.set("selectButton", 2);
next.set("ai", function (button) {
var player = _status.event.player;
switch (button.link) {
case 0:
if (get.attitude(player, _status.currentPhase) > 0) return 3;
return 0;
case 1:
return 1;
case 2:
var num = player.storage.dunshi[1];
for (var i of ui.selected.buttons) {
if (i.link == 1) num++;
}
if (num > 0 && player.isDamaged()) return 2;
return 0;
}
});
"step 1";
event.links = result.links.sort();
for (var i of event.links) {
game.log(
player,
"选择了",
"#g【遁世】",
"的",
"#y选项" + get.cnNumber(i + 1, true)
);
}
if (event.links.includes(0)) {
trigger.cancel();
if (!_status.dunshi_list) lib.skill.dunshi.initList();
var list = _status.dunshi_list
.filter(function (i) {
return !target.hasSkill(i, null, null, false);
})
.randomGets(3);
if (list.length == 0) event.goto(3);
else {
event.videoId = lib.status.videoId++;
var func = function (skills, id, target) {
var dialog = ui.create.dialog("forcebutton");
dialog.videoId = id;
dialog.add("令" + get.translation(target) + "获得一个技能");
for (var i = 0; i < skills.length; i++) {
dialog.add(
'"
);
}
dialog.addText("
");
};
if (player.isOnline()) player.send(func, list, event.videoId, target);
else if (player == game.me) func(list, event.videoId, target);
player.chooseControl(list).set("ai", function () {
var controls = _status.event.controls;
if (controls.includes("cslilu")) return "cslilu";
return controls[0];
});
}
} else event.goto(3);
"step 2";
game.broadcastAll("closeDialog", event.videoId);
target.addSkills(result.control);
"step 3";
var storage = player.storage.dunshi;
if (event.links.includes(1)) {
storage[0].remove(event.cardname);
storage[1]++;
player.markSkill("dunshi");
}
if (event.links.includes(2)) {
player.loseMaxHp();
if (storage[1] > 0) player.draw(storage[1]);
}
},
},
},
},
//吉本
xunli: {
audio: 2,
trigger: {
global: ["loseAfter", "loseAsyncAfter"],
},
forced: true,
filter: function (event, player) {
if (
event.type != "discard" ||
event.getlx === false ||
player.getExpansions("xunli").length >= 9
)
return false;
for (var i of event.cards) {
if (
get.position(i, true) == "d" &&
get.color(i, event.cards2 && event.cards2.includes(i) ? event.player : false) ==
"black"
)
return true;
}
return false;
},
content: function () {
"step 0";
var num = 9 - player.getExpansions("xunli").length;
var cards = [];
for (var i of trigger.cards) {
if (
get.position(i, true) == "d" &&
get.color(
i,
trigger.cards2 && trigger.cards2.includes(i) ? trigger.player : false
) == "black"
)
cards.push(i);
}
if (cards.length <= num)
event._result = {
bool: true,
links: cards,
};
else
player
.chooseButton(true, num, [
"寻疠:将" + get.cnNumber(num) + "张牌置于武将牌上",
cards,
])
.set("forceAuto", true)
.set("ai", function (button) {
return get.value(button.link, _status.event.player);
});
"step 1";
if (result.bool) {
player.addToExpansion("gain2", result.links).gaintag.add("xunli");
}
},
marktext: "疠",
intro: {
content: "expansion",
markcount: "expansion",
},
group: "xunli_exchange",
subSkill: {
exchange: {
audio: "xunli",
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return (
player.getExpansions("xunli").length > 0 &&
player.hasCard((card) => get.color(card, player) == "black", "h")
);
},
content: function () {
"step 0";
var cards = player.getExpansions("xunli");
if (!cards.length || !player.countCards("h")) {
event.finish();
return;
}
var next = player.chooseToMove("寻疠:是否交换“疠”和手牌?");
next.set("list", [
[get.translation(player) + "(你)的疠", cards],
[
"手牌区",
player.getCards("h", (card) => get.color(card, player) == "black"),
],
]);
next.set("filterMove", function (from, to) {
return typeof to != "number";
});
next.set("processAI", function (list) {
var player = _status.event.player;
var getv = function (card) {
if (get.info(card).toself) return 0;
return player.getUseValue(card, false);
};
var cards = list[0][1].concat(list[1][1]).sort(function (a, b) {
return getv(b) - getv(a);
}),
cards2 = cards.splice(0, player.getExpansions("xunli").length);
return [cards2, cards];
});
"step 1";
if (result.bool) {
var pushs = result.moved[0],
gains = result.moved[1];
pushs.removeArray(player.getExpansions("xunli"));
gains.removeArray(player.getCards("h"));
if (!pushs.length || pushs.length != gains.length) return;
player.logSkill("xunli_exchange");
player.addToExpansion(pushs, player, "giveAuto").gaintag.add("xunli");
game.log(player, "将", pushs, "作为“疠”置于武将牌上");
player.gain(gains, "gain2");
}
},
},
},
},
zhishi: {
audio: 2,
trigger: { player: "phaseJieshuBegin" },
direct: true,
content: function () {
"step 0";
player.chooseTarget(get.prompt2("zhishi")).set("ai", function (target) {
var player = _status.event.player;
var att = get.attitude(player, target);
if (att <= 4) return 0;
if (target.hasSkillTag("nogain")) att /= 10;
return att;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("zhishi", target);
player.storage.zhishi_mark = target;
player.addTempSkill("zhishi_mark", { player: "phaseBegin" });
}
},
ai: {
combo: "xunli",
expose: 0.3
},
subSkill: {
mark: {
trigger: {
global: ["dying", "useCardToTargeted"],
},
direct: true,
charlotte: true,
filter: function (event, player) {
if (!player.getExpansions("xunli").length) return false;
var target = player.storage.zhishi_mark;
if (event.name == "dying") return event.player == target;
return event.card.name == "sha" && event.target == target;
},
content: function () {
"step 0";
var target = player.storage.zhishi_mark;
event.target = target;
player
.chooseButton(
[
get.prompt("zhishi", target),
'弃置任意张“疠”并令其摸等量的牌
',
player.getExpansions("xunli"),
],
[1, Infinity]
)
.set("ai", function (button) {
var player = _status.event.player,
target = player.storage.zhishi_mark;
if (target.hp < 1 && target != get.zhu(player)) return 0;
if (target.hasSkillTag("nogain")) return 0;
return 3 - player.getUseValue(card, false);
});
"step 1";
if (result.bool) {
player.logSkill("zhishi", target);
player.loseToDiscardpile(result.links);
target.draw(result.links.length);
}
},
mark: "character",
intro: {
content: "决定帮助$,具体帮不帮另说",
},
},
},
},
lieyi: {
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.getExpansions("xunli").length > 0;
},
filterTarget: lib.filter.notMe,
content: function () {
"step 0";
var cards = player.getExpansions("xunli");
var cards2 = cards.filter(function (card) {
return target.isIn() && player.canUse(card, target, false);
});
if (cards2.length) {
player
.chooseButton(["对" + get.translation(target) + "使用一张牌", cards2], true)
.set("ai", function (button) {
return get.order(button.link);
});
} else {
event.finish();
if (cards.length) player.loseToDiscardpile(cards);
if (
target.isIn() &&
!target.hasHistory("damage", function (evt) {
return evt.getParent("lieyi") == event && evt._dyinged;
})
)
player.loseHp();
}
"step 1";
player.useCard(result.links[0], target, false);
event.goto(0);
},
ai: {
order: 2,
result: {
target: function (player, target) {
var cards = player.getExpansions("xunli");
var effect = 0,
damage = 0;
for (var i of cards) {
if (player.canUse(i, target, false)) {
effect += get.effect(target, i, player, target);
damage += get.tag(i, "damage");
}
}
if (damage >= target.hp) return effect;
if (player.hp > 2 && cards.length > 3) return effect / 3;
return 0;
},
},
combo: "xunli"
},
},
//马日磾
bingjie: {
trigger: { player: "phaseUseBegin" },
check: function (event, player) {
return (
player.maxHp > 3 &&
player.isDamaged() &&
player.hasCard(function (card) {
return (
game.hasPlayer(function (current) {
return (
current != player &&
get.attitude(player, current) < 0 &&
player.canUse(card, current, null, true) &&
get.effect(current, card, player, player) > 0
);
}) && player.hasValueTarget(card)
);
}, "hs")
);
},
content: function () {
"step 0";
player.loseMaxHp();
"step 1";
player.addTempSkill("bingjie_effect");
game.delayx();
},
subSkill: {
effect: {
audio: "bingjie",
trigger: { player: "useCardToPlayered" },
forced: true,
charlotte: true,
logTarget: "target",
filter: function (event, player) {
return (
event.target != player &&
(event.card.name == "sha" || get.type(event.card, false) == "trick") &&
event.target.countCards("he") > 0
);
},
content: function () {
"step 0";
trigger.target.chooseToDiscard("he", true);
"step 1";
if (
result.bool &&
result.cards.length &&
get.color(result.cards[0], trigger.target) == get.color(trigger.card)
) {
game.log(trigger.target, "不能响应", trigger.card);
trigger.directHit.push(trigger.target);
}
},
ai: {
effect: {
player: function (card, player, target) {
if (
player !== target &&
get.itemtype(target) === "player" &&
(card.name === "sha" || get.type(card, false) === "trick") &&
target.countCards("he") &&
!target.hasSkillTag("noh")
)
return [1, 0, 1, -1];
},
},
},
},
},
},
zhengding: {
audio: 2,
trigger: { player: ["useCard", "respond"] },
forced: true,
filter: function (event, player) {
if (player == _status.currentPhase) return false;
if (!Array.isArray(event.respondTo)) return false;
if (player == event.respondTo[0]) return false;
var color = get.color(event.card);
if (color == "none") return false;
return color == get.color(event.respondTo[1]);
},
content: function () {
player.gainMaxHp();
player.recover();
},
},
//孙茹
xiecui: {
audio: 2,
trigger: { global: "damageBegin1" },
filter: function (event, player) {
var source = event.source;
if (!source || source != _status.currentPhase || event.getParent().type != "card")
return false;
return !source.hasHistory("sourceDamage", function (evt) {
return evt.getParent().type == "card";
});
},
logTarget: "source",
prompt2: function (event, player) {
var str = "令" + get.translation(event.player) + "即将受到的";
str += "" + event.num + "点";
if (event.hasNature("linked")) {
str += get.translation(event.nature) + "属性";
}
str += "伤害+1";
if (event.source.group == "wu") {
var cards = event.cards.filterInD();
if (cards.length) {
str +=
";然后" +
get.translation(event.source) +
"获得" +
get.translation(cards) +
",且本回合的手牌上限+1";
}
}
return str;
},
check: function (event, player) {
var att = get.attitude(player, event.player);
if (att < 0) {
if (event.source.group != "wu" || !event.cards.filterInD().length) return true;
return get.attitude(player, event.source) > 0;
}
return false;
},
content: function () {
trigger.num++;
var source = trigger.source;
if (source.group == "wu") {
var cards = trigger.cards.filterInD();
if (cards.length > 0) {
source.gain(cards, "gain2");
source.addMark("xiecui_effect", 1, false);
source.addTempSkill("xiecui_effect");
}
}
},
subSkill: {
effect: {
charlotte: true,
mod: {
maxHandcard: (player, num) => num + player.countMark("xiecui_effect"),
},
marktext: "翠",
onremove: true,
intro: { content: "手牌上限+#" },
},
},
ai: { threaten: 1.75 },
},
youxu: {
audio: 2,
trigger: { global: "phaseEnd" },
logTarget: "player",
filter: function (event, player) {
return event.player.countCards("h") > event.player.hp;
},
check: function (event, player) {
if (get.attitude(player, event.player) <= 0) return true;
else
return game.hasPlayer(function (current) {
return (
current != event.player &&
current.isDamaged() &&
current.isMinHp() &&
get.attitude(player, current) > 0 &&
get.recoverEffect(current, player, player) > 0
);
});
},
content: function () {
"step 0";
if (player == trigger.player) {
player.chooseCard("h", true, "请展示一张手牌");
} else {
player.choosePlayerCard(trigger.player, true, "h");
}
"step 1";
if (result.bool) {
var card = result.cards[0];
event.card = card;
var str = get.translation(player);
if (player != trigger.player) str += "对" + get.translation(trigger.player);
str += "发动了【忧恤】";
player.showCards(card, str);
player
.chooseTarget(
"令一名角色获得" + get.translation(card),
"若其体力值为全场最少,则其回复1点体力",
function (card, player, target) {
return target != _status.event.getTrigger().player;
}
)
.set("ai", function (target) {
var player = _status.event.player,
att = get.attitude(player, target);
if (att < 0) return 0;
if (
target.isDamaged() &&
target.isMinHp &&
get.recoverEffect(target, player, player) > 0
)
return 4 * att;
return att;
});
} else event.finish();
"step 2";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.line(target, "green");
target.gain(card, trigger.player, "give").giver = player;
} else event.finish();
"step 3";
if (target.isMinHp()) target.recover();
},
},
//夏侯令女
fuping: {
audio: 2,
hiddenCard: function (player, name) {
var list = player.getStorage("fuping").slice(0);
list.removeArray(player.getStorage("fuping_round"));
return list.includes(name) && player.hasCard((card) => get.type(card) != "basic", "ehs");
},
enable: "chooseToUse",
locked: false,
filter: function (event, player) {
var list = player.getStorage("fuping").slice(0);
list.removeArray(player.getStorage("fuping_round"));
if (!list.length) return false;
if (!player.hasCard((card) => get.type(card) != "basic", "ehs")) return false;
for (var i of list) {
var type = get.type2(i, false);
if (
(type == "basic" || type == "trick") &&
event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)
)
return true;
}
return false;
},
chooseButton: {
dialog: function (event, player) {
var list = player.getStorage("fuping").slice(0);
list.removeArray(player.getStorage("fuping_round"));
var list2 = [];
for (var i of list) {
var type = get.type2(i, false);
if (
(type == "basic" || type == "trick") &&
event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)
)
list2.push([type, "", i]);
}
return ui.create.dialog("浮萍", [list2, "vcard"]);
},
check: function (button) {
if (_status.event.getParent().type != "phase") return 1;
return _status.event.player.getUseValue({ name: button.link[2] }, null, true);
},
backup: function (links, player) {
return {
audio: "fuping",
filterCard: (card) => get.type(card) != "basic",
position: "he",
popname: true,
viewAs: {
name: links[0][2],
},
check: function (card) {
return 8 - get.value(card);
},
precontent: function () {
player.addTempSkill("fuping_round");
player.markAuto("fuping_round", [event.result.card.name]);
},
};
},
prompt: function (links, player) {
return "将一张非基本牌当做【" + get.translation(links[0][2]) + "】使用";
},
},
ai: {
order: 8,
result: { player: 1 },
respondSha: true,
skillTagFilter: function (player) {
var list = player.getStorage("fuping").slice(0);
list.removeArray(player.getStorage("fuping_round"));
return list.includes("sha");
},
},
mod: {
targetInRange: function (card, player, target) {
if (!player.hasEnabledSlot()) return true;
},
},
marktext: "萍",
intro: { content: "已记录$" },
group: "fuping_mark",
subSkill: {
mark: {
trigger: { global: "useCardAfter" },
filter: function (event, player) {
return (
player != event.player &&
event.targets.includes(player) &&
player.hasEnabledSlot() &&
!player.getStorage("fuping").includes(event.card.name)
);
},
logTarget: "player",
prompt2: (event) =>
"废除一个装备栏并记录【" + get.translation(event.card.name) + "】",
check: function (event, player) {
var list = [
"tao",
"juedou",
"guohe",
"shunshou",
"wuzhong",
"xietianzi",
"yuanjiao",
"wanjian",
"nanman",
"huoshaolianying",
"chuqibuyi",
"zhujinqiyuan",
"lebu",
"bingliang",
];
if (!list.includes(event.card.name)) return false;
if (
["nanman", "wanjian"].includes(event.card.name) &&
!player.hasValueTarget({ name: event.card.name })
)
return false;
var list = [3, 5, 4, 1, 2];
for (var i of list) {
if (player.hasEnabledSlot(i)) {
var card = player.getEquip(i);
if (!card || player.hasEmptySlot(i)) return true;
if (get.value(card, player) <= 0) return true;
}
}
return false;
},
content: function () {
player.markAuto("fuping", [trigger.card.name]);
game.log(player, "记录了", "#y" + get.translation(trigger.card.name));
player.chooseToDisable().set("ai", function (event, player, list) {
var list = [3, 5, 4, 1, 2];
for (var i of list) {
if (player.hasEnabledSlot(i)) {
var card = player.getEquip(i);
if (!card || player.hasEmptySlot(i)) return "equip" + i;
if (get.value(card, player) <= 0) return "equip" + i;
}
}
return list.randomGet();
});
},
},
backup: { audio: "fuping" },
round: { charlotte: true, onremove: true },
},
},
weilie: {
audio: 2,
enable: "phaseUse",
filter: function (event, player) {
return (
player.countMark("weilie") <= player.getStorage("fuping").length &&
player.countCards("he") > 0 &&
game.hasPlayer((current) => current.isDamaged())
);
},
filterCard: true,
position: "he",
filterTarget: (card, player, target) => target.isDamaged(),
check: function (card) {
return 8 - get.value(card);
},
content: function () {
"step 0";
player.addMark("weilie", 1, false);
target.recover();
"step 1";
if (target.isDamaged()) target.draw();
},
onremove: true,
ai: {
order: 1,
result: {
player: function (player, target) {
var eff = get.recoverEffect(target, player, player);
if (target.getDamagedHp() > 1)
eff += get.effect(target, { name: "draw" }, player, player);
return eff;
},
},
},
},
//张瑶
//Partly powered by 烟雨墨染
yuanyu: {
audio: 2,
enable: "phaseUse",
usable: 1,
content: function () {
"step 0";
player.draw();
"step 1";
if (player.countCards("h") > 0 && game.hasPlayer((current) => current != player)) {
var suits = lib.suit.slice(0),
cards = player.getExpansions("yuanyu");
for (var i of cards) suits.remove(get.suit(i, false));
var str =
"选择一张手牌,作为“怨”置于武将牌上;同时选择一名其他角色,令该角色获得〖怨语〗的后续效果。";
if (suits.length) {
str += "目前“怨”中未包含的花色:";
for (var i of suits) str += get.translation(i);
}
player.chooseCardTarget({
filterCard: true,
filterTarget: lib.filter.notMe,
position: "h",
prompt: "怨语:选择置于武将牌上的牌和目标",
prompt2: str,
suits: suits,
forced: true,
ai1: function (card) {
var val = get.value(card),
evt = _status.event;
if (evt.suits.includes(get.suit(card, false))) return 8 - get.value(card);
return 5 - get.value(card);
},
ai2: function (target) {
var player = _status.event.player;
if (
player.storage.yuanyu_damage &&
player.storage.yuanyu_damage.includes(target)
)
return 0;
return -get.attitude(player, target);
},
});
} else event.finish();
"step 2";
var target = result.targets[0];
player.addSkill("yuanyu_damage");
player.markAuto("yuanyu_damage", result.targets);
player.line(target, "green");
if (!target.storage.yuanyu_mark) {
target.storage.yuanyu_mark = player;
target.markSkillCharacter("yuanyu_mark", player, "怨语", "已获得〖怨语〗效果");
target.addSkill("yuanyu_mark");
}
player.addToExpansion(result.cards, player, "give").gaintag.add("yuanyu");
},
intro: {
content: "expansion",
markcount: "expansion",
},
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
player.removeSkill("yuanyu_damage");
},
ai: {
order: 7,
result: {
player: 1,
},
},
subSkill: {
mark: {
mark: "character",
charlotte: true,
intro: {
content: "已获得〖怨语〗效果",
onunmark: true,
},
},
damage: {
trigger: { global: ["damageSource", "phaseDiscardBegin"] },
forced: true,
charlotte: true,
onremove: function (player, skill) {
if (player.storage[skill]) {
for (var i of player.storage[skill]) {
if (i.storage.yuanyu_mark == player) i.unmarkSkill("yuanyu_mark");
}
}
delete player.storage[skill];
},
filter: function (event, player) {
if (event.name == "damage") {
var source = event.source;
return (
source &&
player.getStorage("yuanyu_damage").includes(source) &&
source.countCards("h") > 0
);
} else {
if (player == event.player) {
return player.getStorage("yuanyu_damage").some(function (target) {
return target.isIn() && target.countCards("h") > 0;
});
} else if (player.getStorage("yuanyu_damage").includes(event.player)) {
return event.player.countCards("h") > 0;
}
return false;
}
},
content: function () {
"step 0";
if (trigger.name == "phaseDiscard") {
if (trigger.player == player) {
event.targets = player
.getStorage("yuanyu_damage")
.filter(function (target) {
return target.isIn() && target.countCards("h") > 0;
})
.sortBySeat();
} else event.targets = [trigger.player];
} else event.targets = [trigger.source];
"step 1";
event.target = event.targets.shift();
event.count = trigger.name == "damage" ? trigger.num : 1;
"step 2";
event.count--;
var suits = lib.suit.slice(0),
cards = player.getExpansions("yuanyu");
for (var i of cards) suits.remove(get.suit(i, false));
var next = target.chooseCard(
"h",
true,
"将一张手牌置于" + get.translation(player) + "的武将牌上"
);
next.set("suits", suits);
next.set("ai", function (card) {
var val = get.value(card),
evt = _status.event;
if (evt.suits.includes(get.suit(card, false))) return 5 - get.value(card);
return 8 - get.value(card);
});
if (suits.length) {
var str = "目前未包含的花色:";
for (var i of suits) str += get.translation(i);
next.set("prompt2", str);
}
"step 3";
player.addToExpansion(result.cards, target, "give").gaintag.add("yuanyu");
"step 4";
if (!player.hasSkill("yuanyu_damage")) event.finish();
else if (event.count > 0 && target.countCards("h") > 0) event.goto(2);
else if (event.targets.length > 0) event.goto(1);
},
},
},
},
xiyan: {
audio: 2,
trigger: { player: "addToExpansionAfter" },
filter: function (event, player) {
if (!event.gaintag.includes("yuanyu")) return false;
var cards = player.getExpansions("yuanyu");
if (cards.length < lib.suit.length) return false;
var suits = lib.suit.slice(0);
for (var i of cards) {
suits.remove(get.suit(i));
if (!suits.length) return true;
}
return false;
},
logTarget: () => _status.currentPhase,
prompt2: "获得所有“怨”",
check: () => true,
content: function () {
"step 0";
player.removeSkill("yuanyu_damage");
var cards = player.getExpansions("yuanyu");
player.gain(cards, "gain2");
"step 1";
var target = _status.currentPhase;
if (player == target) {
player.addMark("xiyan_buff", 4, false);
player.addTempSkill("xiyan_buff");
delete player.getStat("skill").yuanyu;
event.finish();
} else {
player
.chooseBool(
"夕颜:是否令" +
get.translation(target) +
"本回合的手牌上限-4且不能使用基本牌?"
)
.set("ai", function () {
return _status.event.bool;
})
.set("bool", get.attitude(player, target) < 0);
}
"step 2";
if (result.bool) {
var target = _status.currentPhase;
target.addMark("xiyan_debuff", 4, false);
target.addTempSkill("xiyan_debuff");
}
},
subSkill: {
buff: {
charlotte: true,
mark: true,
marktext: " + ",
intro: {
content: "本回合手牌上限+#且使用牌无次数限制",
},
mod: {
maxHandcard: function (player, num) {
return num + player.countMark("xiyan_buff");
},
cardUsable: function (card, player) {
return Infinity;
},
},
sub: true,
},
debuff: {
charlotte: true,
mark: true,
marktext: " - ",
intro: {
content: "本回合手牌上限-#且不能使用基本牌",
},
mod: {
maxHandcard: function (player, num) {
return num - player.countMark("xiyan_debuff");
},
cardEnabled: function (card) {
if (get.type(card) == "basic") return false;
},
cardSavable: function (card) {
if (get.type(card) == "basic") return false;
},
},
sub: true,
},
},
ai: {
combo: "yuanyu",
},
},
//滕胤
chenjian: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
prompt2: function (event, player) {
return (
"亮出牌堆顶的" +
get.cnNumber(3 + player.countMark("chenjian")) +
"张牌,然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌"
);
},
content: function () {
"step 0";
var cards = get.cards(3 + player.countMark("chenjian"));
event.cards = cards;
player.showCards(cards, get.translation(player) + "发动了【陈见】");
"step 1";
var list = [];
if (
player.countCards("he", (i) => {
return lib.filter.cardDiscardable(i, player, "chenjian");
})
)
list.push("选项一");
if (
event.cards.some((i) => {
return player.hasUseTarget(i);
})
)
list.push("选项二");
if (list.length === 1) event._result = { control: list[0] };
else if (list.length > 1)
player
.chooseControl(list)
.set("choiceList", [
"弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌",
"使用" + get.translation(event.cards) + "中的一张牌",
])
.set("prompt", "陈见:请选择一项")
.set("ai", () => {
let player = _status.event.player,
cards = _status.event.getParent().cards;
if (
cards.some((i) => {
return player.getUseValue(i) > 0;
})
)
return "选项二";
return "选项一";
});
else event.finish();
"step 2";
event.goon = 0;
event.choosed = result.control;
if (result.control === "cancel2") event.finish();
else if (result.control === "选项二") event.goto(6);
"step 3";
if (
player.countCards("he", (i) => {
return lib.filter.cardDiscardable(i, player, "chenjian");
})
)
player
.chooseToDiscard("he", !event.goon)
.set("ai", function (card) {
let evt = _status.event.getParent(),
val =
event.goon && evt.player.countMark("chenjian") < 2
? 0
: -get.value(card),
suit = get.suit(card);
for (let i of evt.cards) {
if (get.suit(i, false) == suit) val += get.value(i, "raw");
}
return val;
})
.set(
"prompt",
"陈见:" +
(event.goon ? "是否" : "请") +
"弃置一张牌,然后令一名角色获得" +
get.translation(event.cards) +
"中花色与之相同的牌" +
(event.goon ? "?" : "")
);
else if (event.choosed === "选项一") event.goto(6);
else event.finish();
"step 4";
if (result.bool) {
event.goon++;
var suit = get.suit(result.cards[0], player);
var cards2 = event.cards.filter(function (i) {
return get.suit(i, false) == suit;
});
if (cards2.length) {
event.cards2 = cards2;
player
.chooseTarget(true, "选择一名角色获得" + get.translation(cards2))
.set("ai", function (target) {
var att = get.attitude(_status.event.player, target);
if (att > 0) {
return att + Math.max(0, 5 - target.countCards("h"));
}
return att;
});
} else if (event.choosed === "选项一") event.goto(6);
else event.goto(8);
} else event.finish();
"step 5";
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
target.gain(event.cards2, "gain2");
event.cards.removeArray(event.cards2);
}
if (event.choosed === "选项二") event.goto(8);
"step 6";
var cards2 = cards.filter(function (i) {
return player.hasUseTarget(i);
});
if (cards2.length)
player
.chooseButton(
[
"陈见:" +
(event.goon ? "是否" : "请") +
"使用其中一张牌" +
(event.goon ? "?" : ""),
cards2,
],
!event.goon
)
.set("ai", function (button) {
return player.getUseValue(button.link);
});
else if (event.choosed === "选项二") event.goto(3);
else event.finish();
"step 7";
if (result.bool) {
player.chooseUseTarget(true, result.links[0], false);
event.cards.removeArray(result.links);
event.goon += 2;
if (event.choosed === "选项二") event.goto(3);
} else event.finish();
"step 8";
if (event.goon > 2) {
if (player.countMark("chenjian") < 2) player.addMark("chenjian", 1, false);
player.recast(player.getCards("h", lib.filter.cardRecastable));
}
},
marktext: "见",
intro: { content: "展示牌数量+#" },
},
xixiu: {
mod: {
canBeDiscarded: function (card, player, target) {
if (player != target && get.position(card) == "e" && target.countCards("e") == 1)
return false;
},
},
audio: 2,
trigger: { target: "useCardToTargeted" },
forced: true,
filter: function (event, player) {
if (player == event.player || !player.countCards("e")) return false;
var suit = get.suit(event.card, false);
if (suit == "none") return false;
return player.hasCard(function (card) {
return get.suit(card, player) == suit;
}, "e");
},
content: function () {
player.draw();
},
ai: {
effect: {
target: function (card, player, target) {
if (typeof card == "object" && player != target) {
var suit = get.suit(card);
if (suit == "none") return;
if (
player.hasCard(function (card) {
return get.suit(card, player) == suit;
}, "e")
)
return [1, 0.08];
}
},
},
},
},
//张嫙
tongli: {
audio: 2,
trigger: { player: "useCardToPlayered" },
filter: function (event, player) {
if (!event.isFirstTarget || (event.card.storage && event.card.storage.tongli))
return false;
var type = get.type(event.card);
if (type != "basic" && type != "trick") return false;
var hs = player.getCards("h");
if (!hs.length) return false;
var evt = event.getParent("phaseUse");
if (!evt || evt.player != player) return false;
var num1 = player.getHistory("useCard", function (evtx) {
if (evtx.getParent("phaseUse") != evt) return false;
return !evtx.card.storage || !evtx.card.storage.tongli;
}).length;
if (hs.length < num1) return false;
var list = [];
for (var i of hs) list.add(get.suit(i, player));
return list.length == num1;
},
prompt2: function (event, player) {
var evt = event.getParent("phaseUse");
var num = player.getHistory("useCard", function (evtx) {
if (evtx.getParent("phaseUse") != evt) return false;
return !evtx.card.storage || !evtx.card.storage.tongli;
}).length;
//var str='视为额外使用'+get.cnNumber(num)+'张'
var str = "额外结算" + get.cnNumber(num) + "次";
if (event.card.name == "sha" && game.hasNature(event.card))
str += get.translation(event.card.nature);
return str + "【" + get.translation(event.card.name) + "】";
},
check: function (event, player) {
return !get.tag(event.card, "norepeat");
},
content: function () {
//player.addTempSkill('tongli_effect');
var evt = trigger.getParent("phaseUse");
var num = player.getHistory("useCard", function (evtx) {
if (evtx.getParent("phaseUse") != evt) return false;
return true;
//return !evtx.card.storage||!evtx.card.storage.tongli;
}).length;
trigger.getParent().effectCount += num;
},
/*subSkill:{
effect:{
trigger:{player:'useCardAfter'},
forced:true,
charlotte:true,
filter:function(event,player){
return event.tongli_effect!=undefined;
},
content:function(){
'step 0'
event.card=trigger.tongli_effect[0];
event.count=trigger.tongli_effect[1];
'step 1'
event.count--;
for(var i of trigger.targets){
if(!i.isIn()||!player.canUse(card,i,false)) return;
}
if(trigger.addedTarget&&!trigger.addedTarget.isIn()) return;
if(trigger.addedTargets&&trigger.addedTargets.length){
for(var i of trigger.addedTargets){
if(!i.isIn()) return;
}
}
var next=player.useCard(get.copy(card),trigger.targets,false);
if(trigger.addedTarget) next.addedTarget=trigger.addedTarget;
if(trigger.addedTargets&&trigger.addedTargets.length) next.addedTargets=trigger.addedTargets.slice(0);
if(event.count>0) event.redo();
},
},
},*/
},
shezang: {
audio: 2,
round: 1,
trigger: { global: "dying" },
frequent: true,
filter: function (event, player) {
return event.player == player || player == _status.currentPhase;
},
content: function () {
var cards = [];
for (var i of lib.suit) {
var card = get.cardPile2(function (card) {
return get.suit(card, false) == i;
});
if (card) cards.push(card);
}
if (cards.length) player.gain(cards, "gain2");
},
},
//王桃王悦
huguan: {
audio: 2,
audioname: ["wangyue"],
init: function (player) {
game.addGlobalSkill("huguan_all");
},
trigger: { global: "useCard" },
direct: true,
filter: function (event, player) {
if (get.color(event.card, false) != "red") return false;
var evt = event.getParent("phaseUse");
if (!evt || evt.player != event.player) return false;
return (
event.player
.getHistory("useCard", function (event) {
return event.getParent("phaseUse") == evt;
})
.indexOf(event) == 0
);
},
content: function () {
"step 0";
player
.chooseControl(lib.suit, "cancel2")
.set("prompt", get.prompt("huguan", trigger.player))
.set("prompt2", "令某种花色的手牌不计入其本回合的手牌上限")
.set("ai", function () {
var player = _status.event.player,
target = _status.event.getTrigger().player,
att = get.attitude(player, target);
if (att <= 0) {
if (
!player.hasSkill("yaopei") ||
player.hasHistory("useSkill", function (evt) {
return evt.skill == "huguan" && evt.targets.includes(target);
}) ||
target.needsToDiscard() -
target.needsToDiscard(-target.countCards("h") / 4) >
(att > -2 ? 1.6 : 1)
)
return "cancel2";
}
let list = lib.suit.slice(0);
if (att <= 0 && target.getStorage("huguan_add"))
for (let i of target.getStorage("huguan_add")) {
if (list.includes(i)) return i;
}
list.removeArray(target.getStorage("huguan_add"));
if (list.length) return list.randomGet();
return "cancel2";
});
"step 1";
if (result.control != "cancel2") {
var target = trigger.player;
player.logSkill("huguan", target);
game.log(player, "选择了", "#g" + get.translation(result.control), "花色");
target.addTempSkill("huguan_add");
target.markAuto("huguan_add", [result.control]);
}
},
subSkill: {
add: {
charlotte: true,
onremove: true,
mod: {
ignoredHandcard: function (card, player) {
if (player.getStorage("huguan_add").includes(get.suit(card, player)))
return true;
},
cardDiscardable: function (card, player, name) {
if (
name == "phaseDiscard" &&
player.getStorage("huguan_add").includes(get.suit(card, player))
)
return false;
},
},
intro: { content: "本回合$花色的牌不计入手牌上限" },
},
all: {
mod: {
aiValue: function (player, card, num) {
if (
player &&
player.storage.huguan_all > 0 &&
get.itemtype(card) == "card" &&
get.color(card, player) == "red"
)
return num + player.storage.huguan_all;
},
},
trigger: {
player: ["phaseUseBegin", "useCard"],
},
filter: function (event, player) {
if (event.name === "useCard") return player.storage.huguan_all;
return true;
},
silent: true,
charlotte: true,
content: function () {
"step 0";
if (trigger.name === "useCard") {
player.storage.huguan_all = 0;
event.finish();
}
"step 1";
let num = -157;
game.countPlayer(function (current) {
if (current.hasSkill("huguan"))
num = Math.max(num, get.attitude(_status.event.player, current));
}, true);
if (num === -157) game.removeGlobalSkill("huguan_all");
else if (num === 0) player.storage.huguan_all = 6;
else if (num > 0) player.storage.huguan_all = 9;
},
},
},
},
yaopei: {
audio: 2,
trigger: { global: "phaseDiscardEnd" },
direct: true,
filter: function (event, player) {
if (player == event.player || !event.player.isIn()) return false;
if (
!player.hasAllHistory("useSkill", function (evt) {
return evt.skill == "huguan" && evt.targets.includes(event.player);
})
)
return false;
var suits = [];
event.player.getHistory("lose", function (evt) {
if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) {
for (var i of evt.cards2)
suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false));
}
});
if (suits.length >= lib.suit.length) return false;
if (_status.connectMode && player.countCards("h") > 0) return true;
return player.hasCard(function (card) {
return !suits.includes(get.suit(card));
}, "he");
},
content: function () {
"step 0";
var suits = [];
trigger.player.getHistory("lose", function (evt) {
if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger) {
for (var i of evt.cards2)
suits.add(get.suit(i, evt.hs.includes(i) ? evt.player : false));
}
});
player.chooseCardTarget({
prompt: get.prompt("yaopei", trigger.player),
prompt2:
"操作提示:选择要弃置的牌,并选择执行摸牌选项的角色,另一名角色执行回复体力的选项。",
suits: suits,
position: "he",
filterCard: function (card, player) {
return (
!_status.event.suits.includes(get.suit(card)) &&
lib.filter.cardDiscardable(card, player, "yaopei")
);
},
filterTarget: function (card, player, target) {
return target == player || target == _status.event.getTrigger().player;
},
ai1: function (card) {
let player = _status.event.player,
source = _status.event.getTrigger().player;
if (
get.attitude(player, source) > 0 &&
(get.recoverEffect(player, player, player) > 0 ||
get.recoverEffect(source, player, player) > 0)
)
return 12 - get.value(card);
return 8 - get.value(card);
},
ai2: function (target) {
let player = _status.event.player,
source = _status.event.getTrigger().player;
let recoverer = player === target ? source : player;
if (recoverer.isHealthy()) return get.attitude(player, target);
let att = get.attitude(player, recoverer),
rec = get.recoverEffect(recoverer, player, player);
if (rec > 0) return Math.abs(att) + get.attitude(player, target);
return 0;
},
});
"step 1";
if (result.bool) {
var target = trigger.player;
player.logSkill("yaopei", target);
player.discard(result.cards);
if (player == result.targets[0]) {
if (
target.isDamaged() &&
target.hp < player.hp &&
(get.mode() != "identity" || player.identity != "nei")
)
player.addExpose(0.15);
target.recover();
player.draw(2);
} else {
if (
(player.isHealthy() || player.hp > target.hp) &&
(get.mode() != "identity" || player.identity != "nei")
)
player.addExpose(0.15);
target.draw(2);
player.recover();
}
}
},
ai: {
combo: "huguan"
},
},
mingluan: {
audio: 2,
trigger: { global: "phaseJieshuBegin" },
direct: true,
filter: function (event, player) {
return (
player != event.player &&
event.player.isIn() &&
player.hasSkill("mingluan_mark") &&
player.countCards("he") > 0
);
},
content: function () {
"step 0";
let he = player.getCards("he"),
disval = 0,
dis = 0,
spare = 30,
use = true;
for (let i of he) {
let val = get.value(i, player);
if (val < 6 && get.position(i) == "h") {
dis++;
disval += val;
} else if (val < spare) spare = val;
}
if (!dis) {
dis = 1;
disval = spare;
spare = -1;
}
let draw = Math.min(trigger.player.countCards("h"), 5 + dis - player.countCards("h"));
if (6 * draw < disval) use = false;
player
.chooseToDiscard(
"he",
get.prompt("mingluan"),
"弃置任意张牌,并摸等同于" +
get.translation(trigger.player) +
"手牌数的牌(至多摸至五张)",
[1, Infinity]
)
.set("ai", function (card) {
let val = get.value(card, player);
if (val < 0 && card.name !== "du") return 30;
if (!_status.event.use) return 0;
if (ui.selected.cards.length) {
if (get.position(card) !== "h") return 0;
return 6 - val;
}
if (_status.event.spare < 0 || get.position(card) === "h") return 30 - val;
return 0;
})
.set("spare", spare)
.set("use", use).logSkill = ["mingluan", trigger.player];
"step 1";
if (result.bool) {
var num = trigger.player.countCards("h"),
num2 = 5 - player.countCards("h");
if (num > 0 && num2 > 0) player.draw(Math.min(num, num2));
}
},
group: "mingluan_count",
subSkill: {
count: {
charlotte: true,
trigger: { global: "recoverEnd" },
silent: true,
popup: false,
firstDo: true,
filter: function (event, player) {
var current = _status.currentPhase;
return current && current != player && !player.hasSkill("mingluan_mark");
},
content: function () {
player.addTempSkill("mingluan_mark");
},
},
mark: {
charlotte: true,
},
},
},
//赵嫣
jinhui: {
audio: 2,
enable: "phaseUse",
usable: 1,
content: function () {
"step 0";
var cards = [];
while (cards.length < 3) {
var card = get.cardPile2(function (card) {
for (var i of cards) {
if (i.name == card.name) return false;
}
var info = get.info(card, false);
if (info.ai && info.ai.tag && info.ai.tag.damage) return false;
return (
!info.notarget &&
(info.toself ||
info.singleCard ||
!info.selectTarget ||
info.selectTarget == 1)
);
});
if (card) cards.push(card);
else break;
}
if (!cards.length) event.finish();
else {
player.showCards(cards, get.translation(player) + "发动了【锦绘】");
event.cards = cards;
game.cardsGotoOrdering(cards);
if (game.hasPlayer((current) => current != player))
player
.chooseTarget("选择【锦绘】的目标", true, lib.filter.notMe)
.set("ai", function (target) {
var player = _status.event.player,
cards = _status.event.getParent().cards.slice(0);
var max_effect = 0,
max_effect_player = 0;
for (var i of cards) {
var targetx = lib.skill.jinhui.getUsableTarget(i, target, player);
if (targetx) {
var effect2 = get.effect(targetx, i, target, target);
var effect3 = get.effect(targetx, i, target, player);
if (effect2 > max_effect) {
max_effect = effect2;
max_effect_player = effect3;
}
}
}
return max_effect_player;
});
else event.finish();
}
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.line(target, "green");
var cards = cards.filter(function (card) {
return lib.skill.jinhui.getUsableTarget(card, target, player);
});
if (cards.length) {
if (cards.length == 1) event._result = { bool: true, links: cards };
else
target
.chooseButton(["选择按“锦绘”规则使用一张牌", cards], true)
.set("ai", function (button) {
var player = _status.event.player,
target = _status.event.getParent().player,
card = button.link;
var targetx = lib.skill.jinhui.getUsableTarget(card, player, target);
var effect = get.effect(targetx, card, player, player),
cards = _status.event.getParent().cards.slice(0);
var effect2 = 0,
effect3 = 0;
cards.remove(button.link);
for (var i of cards) {
var targetx = lib.skill.jinhui.getUsableTarget(i, target, player);
if (targetx) {
effect2 += get.effect(targetx, i, target, target);
effect3 += get.effect(targetx, i, target, player);
}
}
if (effect2 > 0) effect += effect3;
return effect;
});
} else event.goto(3);
} else event.finish();
"step 2";
if (result.bool) {
var card = result.links[0];
event.cards.remove(card);
var targetx = lib.skill.jinhui.getUsableTarget(card, target, player);
target.useCard(card, targetx, false, "noai");
}
"step 3";
var cards = cards.filter(function (card) {
return lib.skill.jinhui.getUsableTarget(card, player, target);
});
if (cards.length) {
player
.chooseButton(["是否按“锦绘”规则使用其中一张牌?", cards])
.set("ai", function (button) {
var player = _status.event.player,
target = _status.event.getParent().target;
var card = button.link,
targetx = lib.skill.jinhui.getUsableTarget(card, player, target);
return get.effect(targetx, card, player, player);
});
} else event.finish();
"step 4";
if (result.bool) {
var card = result.links[0];
cards.remove(card);
var targetx = lib.skill.jinhui.getUsableTarget(card, player, target);
if (targetx) {
player.useCard(card, targetx, false, "noai");
}
if (cards.length) event.goto(3);
} else event.finish();
},
getUsableTarget: function (card, player, target) {
var info = get.info(card, false);
if (info.toself) return player.canUse(card, player, false) ? player : false;
return target.isIn() && player.canUse(card, target, false) ? target : false;
},
ai: {
order: 5,
result: { player: 1 },
},
},
qingman: {
audio: 2,
trigger: { global: "phaseEnd" },
forced: true,
logTarget: "player",
filter: function (event, player) {
if (!event.player.isIn()) return false;
var num = player.countCards("h");
if (num >= 5) return false;
var num2 = 0;
for (var i = 1; i <= 5; i++) {
num2 += event.player.countEmptySlot(i);
}
return num < num2;
},
content: function () {
var num2 = 0;
for (var i = 1; i <= 5; i++) {
num2 += trigger.player.countEmptySlot(i);
}
player.drawTo(num2);
},
},
//何晏
yachai: {
audio: 2,
trigger: { player: "damageEnd" },
filter: function (event, player) {
return event.source && event.source.isIn();
},
logTarget: "source",
check: function (event, player) {
return get.attitude(player, event.source) < 0;
},
content: function () {
"step 0";
var target = trigger.source,
str = get.translation(player);
event.target = target;
var th = target.countCards("h");
if (th > 0) {
event.num = Math.ceil(th / 2);
var list = [
"本回合不能使用手牌,然后" + str + "摸两张牌",
"展示所有手牌,并将其中一种花色的所有牌交给" + str,
"弃置" + get.cnNumber(event.num) + "张手牌",
];
target
.chooseControl()
.set("choiceList", list)
.set("ai", function () {
return get.rand(0, 2);
});
} else event._result = { index: 0 };
"step 1";
switch (result.index) {
case 0:
target.addTempSkill("yachai_block");
player.draw(2);
event.finish();
break;
case 1:
target.showHandcards();
break;
case 2:
event.goto(4);
break;
}
"step 2";
var map = {},
hs = target.getCards("h");
for (var i of hs) {
map[get.suit(i, target)] = true;
}
var list = [];
for (var i of lib.suit) {
if (map[i]) list.push(i);
}
if (!list.length) event.finish();
else if (list.length == 1) event._result = { control: list[0] };
else
target
.chooseControl(list)
.set("prompt", "将一种花色的牌交给" + get.translation(player));
"step 3";
var cards = target.getCards("h", function (card) {
return (
get.suit(card, target) == result.control &&
lib.filter.cardDiscardable(card, target, "yachai")
);
});
if (cards.length) target.give(cards, player, "give");
event.finish();
"step 4";
target.chooseToDiscard("h", true, num);
},
subSkill: {
block: {
mark: true,
intro: { content: "不能使用手牌" },
charlotte: true,
mod: {
cardEnabled: function (card, player) {
let hs = player.getCards("h"),
cards = [card];
if (Array.isArray(card.cards)) cards.addArray(card.cards);
for (let i of cards) {
if (hs.includes(i)) return false;
}
},
cardSavable: function (card, player) {
let hs = player.getCards("h"),
cards = [card];
if (Array.isArray(card.cards)) cards.addArray(card.cards);
for (let i of cards) {
if (hs.includes(i)) return false;
}
},
},
},
},
},
qingtan: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return game.hasPlayer((current) => current.countCards("h") > 0);
},
filterTarget: function (card, player, target) {
return target.countCards("h") > 0;
},
selectTarget: -1,
multitarget: true,
multiline: true,
content: function () {
"step 0";
targets.sortBySeat();
var next = player
.chooseCardOL(targets, "请选择要展示的牌", true)
.set("ai", function (card) {
return -get.value(card);
})
.set("source", player);
next.aiCard = function (target) {
var hs = target.getCards("h");
return { bool: true, cards: [hs.randomGet()] };
};
next._args.remove("glow_result");
"step 1";
var cards = [];
event.videoId = lib.status.videoId++;
for (var i = 0; i < targets.length; i++) cards.push(result[i].cards[0]);
event.cards = cards;
game.log(player, "展示了", targets, "的", cards);
game.broadcastAll(
function (targets, cards, id, player) {
var dialog = ui.create.dialog(get.translation(player) + "发动了【清谈】", cards);
dialog.videoId = id;
var getName = function (target) {
if (target._tempTranslate) return target._tempTranslate;
var name = target.name;
if (lib.translate[name + "_ab"]) return lib.translate[name + "_ab"];
return get.translation(name);
};
for (var i = 0; i < targets.length; i++) {
dialog.buttons[i].querySelector(".info").innerHTML =
getName(targets[i]) + get.translation(cards[i].suit);
}
},
targets,
cards,
event.videoId,
player
);
game.delay(4);
"step 2";
game.broadcastAll("closeDialog", event.videoId);
var list = [],
map = {};
for (var i of cards) {
var suit = get.suit(i);
if (!map[suit]) map[suit] = [];
map[suit].push(i);
}
var dialog = ["选择获得一种花色的所有牌"];
for (var suit of lib.suit) {
if (map[suit]) {
var targetsx = map[suit].map(function (card) {
return targets[cards.indexOf(card)];
});
dialog.push('' + get.translation(targetsx) + "
");
dialog.push(map[suit]);
list.push(suit);
}
}
if (list.length)
player
.chooseControl(list, "cancel2")
.set("dialog", dialog)
.set("list", list)
.set("map", map)
.set("ai", function () {
let max = 0,
res = "cancel2";
for (let s of _status.event.list) {
let temp = 0;
for (let i of _status.event.map[s]) {
temp +=
get.value(i, _status.event.player) +
get.sgn(get.attitude(_status.event.player, get.owner(i))) *
(6 - get.value(i, get.owner(i)));
}
for (let i in _status.event.map) {
if (i === s) continue;
for (let j of _status.event.map[i]) {
temp -=
get.sgn(get.attitude(_status.event.player, get.owner(j))) *
get.value(j, get.owner(j));
}
}
if (temp > max) {
res = s;
max = temp;
}
}
return res;
});
else event.finish();
"step 3";
if (result.control != "cancel2") {
event.cards2 = cards.filter(function (i) {
return get.suit(i) == result.control;
});
for (var i = 0; i < cards.length; i++) {
if (event.cards2.includes(cards[i])) {
targets[i].$give(cards[i], player, false);
}
}
player.gain(event.cards2, "log");
} else event.finish();
"step 4";
var draws = [];
for (var i = 0; i < cards.length; i++) {
if (!event.cards2.includes(cards[i])) {
targets[i].discard(cards[i]).delay = false;
} else draws.push(targets[i]);
}
if (draws.length) game.asyncDraw(draws);
"step 5";
game.delayx();
},
ai: {
order: 7,
result: {
player: 0.3,
target: -1,
},
},
},
//邓芝
jianliang: {
audio: 2,
trigger: { player: "phaseDrawBegin2" },
filter: function (event, player) {
return !player.isMaxHandcard();
},
direct: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt("jianliang"), "令至多两名角色各摸一张牌", [1, 2])
.set("ai", function (target) {
return (
Math.sqrt(5 - Math.min(4, target.countCards("h"))) *
get.attitude(_status.event.player, target)
);
});
"step 1";
if (result.bool) {
var targets = result.targets.sortBySeat();
player.logSkill("jianliang", targets);
if (targets.length == 1) {
targets[0].draw();
event.finish();
} else game.asyncDraw(targets);
} else event.finish();
"step 2";
game.delayx();
},
},
weimeng: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return player.hp > 0 && target != player && target.countGainableCards(player, "h") > 0;
},
content: function () {
"step 0";
player.gainPlayerCard(target, "h", true, [1, player.hp]);
"step 1";
if (result.bool && target.isIn()) {
var num = result.cards.length,
hs = player.getCards("he");
var numx = 0;
for (var i of result.cards) numx += get.number(i, player);
event.num = numx;
event.cards = result.cards;
if (!hs.length) event.finish();
else if (hs.length <= num) event._result = { bool: true, cards: hs };
else
player.chooseCard(
"he",
true,
"选择交给" + get.translation(target) + get.cnNumber(num) + "张牌",
"(已得到牌的点数和:" + numx + ")",
num
);
} else event.finish();
"step 2";
player.give(result.cards, target);
var numx = 0;
for (var i of result.cards) numx += get.number(i, player);
if (numx > num) player.draw();
else if (numx < num) player.discardPlayerCard(target, true, "hej");
},
ai: {
order: 6,
tag: {
lose: 1,
loseCard: 1,
gain: 1,
},
result: {
target: function (player, target) {
return -Math.pow(Math.min(player.hp, target.countCards("h")), 2) / 4;
},
},
},
},
//冯熙
yusui: {
audio: 2,
trigger: { target: "useCardToTargeted" },
filter: function (event, player) {
return event.player != player && event.player.isIn() && get.color(event.card) == "black";
},
logTarget: "player",
check: function (event, player) {
var target = event.player;
if (player.hp < 3 || get.attitude(player, target) > -3) return false;
if (player.hp < target.hp) return true;
if (Math.min(target.countCards("h") - player.countCards("h"), target.countCards("h")) > 3)
return true;
return false;
},
preHidden: true,
content: function () {
"step 0";
player.loseHp();
event.target = trigger.player;
"step 1";
event.addIndex = 0;
var list = [],
num = target.countCards("h") - player.countCards("h");
event.num = num;
if (num > 0 && target.countCards("h") > 0)
list.push("令其弃置" + get.cnNumber(num) + "张手牌");
else event.addIndex++;
if (target.hp > player.hp)
list.push("令其失去" + get.cnNumber(target.hp - player.hp) + "点体力");
if (!list.length) event.finish();
else if (list.length == 1) event._result = { index: 0 };
else
player
.chooseControl()
.set("choiceList", list)
.set("prompt", "令" + get.translation(target) + "执行一项")
.set("ai", function () {
var player = _status.event.player,
target = _status.event.getParent().target;
return target.hp - player.hp >
Math.min(_status.event.getParent().num, target.countCards("h")) / 2
? 1
: 0;
});
"step 2";
if (result.index + event.addIndex == 0) target.chooseToDiscard(num, true, "h");
else target.loseHp(target.hp - player.hp);
},
},
boyan: {
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return target != player;
},
content: function () {
"step 0";
target.drawTo(Math.min(5, target.maxHp));
"step 1";
target.addTempSkill("boyan_block");
},
subSkill: {
block: {
mark: true,
intro: { content: "不能使用或打出手牌" },
charlotte: true,
mod: {
cardEnabled2: function (card) {
if (get.position(card) == "h") return false;
},
},
},
},
ai: {
order: 4,
result: {
target: function (player, target) {
if (get.attitude(player, target) > 0)
return Math.max(0, Math.min(5, target.maxHp) - target.countCards("h"));
if (
Math.max(0, Math.min(5, target.maxHp) - target.countCards("h")) <= 1 &&
target.countCards("h", "shan") &&
!target.hasSkillTag("respondShan", true, null, true) &&
player.countCards("h", function (card) {
return (
get.tag(card, "respondShan") &&
player.getUseValue(card, null, true) > 0 &&
get.effect(target, card, player, player) > 0
);
})
)
return -2;
},
},
},
},
//祢衡
rekuangcai: {
audio: 2,
forced: true,
trigger: { player: "phaseDiscardBegin" },
filter: function (event, player) {
return !player.getHistory("useCard").length || !player.getHistory("sourceDamage").length;
},
content: function () {
lib.skill.rekuangcai.change(player, player.getHistory("useCard").length ? -1 : 1);
},
mod: {
targetInRange: function (card, player) {
if (player == _status.currentPhase) return true;
},
cardUsable: function (card, player) {
if (player == _status.currentPhase) return Infinity;
},
},
change: function (player, num) {
if (typeof player.storage.rekuangcai_change != "number")
player.storage.rekuangcai_change = 0;
player.storage.rekuangcai_change += num;
player.addSkill("rekuangcai_change");
},
group: "rekuangcai_draw",
subSkill: {
draw: {
audio: "rekuangcai",
trigger: { player: "phaseJieshuBegin" },
forced: true,
filter: function (event, player) {
return player.getHistory("sourceDamage").length > 0;
},
content: function () {
player.draw(Math.min(5, player.getStat("damage")));
},
},
change: {
mod: {
maxHandcard: function (player, num) {
if (typeof player.storage.rekuangcai_change == "number")
return num + player.storage.rekuangcai_change;
},
},
charlotte: true,
mark: true,
intro: {
content: (num) => "手牌上限" + (num < 0 ? "" : "+") + num,
},
},
},
},
reshejian: {
audio: 2,
trigger: { target: "useCardToTargeted" },
filter: function (event, player) {
if (player == event.player || event.targets.length != 1) return false;
return player.countCards("h") >= 2;
},
usable: 2,
async cost(event, trigger, player) {
event.result = await player
.chooseToDiscard(
"he",
[2, Infinity],
get.prompt("reshejian", trigger.player),
'弃置至少两张手牌,然后选择一项:
⒈弃置其等量的牌。⒉对其造成1点伤害。
'
)
.set(
"ai",
function (card) {
if (_status.event.goon && ui.selected.cards.length < 2)
return 5.6 - get.value(card);
return 0;
},
"chooseonly"
)
.set(
"goon",
(function () {
var target = trigger.player;
if (get.damageEffect(target, player, player) > 0) return true;
if (
target.countCards("he", function (card) {
return get.value(card, target) > 6;
}) >= 2
)
return true;
return false;
})()
)
.forResult();
},
logTarget: "player",
content: function () {
"step 0";
player.discard(cards);
"step 1";
var num = cards.length;
event.num = num;
var target = targets[0],
str = get.translation(target);
event.target = target;
if (!target.isIn()) event.finish();
else if (
!target.hasCard(function (card) {
return lib.filter.canBeDiscarded(card, player, target);
}, "he")
)
event._result = { index: 1 };
else
player
.chooseControl()
.set("choiceList", [
"弃置" + str + "的" + get.cnNumber(num) + "张牌",
"对" + str + "造成1点伤害",
])
.set("ai", function () {
var player = _status.event.player;
var eff0 =
get.effect(target, { name: "guohe_copy2" }, player, player) *
Math.min(1.7, target.countCards("he"));
var eff1 = get.damageEffect(target, player, player);
return eff0 > eff1 ? 0 : 1;
});
"step 2";
if (result.index == 0) player.discardPlayerCard(target, num, true, "he");
else target.damage();
},
},
//陈登
refuyuan: {
audio: 2,
trigger: { global: "useCardToTargeted" },
logTarget: "target",
filter: function (event, player) {
return (
event.card.name == "sha" &&
event.target.isIn() &&
!game.hasPlayer2(function (current) {
return current.hasHistory("useCard", function (evt) {
return (
evt.card != event.card &&
get.color(evt.card, false) == "red" &&
evt.targets &&
evt.targets.includes(event.target)
);
});
})
);
},
check: function (event, player) {
return get.attitude(player, event.target) > 0;
},
content: function () {
trigger.target.draw();
},
},
reyingshui: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return (
player.countCards("he") > 0 && game.hasPlayer((current) => player.inRange(current))
);
},
position: "he",
filterCard: true,
filterTarget: function (card, player, target) {
return player.inRange(target);
},
discard: false,
lose: false,
delay: false,
check: function (card) {
if (get.type(card) == "equip") return 3 - get.value(card);
return 6.5 - get.value(card);
},
content: function () {
"step 0";
player.give(cards, target);
"step 1";
var next = target.chooseCard(
"he",
[2, Infinity],
"交给" + get.translation(player) + "至少两张装备牌,否则受到1点伤害",
{ type: "equip" }
);
if (get.damageEffect(target, player, target) >= 0) next.set("ai", () => -1);
else next.set("ai", (card) => (ui.selected.cards.length < 2 ? 6 - get.value(card) : 0));
"step 2";
if (result.bool) target.give(result.cards, player);
else target.damage("nocard");
},
ai: {
order: 5,
tag: {
damage: 0.5,
},
result: {
target: -1.5,
},
},
},
rewangzu: {
audio: 2,
trigger: { player: "damageBegin1" },
filter: function (event, player) {
return (
event.source &&
player != event.source &&
player.hasCard((card) => lib.filter.cardDiscardable(card, player, "rewangzu"), "h")
);
},
usable: 1,
async cost(event, trigger, player) {
var num = player.getFriends().length;
if (
!game.hasPlayer(function (current) {
return current != player && current.getFriends().length > num;
})
) {
event.result = await player
.chooseToDiscard(
"h",
get.prompt("rewangzu"),
"弃置一张牌并令伤害-1",
"chooseonly"
)
.set("ai", function (card) {
return 7 - get.value(card);
})
.forResult();
} else {
event.result = await player.chooseBool(get.prompt("rewangzu"), "随机弃置一张牌并令伤害-1").forResult();
}
},
async content(event, trigger, player) {
trigger.num--;
if (!event.cards || !event.cards.length) {
const cards = player.getCards("h", (card) =>
lib.filter.cardDiscardable(card, player, "rewangzu")
);
if (cards.length) player.discard(cards.randomGet());
} else {
player.discard(event.cards);
}
},
},
//万年公主
zhenge: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
direct: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt("zhenge"), "令一名角色的攻击范围+1")
.set("ai", function (target) {
var player = _status.event.player,
att = get.attitude(player, target);
if (att > 0) {
if (!target.hasMark("zhenge_effect")) att *= 1.5;
if (
!game.hasPlayer(function (current) {
return get.distance(target, current, "attack") > 2;
})
) {
var usf = Math.max.apply(
Math,
game.filterPlayer().map(function (current) {
if (target.canUse("sha", current, false))
return get.effect(current, { name: "sha" }, target, player);
return 0;
})
);
return att + usf;
}
return att;
}
return 0;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("zhenge", target);
target.addSkill("zhenge_effect");
if (target.countMark("zhenge_effect") < 5) target.addMark("zhenge_effect", 1, false);
if (
!game.hasPlayer(function (current) {
return current != target && !target.inRange(current);
})
) {
player
.chooseTarget(
"是否令" + get.translation(target) + "视为对另一名角色使用【杀】?",
function (card, player, target) {
return _status.event.source.canUse("sha", target);
}
)
.set("source", target)
.set("ai", function (target) {
var evt = _status.event;
return get.effect(target, { name: "sha" }, evt.source, evt.player);
});
} else {
game.delayx();
event.finish();
}
} else event.finish();
"step 2";
if (result.bool) {
target.useCard({ name: "sha", isCard: true }, result.targets[0], false);
}
"step 3";
game.delayx();
},
subSkill: {
effect: {
charlotte: true,
onremove: true,
mod: {
attackRange: function (player, num) {
return num + player.countMark("zhenge_effect");
},
},
intro: { content: "攻击范围+#" },
},
},
},
xinghan: {
audio: 2,
init: function (player) {
player.addSkill("xinghan_count");
},
onremove: function (player) {
player.removeSkill("xinghan_count");
},
trigger: { global: "damageSource" },
forced: true,
filter: function (event, player) {
return (
event.card &&
event.card == player.storage.xinghan_temp &&
event.source &&
event.source.hasMark("zhenge_effect")
);
},
logTarget: "source",
content: function () {
player.draw(
player.isMaxHandcard(true) ? 1 : Math.min(5, trigger.source.getAttackRange())
);
},
subSkill: {
count: {
trigger: { global: "useCard1" },
forced: true,
charlotte: true,
popup: false,
firstDo: true,
filter: function (event, player) {
return (
event.card.name == "sha" &&
!game.hasPlayer2(function (current) {
return current.hasHistory("useCard", function (evt) {
return evt != event && evt.card.name == "sha";
});
})
);
},
content: function () {
player.addTempSkill("xinghan_temp");
player.storage.xinghan_temp = trigger.card;
},
},
temp: { onremove: true },
},
ai: { combo: "zhenge" },
},
//荀谌
refenglve: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return (
player.countCards("h") > 0 &&
!player.hasSkillTag("noCompareSource") &&
game.hasPlayer(function (current) {
return (
current != player &&
current.countCards("h") > 0 &&
!current.hasSkillTag("noCompareTarget")
);
})
);
},
filterTarget: function (card, player, target) {
return (
target != player &&
target.countCards("h") > 0 &&
!target.hasSkillTag("noCompareTarget")
);
},
content: function () {
"step 0";
player.chooseToCompare(target);
"step 1";
if (result.bool) {
if (!target.countCards("hej")) event.finish();
else {
// event.giver = target;
// event.gainner = player;
player.gainPlayerCard(
target,
true,
"hej",
2,
"获得" + get.translation(target) + "区域里的两张牌"
);
}
} else if (result.tie) {
delete player.getStat("skill").refenglve;
if (get.position(result.player, true) == "d") player.gain(result.player, "gain2");
// event.finish();
} else {
if (get.position(result.player, true) == "d") target.gain(result.player, "gain2");
// event.finish();
/*if(!player.countCards('he')) event.finish();
else{
event.giver=player;
event.gainner=target;
player.chooseCard(true,'he','交给'+get.translation(target)+'一张牌');
}*/
}
"step 2";
// if (result.bool) event.giver.give(result.cards, event.gainner);
},
ai: {
order: 8,
result: {
target: function (player, target) {
if (
!player.hasCard(function (card) {
if (get.position(card) != "h") return false;
var val = get.value(card);
if (val < 0) return true;
if (val <= 5) {
return card.number >= 11;
}
if (val <= 6) {
return card.number >= 13;
}
return false;
})
)
return 0;
return -Math.sqrt(1 + target.countCards("he")) / (1 + target.countCards("j"));
},
},
},
},
anyong: {
audio: 2,
trigger: { global: "damageSource" },
direct: true,
filter: function (event, player) {
return (
event.source &&
event.source == _status.currentPhase &&
event.num == 1 &&
// event.player != event.source &&
event.player.isIn() &&
player.countCards("he") > 0 &&
event.source
.getHistory("sourceDamage", function (evt) {
return evt.player != event.source;
})
.indexOf(event) == 0
);
},
content: function () {
"step 0";
player
.chooseToDiscard(
"he",
get.prompt("anyong", trigger.player),
"弃置一张牌并对其造成1点伤害"
)
.set("goon", get.damageEffect(trigger.player, player, player) > 0)
.set("ai", function (card) {
if (_status.event.goon) return 7 - get.value(card);
return 0;
}).logSkill = ["anyong", trigger.player];
"step 1";
if (result.bool) trigger.player.damage();
},
},
//刘永
zhuning: {
audio: 2,
enable: "phaseUse",
usable: 2,
filter: function (event, player) {
if (!player.countCards("he")) return false;
return !player.getStat("skill").zhuning || player.hasSkill("zhuning_double");
},
filterCard: true,
position: "he",
filterTarget: lib.filter.notMe,
selectCard: [1, Infinity],
delay: false,
lose: false,
discard: false,
check: function (card) {
if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0;
if (!ui.selected.cards.length && card.name == "du") return 20;
var player = get.owner(card);
if (ui.selected.cards.length >= Math.max(1, player.countCards("h") - player.hp)) return 0;
return 10 - get.value(card);
},
content: function () {
"step 0";
player.give(cards, target).gaintag.add("fengxiang_tag");
"step 1";
var list = [];
for (var name of lib.inpile) {
var type = get.type(name);
if (type != "basic" && type != "trick") continue;
var card = { name: name, isCard: true };
if (get.tag(card, "damage") > 0 && player.hasUseTarget(card)) {
list.push([type, "", name]);
}
if (name == "sha") {
for (var i of lib.inpile_nature) {
card.nature = i;
if (player.hasUseTarget(card)) list.push([type, "", name, i]);
}
}
}
if (list.length) {
player
.chooseButton(["是否视为使用一张伤害牌?", [list, "vcard"]])
.set("ai", function (button) {
return _status.event.player.getUseValue({ name: button.link[2] });
});
} else event.finish();
"step 2";
if (result.bool) {
player.chooseUseTarget(
{ name: result.links[0][2], nature: result.links[0][3], isCard: true },
true,
false
);
} else event.finish();
"step 3";
if (
!player.hasHistory("sourceDamage", function (evt) {
if (!evt.card) return false;
var evtx = evt.getParent("useCard");
return evtx.card == evt.card && evtx.getParent(2) == event;
})
)
player.addTempSkill("zhuning_double");
},
subSkill: {
double: {},
},
ai: {
fireAttack: true,
order: 4,
result: {
target: function (player, target) {
if (target.hasSkillTag("nogain")) return 0;
if (ui.selected.cards.length && ui.selected.cards[0].name == "du") {
if (target.hasSkillTag("nodu")) return 0;
return -10;
}
if (target.hasJudge("lebu")) return 0;
var nh = target.countCards("h");
var np = player.countCards("h");
if (
player.hp == player.maxHp ||
player.storage.rerende < 0 ||
player.countCards("h") <= 1
) {
if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0;
}
return Math.max(1, 5 - nh);
},
},
},
},
fengxiang: {
getMax: function (event) {
var max = 0,
max2 = null,
players = game.filterPlayer();
for (var current of players) {
var num = 0,
cards = current.getCards("h", function (card) {
return card.hasGaintag("fengxiang_tag");
});
if (event) {
if (event.name == "gain" && event.gaintag.includes("fengxiang_tag"))
cards.removeArray(event.cards);
var evt = event.getl(current);
if (evt && evt.gaintag_map) {
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("fengxiang_tag")) num++;
}
}
}
num += cards.length;
if (num > max) {
max = num;
max2 = current;
} else if (num == max) max2 = null;
}
return max2;
},
audio: 2,
init: function (player) {
game.addGlobalSkill("fengxiang_use");
},
onremove: function (player) {
if (!game.hasPlayer((current) => current.hasSkill("fengxiang"), true))
game.removeGlobalSkill("fengxiang_use");
},
trigger: { player: "damageEnd" },
forced: true,
filter: function (event, player) {
var target = lib.skill.fengxiang.getMax();
return !target || target.isDamaged();
},
logTarget: function (event, player) {
return lib.skill.fengxiang.getMax() || player;
},
content: function () {
var target = lib.skill.fengxiang.getMax();
if (target) target.recover();
else player.draw();
},
group: "fengxiang_draw",
subSkill: {
draw: {
trigger: {
global: [
"equipAfter",
"addJudgeAfter",
"loseAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
forced: true,
filter: function (event, player) {
if (event.name == "lose" && event.getlx === false) return false;
return lib.skill.fengxiang.getMax() != lib.skill.fengxiang.getMax(event);
},
content: function () {
if (trigger.delay === false) game.delayx();
player.draw();
},
},
use: {
mod: {
aiOrder: function (player, card, num) {
if (
num > 0 &&
get.itemtype(card) === "card" &&
card.hasGaintag("fengxiang_tag") &&
game.hasPlayer((current) => {
return (
current.hasSkill("fengxiang") && get.attitude(player, current) > 0
);
})
)
return num + 10;
},
},
trigger: { player: "dieAfter" },
filter: function (event, player) {
return !game.hasPlayer((current) => current.hasSkill("fengxiang"), true);
},
silent: true,
forceDie: true,
charlotte: true,
content: function () {
game.removeGlobalSkill("fengxiang_use");
},
},
},
},
//阚泽
rekuanshi: {
audio: "kuanshi",
trigger: { player: "phaseJieshuBegin" },
direct: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("rekuanshi"))
.set("animate", false)
.set("ai", function (target) {
var att = get.attitude(player, target);
if (target.hp < 3) att /= 1.5;
return att;
});
"step 1";
if (result.bool) {
player.logSkill("rekuanshi");
player.addTempSkill("rekuanshi_effect", { player: "phaseBegin" });
player.storage.rekuanshi_effect = result.targets[0];
game.delayx();
}
},
subSkill: {
effect: {
audio: "kuanshi",
mark: true,
intro: {
content: "每回合限一次,当$于一回合内受到第2点伤害后,其回复1点体力。",
},
trigger: { global: "damageEnd" },
forced: true,
charlotte: true,
logTarget: "player",
usable: 1,
filter: function (event, player) {
if (event.player != player.storage.rekuanshi_effect || event.player.isHealthy())
return false;
var history = event.player.getHistory("damage", null, event),
num = 0;
for (var i of history) num += i.num;
return num > 1 && num - event.num < 2;
},
content: function () {
trigger.player.recover();
},
},
},
},
//吕玲绮
guowu: {
trigger: { player: "phaseUseBegin" },
filter: function (event, player) {
return player.countCards("h") > 0;
},
preHidden: true,
content: function () {
"step 0";
var hs = player.getCards("h");
player.showCards(hs, get.translation(player) + "发动了【帼舞】");
var list = [];
for (var i of hs) {
list.add(get.type2(i, player));
if (list.length >= 3) break;
}
if (list.length >= 1) {
var card = get.discardPile(function (i) {
return i.name == "sha";
});
if (card) player.gain(card, "gain2");
}
if (list.length >= 2) player.addTempSkill("guowu_dist", "phaseUseAfter");
if (list.length >= 3) player.addTempSkill("guowu_add", "phaseUseAfter");
},
subSkill: {
dist: {
charlotte: true,
mod: { targetInRange: () => true },
},
add: {
charlotte: true,
trigger: { player: "useCard1" },
direct: true,
filter: function (event, player) {
var info = get.info(event.card, false);
if (info.allowMultiple == false) return false;
if (event.card.name != "sha" && (info.type != "trick" || get.mode() == "guozhan"))
return false;
if (event.targets && !info.multitarget) {
if (
game.hasPlayer(function (current) {
return (
!event.targets.includes(current) &&
lib.filter.targetEnabled2(event.card, player, current) &&
lib.filter.targetInRange(event.card, player, current)
);
})
) {
return true;
}
}
return false;
},
content: function () {
"step 0";
var num = game.countPlayer(function (current) {
return (
!trigger.targets.includes(current) &&
lib.filter.targetEnabled2(trigger.card, player, current) &&
lib.filter.targetInRange(trigger.card, player, current)
);
});
player
.chooseTarget(
"帼舞:是否为" +
get.translation(trigger.card) +
"增加" +
(num > 1 ? "至多两个" : "一个") +
"目标?",
[1, Math.min(2, num)],
function (card, player, target) {
var trigger = _status.event.getTrigger();
var card = trigger.card;
return (
!trigger.targets.includes(target) &&
lib.filter.targetEnabled2(card, player, target) &&
lib.filter.targetInRange(card, player, target)
);
}
)
.set("ai", function (target) {
var player = _status.event.player;
var card = _status.event.getTrigger().card;
return get.effect(target, card, player, player);
});
"step 1";
if (result.bool) {
if (player != game.me && !player.isOnline()) game.delayx();
} else event.finish();
"step 2";
var targets = result.targets.sortBySeat();
player.logSkill("guowu_add", targets);
trigger.targets.addArray(targets);
//if(get.mode()=='guozhan') player.removeSkill('guowu_add');
},
},
},
},
zhuangrong: {
derivation: ["llqshenwei", "wushuang"],
trigger: { global: "phaseEnd" },
forced: true,
juexingji: true,
skillAnimation: true,
animationColor: "gray",
filter: function (event, player) {
return player.hp == 1 || player.countCards("h") == 1;
},
content: function () {
"step 0";
player.awakenSkill("zhuangrong");
player.loseMaxHp();
"step 1";
if (player.maxHp > player.hp) player.recover(player.maxHp - player.hp);
"step 2";
player.drawTo(Math.min(5, player.maxHp));
player.addSkills(["llqshenwei", "wushuang"]);
},
},
llqshenwei: {
audio: 2,
trigger: { player: "phaseDrawBegin2" },
forced: true,
filter: (event) => !event.numFixed,
content: function () {
trigger.num += 2;
},
mod: {
maxHandcard: (player, num) => num + 2,
},
},
cuijian: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return game.hasPlayer((current) => lib.skill.cuijian.filterTarget(null, player, current));
},
filterTarget: function (card, player, target) {
return target != player && target.countCards("h") > 0;
},
content: function () {
"step 0";
var hs = target.getCards("h", "shan");
if (hs.length) {
hs.addArray(
target.getCards("he", function (card) {
return get.subtype(card) == "equip2";
})
);
player.gain(hs, target, "give", "bySelf");
if (player.hasMark("zhtongyuan_basic")) event.finish();
else event.num = hs.length;
} else {
if (player.hasMark("zhtongyuan_trick")) player.draw(2);
event.finish();
}
"step 1";
var hs = player.getCards("he");
if (!hs.length || !target.isIn()) event.finish();
else if (hs.length <= num) event._result = { bool: true, cards: hs };
else
player.chooseCard(
"he",
true,
"选择交给" + get.translation(target) + get.cnNumber(num) + "张牌",
num
);
"step 2";
if (result.bool && result.cards && result.cards.length) player.give(result.cards, target);
},
ai: {
order: 4,
result: {
player: function (player, target) {
if (!target.countCards("h", "shan"))
return player.hasMark("zhtongyuan_trick") ? 2 : 0;
return 0;
},
target: function (player, target) {
if (target.countCards("h", "shan")) {
var num = -target.countCards("h") / 2;
var card = target.getEquip(2);
if (card) num -= get.value(card, target) / 2;
return num;
}
return -0.01;
},
},
},
},
tongyuan: { audio: 2 },
zhtongyuan: {
audio: "tongyuan",
trigger: { player: ["useCardAfter", "respondAfter"] },
forced: true,
filter: function (event, player) {
var type = get.type2(event.card, false);
return (
(type == "basic" || type == "trick") &&
get.color(event.card, false) == "red" &&
!player.hasMark("zhtongyuan_" + type)
);
},
content: function () {
var type = get.type2(trigger.card, false);
if (!player.hasMark("zhtongyuan_" + type)) {
player.addMark("zhtongyuan_" + type, 1, false);
game.log(player, "修改了技能", "#g【摧坚】");
}
},
group: ["zhtongyuan_basic", "zhtongyuan_trick"],
subSkill: {
basic: {
trigger: { player: "useCard2" },
direct: true,
locked: true,
filter: function (event, player) {
if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick"))
return false;
var card = event.card;
if (get.color(card, false) != "red" || get.type(card, null, true) != "basic")
return false;
var info = get.info(card);
if (info.allowMultiple == false) return false;
if (event.targets && !info.multitarget) {
if (
game.hasPlayer(function (current) {
return (
!event.targets.includes(current) &&
lib.filter.targetEnabled2(card, player, current)
);
})
) {
return true;
}
}
return false;
},
content: function () {
"step 0";
var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
player
.chooseTarget(get.prompt("zhtongyuan"), function (card, player, target) {
var player = _status.event.player;
return (
!_status.event.targets.includes(target) &&
lib.filter.targetEnabled2(_status.event.card, player, target)
);
})
.set("prompt2", prompt2)
.set("ai", function (target) {
var trigger = _status.event.getTrigger();
var player = _status.event.player;
return get.effect(target, trigger.card, player, player);
})
.set("card", trigger.card)
.set("targets", trigger.targets);
"step 1";
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
"step 2";
if (event.targets) {
player.logSkill("zhtongyuan", event.targets);
trigger.targets.addArray(event.targets);
}
},
},
trick: {
audio: "zhtongyuan",
trigger: { player: "useCard" },
forced: true,
filter: function (event, player) {
if (!player.hasMark("zhtongyuan_basic") || !player.hasMark("zhtongyuan_trick"))
return false;
var card = event.card;
return get.color(card, false) == "red" && get.type(card, null, false) == "trick";
},
content: function () {
trigger.directHit.addArray(game.filterPlayer());
game.log(trigger.card, "不可被响应");
},
},
},
},
//陆郁生
zhente: {
audio: 2,
trigger: { target: "useCardToTargeted" },
logTarget: "player",
usable: 1,
preHidden: true,
filter: function (event, player) {
var color = get.color(event.card);
if (
player == event.player ||
event.player.isDead() ||
color == "none" ||
(get.mode() == "guozhan" && color != "black")
)
return false;
var type = get.type(event.card);
return type == "basic" || type == "trick";
},
check: function (event, player) {
return (
!event.excluded.includes(player) &&
get.effect(player, event.card, event.player, player) < 0
);
},
content: function () {
"step 0";
trigger.player
.chooseControl()
.set("choiceList", [
"本回合内不能再使用" + get.translation(get.color(trigger.card)) + "牌",
"令" + get.translation(trigger.card) + "对" + get.translation(player) + "无效",
])
.set("prompt", get.translation(player) + "发动了【贞特】,请选择一项")
.set("ai", function () {
var player = _status.event.player;
var target = _status.event.getParent().player;
var card = _status.event.getTrigger().card,
color = get.color(card);
if (get.effect(target, card, player, player) <= 0) return 1;
var hs = player.countCards("h", function (card) {
return (
get.color(card, player) == color &&
player.hasValueTarget(card, null, true)
);
});
if (!hs.length) return 0;
if (hs > 1) return 1;
return Math.random() > 0.5 ? 0 : 1;
});
"step 1";
if (result.index == 0) {
trigger.player.addTempSkill("zhente2");
trigger.player.storage.zhente2.add(get.color(trigger.card));
trigger.player.markSkill("zhente2");
} else trigger.excluded.add(player);
},
},
zhente2: {
mod: {
cardEnabled(card, player) {
const color = get.color(card);
if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false;
},
cardSavable(card, player) {
const color = get.color(card);
if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false;
},
},
charlotte: true,
onremove: true,
init: function (player, skill) {
if (!player.storage[skill]) player.storage[skill] = [];
},
intro: { content: "本回合内不能使用$牌" },
},
zhiwei: {
audio: 2,
trigger: {
player: ["enterGame", "showCharacterAfter", "phaseBegin"],
global: ["phaseBefore"],
},
direct: true,
filter: function (event, player, name) {
if (player.hasSkill("zhiwei2")) return false;
if (!game.hasPlayer((current) => current != player)) return false;
if (get.mode() == "guozhan")
return (
event.name == "showCharacter" &&
(event.toShow.includes("gz_luyusheng") || event.toShow.includes("luyusheng"))
);
return event.name != "showCharacter" && (name != "phaseBefore" || game.phaseNumber == 0);
},
content: function () {
"step 0";
player
.chooseTarget(
"请选择【至微】的目标",
"选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。",
true,
lib.filter.notMe
)
.set("ai", function (target) {
var att = get.attitude(_status.event.player, target);
if (att > 0) return 1 + att;
return Math.random();
});
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("zhiwei", target);
player.storage.zhiwei2 = target;
player.addSkill("zhiwei2");
}
},
},
zhiwei2: {
group: ["zhiwei2_draw", "zhiwei2_discard", "zhiwei2_gain", "zhiwei2_clear"],
charlotte: true,
onremove: true,
mark: "character",
intro: {
content: "$造成伤害后你摸一张牌;$受到伤害后你弃置一张牌;你于弃牌阶段弃置牌后交给$",
},
subSkill: {
draw: {
audio: "zhiwei",
trigger: { global: "damageSource" },
forced: true,
filter: function (event, player) {
return event.source == player.storage.zhiwei2;
},
logTarget: "source",
content: function () {
player.draw();
},
},
discard: {
audio: "zhiwei",
trigger: { global: "damageEnd" },
forced: true,
filter: function (event, player) {
return (
event.player == player.storage.zhiwei2 &&
player.countCards("h", function (card) {
return lib.filter.cardDiscardable(card, player, "zhiwei2_discard");
})
);
},
logTarget: "player",
content: function () {
player.discard(
player
.getCards("h", function (card) {
return lib.filter.cardDiscardable(card, player, "zhiwei2_discard");
})
.randomGet()
);
},
},
gain: {
audio: "zhiwei",
trigger: {
player: "loseAfter",
global: "loseAsyncAfter",
},
forced: true,
filter: function (event, player) {
if (
event.type != "discard" ||
event.getlx === false ||
event.getParent("phaseDiscard").player != player ||
!player.storage.zhiwei2 ||
!player.storage.zhiwei2.isIn()
)
return false;
var evt = event.getl(player);
return evt && evt.cards2.filterInD("d").length > 0;
},
logTarget: function (event, player) {
return player.storage.zhiwei2;
},
content: function () {
if (trigger.delay === false) game.delay();
player.storage.zhiwei2.gain(trigger.getl(player).cards2.filterInD("d"), "gain2");
},
},
clear: {
audio: "zhiwei",
trigger: {
global: "die",
player: ["hideCharacterEnd", "removeCharacterEnd"],
},
forced: true,
filter: function (event, player) {
if (event.name == "die") return event.player == player.storage.zhiwei2;
if (event.name == "removeCharacter")
return event.toRemove == "luyusheng" || event.toRemove == "gz_luyusheng";
return event.toHide == "luyusheng" || event.toHide == "gz_luyusheng";
},
content: function () {
"step 0";
player.removeSkill("zhiwei2");
if (trigger.name != "die" || get.mode() != "guozhan") event.finish();
"step 1";
if (player.name1 == "gz_luyusheng" || player.name1 == "luyusheng")
player.hideCharacter(0);
if (player.name2 == "gz_luyusheng" || player.name2 == "luyusheng")
player.hideCharacter(1);
},
},
},
},
//华歆
spwanggui: {
audio: "wanggui",
trigger: { source: "damageSource" },
usable: 1,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current.group != player.group;
});
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt("spwanggui"),
"对一名势力不同的其他角色造成1点伤害",
function (card, player, target) {
return target.group != player.group;
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.damageEffect(target, player, player);
})
.forResult();
},
async content(event, trigger, player) {
const target = event.targets[0];
target.damage();
},
group: "spwanggui_draw",
subSkill: {
draw: {
trigger: { player: "damageEnd" },
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt("spwanggui"),
"令自己摸一张牌,或和一名势力相同的其他角色各摸一张牌",
function (card, player, target) {
return target.group == player.group;
}
)
.set("ai", function (target) {
var player = _status.event.player,
att = get.attitude(player, target);
if (target != player) att *= 2;
if (target.hasSkillTag("nogain")) att /= 1.7;
return att;
})
.forResult();
},
content: function () {
"step 0";
var target = targets[0];
if (player == target) {
player.draw();
event.finish();
} else {
var list = [player, target].sortBySeat();
game.asyncDraw(list);
}
"step 1";
game.delayx();
},
},
},
},
wanggui: {
audio: 2,
trigger: {
player: "damageEnd",
source: "damageSource",
},
direct: true,
filter: function (event, player) {
return player.hasSkill("wanggui") && !player.hasSkill("wanggui2");
},
preHidden: true,
content: function () {
"step 0";
player.addTempSkill("wanggui2");
var bool = player.isUnseen(2);
if (bool) {
player
.chooseTarget(
"望归:是否对一名势力不同的角色造成1点伤害?",
function (card, player, target) {
return target.isEnemyOf(player);
}
)
.set("ai", function (target) {
var player = _status.event.player;
return get.damageEffect(target, player, player);
})
.setHiddenSkill("wanggui");
} else event.goto(2);
"step 1";
if (result.bool) {
var target = result.targets[0];
player.logSkill("wanggui", target);
target.damage();
}
event.finish();
"step 2";
player
.chooseBool("望归:是否令所有与自己势力相同的角色各摸一张牌?")
.setHiddenSkill("wanggui");
"step 3";
if (result.bool) {
var targets = game.filterPlayer(function (current) {
return current.isFriendOf(player);
});
targets.sortBySeat();
player.logSkill("wanggui", targets);
game.asyncDraw(targets);
} else event.finish();
"step 4";
game.delayx();
},
},
wanggui2: {},
xibing: {
audio: 2,
trigger: { global: "useCardToPlayered" },
filter: function (event, player) {
if (
player == event.player ||
event.targets.length != 1 ||
event.player.countCards("h") >= event.player.hp
)
return false;
var bool = function (card) {
return (
(card.name == "sha" || get.type(card, false) == "trick") &&
get.color(card, false) == "black"
);
};
if (!bool(event.card)) return false;
var evt = event.getParent("phaseUse");
if (evt.player != event.player) return false;
return (
get.mode() != "guozhan" ||
event.player.getHistory("useCard", function (evtx) {
return bool(evtx.card) && evtx.getParent("phaseUse") == evt;
})[0] == event.getParent()
);
},
logTarget: "player",
check: function (event, player) {
var target = event.player;
var att = get.attitude(player, target);
var num2 = Math.min(5, target.hp) - target.countCards("h");
if (num2 <= 0) return att <= 0;
var num = target.countCards("h", function (card) {
return target.hasValueTarget(card, null, true);
});
if (!num) return att > 0;
return (num - num2) * att < 0;
},
preHidden: true,
content: function () {
"step 0";
var num = Math.min(5, trigger.player.hp) - trigger.player.countCards("h");
if (num > 0) trigger.player.draw(num);
"step 1";
trigger.player.addTempSkill("xibing2");
player._xibing = true;
if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2))
event.finish();
"step 2";
var target = trigger.player;
var players1 = [player.name1, player.name2];
var players2 = [target.name1, target.name2];
player
.chooseButton(2, [
"是否暗置自己和" + get.translation(target) + "的各一张武将牌?",
'你的武将牌
',
[players1, "character"],
'' + get.translation(target) + "的武将牌
",
[players2, "character"],
])
.set("players", players1)
.set("complexSelect", true)
.set("filterButton", function (button) {
return (
!get.is.jun(button.link) &&
(ui.selected.buttons.length == 0) ==
_status.event.players.includes(button.link)
);
});
"step 3";
if (result.bool) {
var target = trigger.player;
player.hideCharacter(player.name1 == result.links[0] ? 0 : 1);
target.hideCharacter(target.name1 == result.links[1] ? 0 : 1);
player.addTempSkill("xibing3");
target.addTempSkill("xibing3");
}
},
},
xibing2: {
mod: {
cardEnabled2: function (card) {
if (get.position(card) == "h") return false;
},
},
},
xibing3: {
ai: { nomingzhi: true },
},
//小虎
remeibu: {
audio: "meibu",
trigger: {
global: "phaseUseBegin",
},
filter: function (event, player) {
return (
event.player != player &&
event.player.isIn() &&
event.player.inRange(player) &&
player.countCards("he") > 0
);
},
direct: true,
derivation: ["rezhixi"],
checkx: function (event, player) {
if (get.attitude(player, event.player) >= 0) return false;
return event.player.countCards("h") > event.player.hp;
},
content: function () {
"step 0";
var check = lib.skill.new_meibu.checkx(trigger, player);
player
.chooseToDiscard(get.prompt2("remeibu", trigger.player), "he")
.set("ai", function (card) {
if (_status.event.check) return 6 - get.value(card);
return 0;
})
.set("check", check)
.set("logSkill", ["remeibu", trigger.player]);
"step 1";
if (result.bool) {
var target = trigger.player;
var card = result.cards[0];
player.line(target, "green");
player.markAuto("remeibu_gain", [get.suit(card, player)]);
player.addTempSkill("remeibu_gain");
target.addTempSkills("rezhixi", "phaseUseEnd");
}
},
ai: {
expose: 0.2,
},
subSkill: {
gain: {
trigger: { global: "loseAfter" },
forced: true,
charlotte: true,
popup: false,
onremove: true,
filter: function (event, player) {
return (
event.getParent(3).name == "rezhixi" &&
player
.getStorage("remeibu_gain")
.includes(get.suit(event.cards[0], event.player)) &&
get.position(event.cards[0]) == "d"
);
},
content: function () {
player.gain(trigger.cards[0], "gain2");
},
},
},
},
remumu: {
audio: "mumu",
trigger: {
player: "phaseUseBegin",
},
direct: true,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current.countCards("e") > 0;
});
},
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("remumu"), function (card, player, target) {
return target.countCards("e") > 0;
})
.set("ai", function (target) {
var player = _status.event.player,
att = get.attitude(player, target),
es = target.getCards("e"),
val = 0;
for (var i of es) {
var eff = -(get.value(i, target) - 0.1) * att;
if (eff > val) val = eff;
}
return eff;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("remumu", target);
if (player == target) event._result = { index: 1 };
else {
var str = get.translation(target);
player
.chooseControl()
.set("choiceList", [
"弃置" + str + "装备区的一张牌且本阶段使用【杀】的次数上限+1",
"获得" + str + "装备区的一张牌且本阶段使用【杀】的次数上限-1",
])
.set("ai", function () {
var player = _status.event.player;
if (
player.countCards("hs", function (card) {
return (
get.name(card, player) == "sha" && player.hasValueTarget(card)
);
}) < Math.max(1, player.getCardUsable("sha"))
)
return 1;
return 0;
});
}
} else event.finish();
"step 2";
if (result.index == 0) {
player.addTempSkill("remumu3", "phaseUseAfter");
player.discardPlayerCard(target, "e", true);
} else {
player.addTempSkill("remumu2", "phaseUseAfter");
player.gainPlayerCard(target, "e", true);
}
},
},
remumu2: {
mod: {
cardUsable: function (card, player, num) {
if (card.name == "sha") return num - 1;
},
},
},
remumu3: {
mod: {
cardUsable: function (card, player, num) {
if (card.name == "sha") return num + 1;
},
},
},
rezhixi: {
trigger: {
player: "useCard",
},
forced: true,
filter: function (event, player) {
return (
(event.card.name == "sha" || get.type(event.card) == "trick") &&
player.countCards("h") > 0
);
},
content: function () {
player.chooseToDiscard("h", true);
},
ai: {
halfneg: true,
nokeep: true
},
},
//董白
relianzhu: {
audio: "lianzhu",
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.countCards("he") > 0;
},
filterCard: true,
discard: false,
lose: false,
delay: false,
position: "he",
filterTarget: lib.filter.notMe,
check: function (card) {
var num = get.value(card);
if (get.color(card) == "black") {
if (num >= 6) return 0;
return 9 - num;
} else {
return 7 - num;
}
},
content: function () {
"step 0";
player.give(cards, target);
"step 1";
if (get.color(cards[0], player) == "red") {
player.draw();
event.finish();
} else {
target
.chooseToDiscard(
"he",
2,
"弃置两张牌,或令" + get.translation(player) + "摸两张牌"
)
.set("goon", get.attitude(target, player) < 0)
.set("ai", function (card) {
if (!_status.event.goon) return -get.value(card);
return 6 - get.value(card);
});
}
"step 2";
if (!result.bool) player.draw(2);
},
ai: {
order: 3,
expose: 0.2,
result: {
target: function (player, target) {
if (ui.selected.cards.length && get.color(ui.selected.cards[0]) == "red") {
if (target.countCards("h") < player.countCards("h")) return 1;
return 0.5;
}
return -1;
},
},
},
},
rexiahui: {
audio: "xiahui",
mod: {
ignoredHandcard: function (card, player) {
if (get.color(card, player) == "black") return true;
},
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && get.color(card, player) == "black") return false;
},
},
trigger: { global: "phaseEnd" },
forced: true,
logTarget: "player",
filter: function (event, player) {
var target = event.player;
return (
target != player &&
target.countCards("h", function (card) {
return card.hasGaintag("rexiahui");
}) == 0 &&
target.getHistory("lose", function (evt) {
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("rexiahui")) return true;
}
}).length > 0
);
},
content: function () {
trigger.player.loseHp();
},
group: "rexiahui_gain",
subSkill: {
gain: {
trigger: { global: "gainEnd" },
forced: true,
popup: false,
filter: function (event, player) {
if (player == event.player) return false;
var evt = event.getl(player);
return (
evt &&
evt.cards2 &&
evt.cards2.filter(function (card) {
return get.color(card, player) == "black";
}).length > 0
);
},
content: function () {
trigger.player.addSkill("rexiahui_block");
var cards = trigger.getl(player).cards2.filter(function (card) {
return get.color(card, player) == "black";
});
trigger.player.addGaintag(cards, "rexiahui");
},
},
block: {
mod: {
cardEnabled2: function (card) {
if (get.itemtype(card) == "card" && card.hasGaintag("rexiahui")) return false;
},
cardDiscardable: function (card) {
if (card.hasGaintag("rexiahui")) return false;
},
},
charlotte: true,
forced: true,
popup: false,
trigger: { player: "changeHp" },
filter: function (event, player) {
return event.num < 0;
},
content: function () {
player.removeSkill("rexiahui_block");
},
onremove: function (player) {
player.removeGaintag("rexiahui");
},
},
},
},
//周善
dcmiyun: {
audio: 2,
trigger: { global: "roundStart" },
forced: true,
direct: true,
group: "dcmiyun_lose",
content: function () {
"step 0";
if (player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")) {
player.chooseCardTarget({
prompt: "密运:将包括“安”在内的任意张手牌交给一名其他角色",
forced: true,
filterTarget: lib.filter.notMe,
selectCard: [1, Infinity],
filterOk: function () {
for (var card of ui.selected.cards) {
if (card.hasGaintag("dcmiyun_tag")) return true;
}
return false;
},
goon: game.hasPlayer(
(current) => player != current && get.attitude(player, current) > 0
),
ai1: function (card) {
if (get.itemtype(card) != "card") return 0;
if (card.hasGaintag("dcmiyun_tag")) return 100;
if (_status.event.goon) return 8 - get.value(card);
return -get.value(card);
},
ai2: function (target) {
return get.attitude(_status.event.player, target);
},
});
} else event.goto(3);
"step 1";
if (result.bool) {
var target = result.targets[0],
cards = result.cards;
player.logSkill("dcmiyun", target);
player.give(cards, target);
} else event.goto(3);
"step 2";
player.drawTo(player.maxHp);
"step 3";
if (
game.hasPlayer(
(current) => current != player && current.countGainableCards(player, "he")
)
) {
player
.chooseTarget(
"密运:获得一名其他角色的一张牌,称为“安”",
true,
(card, player, target) => {
return target != player && target.countGainableCards(player, "he");
}
)
.set("ai", (target) => {
return get.effect(
target,
{ name: "shunshou" },
_status.event.player,
_status.event.player
);
});
} else event.finish();
"step 4";
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcmiyun", target);
player.gainPlayerCard(target, true, "visibleMove").chooseonly = true;
} else event.finish();
"step 5";
if (result.bool) {
player.gain(result.cards).gaintag.add("dcmiyun_tag");
}
},
mod: {
aiValue: function (player, card, num) {
if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag"))
return Math.abs(num) * 10;
},
aiUseful: function () {
return lib.skill.dcmiyun.mod.aiValue.apply(this, arguments);
},
aiOrder: function (player, card, num) {
if (get.itemtype(card) == "card" && card.hasGaintag("dcmiyun_tag")) return 0;
},
},
subSkill: {
lose: {
audio: "dcmiyun",
trigger: {
player: "loseAfter",
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
forced: true,
filter: function (event, player) {
if (event.getParent().name == "dcmiyun") return false;
var evt = event.getl(player);
if (!evt || !evt.cards2 || !evt.cards2.length) return false;
if (event.name == "lose") {
for (var i in event.gaintag_map) {
if (event.gaintag_map[i].includes("dcmiyun_tag")) return true;
}
return false;
}
return player.hasHistory("lose", (evt) => {
if (event != evt.getParent()) return false;
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("dcmiyun_tag")) return true;
}
return false;
});
},
content: function () {
player.loseHp();
},
},
},
},
dcdanying: {
audio: 2,
mod: {
aiOrder: function (player, card, num) {
if (
num <= 0 ||
(card.name !== "sha" && card.name !== "shan") ||
!player.hasCard((i) => i.hasGaintag("dcmiyun_tag"), "h")
)
return;
return Math.max(0.12, num / 25);
},
},
locked: false,
enable: ["chooseToUse", "chooseToRespond"],
usable: 1,
hiddenCard: function (player, name) {
if (
!_status.connectMode &&
!player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")
)
return false;
return name == "sha" || name == "shan";
},
filter: function (event, player) {
if (
event.type == "wuxie" ||
!player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")
)
return false;
for (var name of ["sha", "shan"]) {
if (event.filterCard({ name: name, isCard: true }, player, event)) return true;
}
return false;
},
chooseButton: {
dialog: function (event, player) {
var vcards = [];
for (var name of ["sha", "shan"]) {
var card = { name: name, isCard: true };
if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]);
}
var dialog = ui.create.dialog("胆迎", [vcards, "vcard"], "hidden");
dialog.direct = true;
return dialog;
},
backup: function (links, player) {
return {
filterCard: () => false,
selectCard: -1,
viewAs: {
name: links[0][2],
isCard: true,
},
popname: true,
precontent: function () {
player.logSkill("dcdanying");
player.showCards(
player.getCards("h", (card) => card.hasGaintag("dcmiyun_tag")),
get.translation(player) + "的“安”"
);
player.addTempSkill("dcdanying_discard");
},
};
},
prompt: function (links, player) {
return "展示“安”,然后视为使用【" + get.translation(links[0][2]) + "】";
},
},
ai: {
order: function (item, player) {
var o1 = get.order({ name: "sha" }),
o2 = get.order({ name: "shan" });
if (player.countCards("h") > 3 || player == _status.currentPhase)
return Math.max(o1, o2) + 0.1;
return Math.min(o1, o2) - 0.1;
},
combo: "dcmiyun",
respondSha: true,
respondShan: true,
skillTagFilter: function (player, tag, arg) {
if (!player.hasCard((card) => card.hasGaintag("dcmiyun_tag"), "h")) return false;
},
result: {
player: 1,
},
},
subSkill: {
discard: {
trigger: { target: "useCardToTargeted" },
charlotte: true,
forced: true,
filter: function (event, player) {
return player.countDiscardableCards(event.player, "he");
},
content: function () {
trigger.player.discardPlayerCard(player, "he", true);
player.removeSkill("dcdanying_discard");
},
ai: {
effect: {
target: function (card, player, target) {
if (_status._dcdanying_aiChecking) return;
_status._dcdanying_aiChecking = true;
let eff = get.effect(target, { name: "guohe_copy2" }, player, player);
delete _status._dcdanying_aiChecking;
return [1, get.sgn(eff)];
},
},
},
},
},
},
//蔡阳
dcxunji: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return target != player && !player.getStorage("dcxunji_effect").includes(target);
},
content: function () {
player.markAuto("dcxunji_effect", [target]);
player.addTempSkill("dcxunji_effect", { player: "die" });
target.addTempSkill("dcxunji_mark", { player: "phaseEnd" });
},
ai: {
order: 1,
result: {
player: function (player, target) {
if (player.hp < 2) return 0;
return get.effect(target, { name: "juedou" }, player, player);
},
},
},
subSkill: {
mark: {
mark: true,
marktext: "嫉",
intro: { content: "你已经被盯上了!" },
},
effect: {
audio: "dcxunji",
charlotte: true,
trigger: { global: "phaseJieshuBegin" },
forced: true,
popup: false,
onremove: true,
filter: function (event, player) {
return player.getStorage("dcxunji_effect").includes(event.player);
},
content: function () {
"step 0";
var target = trigger.player;
event.target = target;
if (
target.getHistory("useCard", (evt) => get.color(evt.card) == "black").length >
0 &&
player.canUse("juedou", target)
) {
player.useCard({ name: "juedou", isCard: true }, target, "dcxunji_effect");
}
"step 1";
player.unmarkAuto("dcxunji_effect", [target]);
if (!player.storage.dcxunji_effect.length) player.removeSkill("dcxunji_effect");
},
group: "dcxunji_loseHp",
},
loseHp: {
trigger: { source: "damageSource" },
forced: true,
popup: false,
filter: function (event, player) {
return (
event.card &&
event.card.name == "juedou" &&
event.getParent().skill == "dcxunji_effect" &&
event.player.isIn()
);
},
content: function () {
trigger.player.line(player);
player.damage(trigger.num, trigger.player);
},
},
},
},
dcjiaofeng: {
audio: 2,
trigger: { source: "damageBegin1" },
forced: true,
usable: 1,
filter: function (event, player) {
return player.isDamaged() && !player.getHistory("sourceDamage").length;
},
content: function () {
var num = player.getDamagedHp();
if (num > 0) player.draw();
if (num > 1) trigger.num++;
if (num > 2) player.recover();
},
},
//夏侯杰
liedan: {
audio: 2,
trigger: { global: "phaseZhunbeiBegin" },
forced: true,
filter: function (event, player) {
return (
(player != event.player || player.countMark("liedan") > 4) &&
!player.hasSkill("zhuangdan_mark")
);
},
logTarget: "player",
content: function () {
if (player == trigger.player) {
player.die();
return;
}
var num = 0;
if (player.hp > trigger.player.hp) num++;
if (player.countCards("h") > trigger.player.countCards("h")) num++;
if (player.countCards("e") > trigger.player.countCards("e")) num++;
if (num) {
player.draw(num);
if (num == 3 && player.maxHp < 8) player.gainMaxHp();
} else {
player.addMark("liedan", 1);
player.loseHp();
}
},
intro: { content: "mark" },
},
zhuangdan: {
audio: 2,
trigger: { global: "phaseEnd" },
forced: true,
filter: function (event, player) {
return player != event.player && player.isMaxHandcard(true);
},
content: function () {
player.addTempSkill("zhuangdan_mark", { player: "phaseEnd" });
},
ai: {
combo: "zhuangdan",
},
},
zhuangdan_mark: {
mark: true,
marktext: "胆",
intro: { content: "我超勇的" },
},
//乌巢酒仙
recangchu: {
audio: 2,
trigger: { global: "phaseBefore", player: "enterGame" },
marktext: "粮",
forced: true,
filter: function (event, player) {
if (event.name == "phase" && game.phaseNumber != 0) return false;
return player.countMark("recangchu") < game.countPlayer();
},
content: function () {
player.addMark(
"recangchu",
Math.min(3, game.countPlayer() - player.countMark("recangchu"))
);
},
intro: { content: "mark", name: "粮" },
mod: {
maxHandcard: function (player, num) {
return num + player.countMark("recangchu");
},
},
group: ["recangchu2", "recangchu3"],
},
recangchu2: {
audio: "recangchu",
trigger: {
player: "gainAfter",
global: "loseAsyncAfter",
},
forced: true,
usable: 1,
filter: function (event, player) {
return (
player != _status.currentPhase &&
player.countMark("recangchu") < game.countPlayer() &&
event.getg(player).length > 0
);
},
content: function () {
player.addMark("recangchu", 1);
},
},
recangchu3: {
audio: "recangchu",
trigger: { global: "die" },
forced: true,
filter: function (event, player) {
return player.countMark("recangchu") > game.countPlayer();
},
content: function () {
player.removeMark("recangchu", player.countMark("recangchu") - game.countPlayer());
},
},
reliangying: {
audio: 2,
trigger: { player: "phaseDiscardBegin" },
filter(event, player) {
return player.hasMark("recangchu");
},
direct: true,
async content(event, trigger, player) {
const draws = Array.from({ length: player.countMark("recangchu") }).map(
(_, i) => get.cnNumber(i + 1) + "张"
);
const {
result: { control },
} = await player
.chooseControl(draws, "cancel2")
.set("prompt", get.prompt("reliangying"))
.set(
"prompt2",
"摸至多" +
get.cnNumber(player.countMark("recangchu")) +
"张牌,然后交给等量的角色各一张牌"
)
.set("ai", () => {
const player = get.event("player");
const num = Math.min(
player.countMark("recangchu"),
game.countPlayer((current) => get.attitude(player, current) > 0)
);
if (num > 0) return get.cnNumber(num) + "张";
return "cancel2";
});
if (control != "cancel2") {
player.logSkill("reliangying");
const num = draws.indexOf(control) + 1,
max = Math.min(
num,
player.countCards("he"),
game.countPlayer((target) => target != player)
);
await player.draw(num);
let list = [];
if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true));
while (max - list.length > 0) {
const {
result: { bool, cards, targets },
} = await player
.chooseCardTarget({
prompt:
"粮营:将" +
get.cnNumber(max - 1) +
"至" +
get.cnNumber(max) +
"张牌交给其他角色",
position: "he",
animate: false,
filterCard(card, player) {
return !get.event("list").some((list) => list[1] == card);
},
filterTarget(card, player, target) {
return (
target != player &&
!get.event("list").some((list) => list[0] == target)
);
},
ai1(card) {
if (card.name == "shan") return 1;
return Math.random();
},
ai2(target) {
return get.attitude(get.event("player"), target);
},
})
.set("list", list)
.set("forced", max - list.length > 1);
if (bool) {
list.push([targets[0], cards[0]]);
player.addGaintag(cards, "olsujian_given");
} else break;
}
if (_status.connectMode) {
game.broadcastAll(() => {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
if (list.length) {
await game
.loseAsync({
gain_list: list,
player: player,
cards: list.slice().map((list) => list[1]),
giver: player,
animate: "giveAuto",
})
.setContent("gaincardMultiple");
}
}
},
},
reshishou: {
audio: 2,
trigger: { player: ["useCard", "damageEnd"] },
forced: true,
filter: function (event, player) {
if (!player.countMark("recangchu")) return false;
return event.name == "damage"
? event.hasNature("fire")
: event.card && event.card.name == "jiu";
},
content: function () {
player.removeMark("recangchu", Math.min(player.countMark("recangchu"), trigger.num || 1));
},
ai: {
combo: "recangchu",
neg: true
},
group: "reshishou2",
},
reshishou2: {
audio: "reshishou",
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
filter: function (event, player) {
return !player.countMark("recangchu");
},
content: function () {
player.loseHp();
},
},
//曹性
cxliushi: {
audio: 2,
enable: "phaseUse",
filter: function (event, player) {
return player.countCards("he", { suit: "heart" }) > 0;
},
filterCard: { suit: "heart" },
position: "he",
filterTarget: function (card, player, target) {
return player.canUse("sha", target, false);
},
check: function (card) {
var player = _status.event.player;
var next = player.getNext();
var att = get.attitude(player, next);
if (att > 0) {
var js = next.getCards("j");
if (js.length) return get.judge(js[0]) + 10 - get.value(card);
return 9 - get.value(card);
}
return 6 - get.value(card);
},
discard: false,
prepare: "throw",
loseTo: "cardPile",
visible: true,
insert: true,
content: function () {
game.log(player, "将", cards, "置于牌堆顶");
player.useCard({ name: "sha", isCard: true }, false, targets).card.cxliushi = true;
},
group: "cxliushi_damage",
subSkill: {
damage: {
trigger: { source: "damageSource" },
forced: true,
popup: false,
filter: function (event, player) {
return (
event.card &&
event.card.cxliushi == true &&
event.player.isIn() &&
event.getParent(3).name == "cxliushi"
);
},
content: function () {
trigger.player.addMark("cxliushi2", 1);
trigger.player.addSkill("cxliushi2");
},
},
},
ai: {
order: function () {
return get.order({ name: "sha" }) - 0.4;
},
result: {
target: function (player, target) {
var eff = get.effect(target, { name: "sha" }, player, target);
var damageEff = get.damageEffect(target, player, player);
if (eff > 0) return damageEff > 0 ? 0 : eff;
if (
target.hasSkill("bagua_skill") ||
target.hasSkill("rw_bagua_skill") ||
target.hasSkill("bazhen")
)
return 0;
return eff;
},
},
},
},
cxliushi2: {
mod: {
maxHandcard: function (player, num) {
return num - player.countMark("cxliushi2");
},
},
onremove: true,
charlotte: true,
intro: {
name2: "流",
content: "手牌上限-#",
},
},
zhanwan: {
audio: 2,
trigger: { global: "phaseDiscardEnd" },
forced: true,
filter: function (event, player) {
return (
event.player.hasSkill("cxliushi2") &&
event.player.getHistory("lose", function (evt) {
if (evt.type == "discard" && evt.getParent("phaseDiscard") == event) return true;
}).length > 0
);
},
logTarget: "player",
content: function () {
trigger.player.removeSkill("cxliushi2");
var num = 0;
trigger.player.getHistory("lose", function (evt) {
if (evt.type == "discard" && evt.getParent("phaseDiscard") == trigger)
num += evt.cards2.length;
});
player.draw(num);
},
ai: {
combo: "cxliushi",
},
},
//说出吾名吓汝一跳
xuxie: {
audio: 2,
trigger: { player: "phaseUseBegin" },
logTarget: function (event, player) {
return game
.filterPlayer(function (current) {
return get.distance(player, current) <= 1;
})
.sortBySeat();
},
check: function (event, player) {
if (player.isHealthy()) return false;
var list = game.filterPlayer(function (current) {
return get.distance(player, current) <= 1;
});
var draw = 0;
var discard = 0;
var num = 2 / player.getDamagedHp();
while (list.length) {
var target = list.shift();
var att = get.attitude(player, target);
if (att > 0) {
draw++;
if (target.countDiscardableCards(player, "he") > 0) discard--;
}
if (att == 0) {
draw--;
if (target.countDiscardableCards(player, "he") > 0) discard--;
}
if (att < 0) {
draw--;
if (target.countDiscardableCards(player, "he") > 0) discard++;
}
}
return draw >= num || discard >= num;
},
content: function () {
"step 0";
player.loseMaxHp();
"step 1";
var targets = game
.filterPlayer(function (current) {
return get.distance(player, current) <= 1;
})
.sortBySeat();
if (!targets.length) event.finish();
else {
event.targets = targets;
player
.chooseControl()
.set("choiceList", [
"弃置" + get.translation(targets) + "的各一张牌",
"令" + get.translation(targets) + "各摸一张牌",
])
.set("ai", function () {
var player = _status.event.player;
var list = _status.event.getParent().targets.slice(0);
var draw = 0;
var discard = 0;
while (list.length) {
var target = list.shift();
var att = get.attitude(player, target);
if (att > 0) {
draw++;
if (target.countDiscardableCards(player, "he") > 0) discard--;
}
if (att < 0) {
draw--;
if (target.countDiscardableCards(player, "he") > 0) discard++;
}
}
if (draw > discard) return 1;
return 0;
});
}
"step 2";
event.index = result.index;
if (result.index == 1) {
game.asyncDraw(targets);
} else event.goto(4);
"step 3";
game.delay();
event.finish();
"step 4";
var target = targets.shift();
if (target.countDiscardableCards(player, "he") > 0)
player.discardPlayerCard(target, "he", true);
if (targets.length) event.redo();
},
group: "xuxie_add",
},
xuxie_add: {
audio: "xuxie",
trigger: { player: "phaseUseEnd" },
forced: true,
locked: false,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current.maxHp > player.maxHp;
});
},
content: function () {
player.gainMaxHp();
player.chooseDrawRecover(2, true);
},
},
//新潘凤
xinkuangfu: {
enable: "phaseUse",
usable: 1,
audio: 2,
delay: false,
filterTarget: function (card, player, target) {
if (player == target)
return (
player.countCards("e", function (card) {
return lib.filter.cardDiscardable(card, player);
}) > 0
);
return target.countDiscardableCards(player, "e") > 0;
},
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current.countCards("e") > 0;
});
},
content: function () {
"step 0";
if (player == target) player.chooseToDiscard("e", true);
else player.discardPlayerCard(target, "e", true);
"step 1";
player.chooseUseTarget("sha", true, false, "nodistance");
"step 2";
var bool = game.hasPlayer2(function (current) {
return (
current.getHistory("damage", function (evt) {
return evt.getParent("xinkuangfu") == event;
}).length > 0
);
});
if (player == target && bool) player.draw(2);
else if (player != target && !bool) player.chooseToDiscard("h", 2, true);
},
ai: {
order: function () {
return get.order({ name: "sha" }) + 0.3;
},
result: {
target: function (player, target) {
var att = get.attitude(player, target);
var max = 0;
var min = 1;
target.countCards("e", function (card) {
var val = get.value(card, target);
if (val > max) max = val;
if (val < min) min = val;
});
if (att > 0 && min <= 0) return target.hasSkillTag("noe") ? 3 : 1;
if (att <= 0 && max > 0) {
if (target.hasSkillTag("noe")) return max > 6 ? -max / 3 : 0;
return -max;
}
if (player === target && !player.hasSha()) {
let ph = player.countCards("h");
if (
game.hasPlayer((i) => {
if (
!player.canUse("sha", i, true, true) ||
get.effect(i, { name: "sha" }, player, player) <= 0
)
return false;
return (
!ph ||
!i.mayHaveShan(
player,
"use",
i.getCards("h", (i) => {
return i.hasGaintag("sha_notshan");
})
)
);
})
)
return 1;
}
return 0;
},
},
},
},
},
card: {},
characterIntro: {
dc_liuli:
"刘理(?—244年),字奉孝,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅、甘陵王刘永异母弟。章武元年(221年),刘备称帝,派司徒许靖封刘理为梁王。建兴八年(230年),改封为安平王。延熙七年(244年),刘理去世,谥号悼王。",
xingdaorong:
"邢道荣是《三国演义》中虚构的人物,为零陵太守刘度手下武将,被评价有万夫不当之勇,于《三国演义》第五十二回登场,被赵云刺死。",
caoxing:
"曹性,东汉末年吕布部将,史载他曾与身为自己上司的反叛者郝萌交战,并砍去郝萌一臂,受到吕布的嘉奖。在罗贯中所著古典小说《三国演义》中,也有关于曹性箭射夏侯惇左目的描述,而曹性也随即被暴怒的夏侯惇所杀。在穿越小说《三国之银河射手》中,主角穿越成为曹性,经过一番闯荡之后,被封为“银河射手”。",
xiahoujie:
"夏侯杰(?—208年),是罗贯中的小说《三国演义》中曹操的部将,征战时常常带在身边。在第42回长坂坡之战中,张飞大吼,从马儿受惊跌下马来而死。",
huaxin: "华歆(157年-232年1月30日),字子鱼,汉族。平原郡高唐县人(今山东省高唐县)。汉末至三国曹魏初年名士、重臣。华歆早年拜太尉陈球为师,与卢植、郑玄、管宁等为同门,又与管宁、邴原共称一龙,华歆为龙头。汉灵帝时华歆被举为孝廉,任郎中,因病去官。又被大将军何进征召为尚书郎。后任豫章太守,甚得民心。孙策率军南下,华歆举郡投降,被奉为上宾。官渡之战时,被征为议郎、参司空军事。入为尚书、侍中,又代荀彧为尚书令。丞相曹操讨孙权时,授华歆为军师。后为魏王国的御史大夫。曹丕即王位,拜华歆为相国,封安乐乡侯。曹魏建立后,其相国职名改称司徒。魏明帝即位,升任太尉,晋封博平侯。太和五年十二月(232年1月),华歆去世,年七十五,谥号“敬”。有文集三十卷,今佚失,其余见《全三国文》。",
luyusheng:
"陆郁生(?年-?),三国时期吴国官员陆绩之女。陆郁生的父亲陆绩是吴郡公认的才子,又是当时吴郡陆氏的领袖。陆绩赴任担任郁林太守,遂取此名。陆郁生年少的时候就定下坚贞的志向。建安二十四年(219年),陆绩早亡,她与两个兄弟陆宏、陆睿当时都只有几岁,一起返回吴县,被他们的从兄陆瑁接回抚养。13周岁的陆郁生嫁给同郡出身的张白为妻。出嫁3个月后,张白因为其兄张温一族的案件遭到连坐,被处以流刑,后死于流放地,陆郁生成为了寡妇,其后公开宣言不再改嫁,困难于生计但拒绝了所有提亲,在艰苦中从未停止服侍、照顾张白的姐妹。事情传到朝廷,皇帝褒奖陆郁生,号其为“义姑”。她的表侄姚信在文集中称赞她的义举。",
fengxi: "冯熙(?—223年),字子柔,颍川郡父城县(今河南省平顶山市宝丰县)人。汉末三国时期吴国官员,东汉初年名将冯异的后人。孙权担任车骑将军时,冯熙担任其幕府东曹掾,后迁立信都尉。刘备去世时,奉命进入蜀汉吊丧,返回后,任中大夫。后奉命出使魏国,受到魏文帝曹丕和尚书令陈群招揽,宁死不从,自尽未果。孙权闻之流泪,称其“东吴苏武”。最终在曹魏死去。",
heyan: "何晏(?-249年),字平叔。南阳郡宛县(今河南省南阳市)人。三国时期曹魏大臣、玄学家,东汉大将军何进之孙(一称何进弟何苗之孙)。何晏之父早逝,司空曹操纳其母尹氏为妾,他因而被收养,为曹操所宠爱。少年时以才秀知名,喜好老庄之学,娶曹操之女金乡公主。魏文帝在位时,未被授予官职。魏明帝认为何晏虚浮不实,也只授其冗官之职。大将军曹爽秉政时,何晏与之共事,得以累官至侍中、吏部尚书,典选举,封列侯。高平陵之变后,与大将军曹爽同为太傅司马懿所杀,被夷灭三族。何晏有文集十一卷,并曾与郑冲等共撰《论语集解》,今已佚。钟嵘《诗品》称“平叔鸿鹄之篇,风规见矣。”将何晏诗列入中品。袁宏在《名士传》中将何晏等称为正始名士。他与夏侯玄、王弼等倡导玄学,竞事清谈,遂开一时风气,为魏晋玄学的创始者之一。",
zhaoyan:
"赵嫣,生卒年不详。东吴方士(一说是丞相)赵达之妹,吴大帝孙权之妃,人称赵夫人。她心灵手巧,多才多艺,有“三绝”之称。孙权曾经想要找擅长绘画之人绘制山川地势军阵之图。赵达举荐了自己的妹妹。赵嫣认为水墨容易褪色,不方便在军旅之中保存。自己擅长刺绣,可以在锦帛上绣出孙权所需之图。待制作完成后献于孙权,只见方帛锦绣之上有五岳河海城邑行阵之形,孙权大为赞叹。时人谓之“针绝”。除刺绣之外,赵嫣还擅长绘画织锦,她能用彩丝织成云霞龙蛇之锦,大则盈尺,小则方寸,宫中谓之“机绝”。孙权在昭阳宫居住之时,饱受暑气之扰,以紫绡制成帷帐缓解暑气。赵嫣认为此物不足为贵,她削下自己的头发剖为细丝,以郁夷国出产的神胶连接,花了数月功夫将其制成一顶幔帐,打开之后薄如蝉翼,轻赛寒烟。放下帐帷能笼罩一丈之地,帐内清风自生暑意顿消。收起来则可纳入枕中,携带方便。时人谓之“丝绝”。",
wangtao:
"王桃是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王悦的姐姐,与妹妹都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。",
wangyue:
"王悦是在《花关索传》中登场的虚拟人物,盗贼王令公的两个女儿之一,王桃的妹妹,与姐姐都是关索之妻。姐妹俩原为卢塘寨山贼,以武艺与美貌而闻名,被众多男性求婚却皆不与理睬。她们在关索回西川认父途中与关索交手时不敌,因意气投合而一齐下嫁。虽为架空之人物,但四川省内有记述夫妻三人共同守护葭萌关一事,民间亦流传如夫妻三人曾共同参与诸葛亮之南蛮征伐等轶事。",
zhangxuan:
"张嫙,三国时期孙吴将领张布之女,孙皓后妃张媱的姐姐。初为卫尉冯朝之子冯纯的妻子,后为孙皓后妃,册封左夫人。因孙皓诛灭张布,张媱口吐怨言,被暴怒的孙皓下令棒杀。后来孙皓怀念她的容颜,于是询问侍从:“张布还有女儿吗?”侍从回答:“张布的大女儿嫁给了已故卫尉冯朝的儿子冯纯。”于是孙皓夺走了冯纯的妻子张嫙,纳入宫中。孙皓颇为宠爱张嫙,册封其为左夫人。昼夜嬉戏,纸醉金迷,不理朝政。后来张嫙也去世了,孙皓非常悲伤,下令以最高的规格埋葬张嫙。因为悲伤过度,孙皓一度半年都不出宫门,甚至由于葬礼太过奢华被宫外之人认为孙皓已经死了。",
tengyin:
"滕胤(?-256年),字承嗣,三国时期吴国重臣,北海郡剧县(今山东省昌乐县)人。滕胤仪表堂堂,少时有节操,后娶公主为妻。孙权称王后,滕胤被封都亭侯。其后历任丹杨太守、吴郡太守、会稽太守。孙亮继位后,出任太常、卫将军。诸葛恪被杀后,群臣推举滕胤为司徒,但遭权臣孙峻党羽所阻挠,滕胤也有意避嫌,最终只晋爵高密侯。孙峻死后,由其堂弟孙綝执政。滕胤的连襟、骠骑将军吕据联系北伐前线诸将推举滕胤为相,希望分割孙綝权力,但并未成功,滕胤被改任大司马,镇守武昌。不久,滕胤与吕据密谋推翻孙綝,因计划泄露而被杀,惨遭灭族。孙綝被杀后,景帝孙休为滕胤平反。",
zhangyao:
"张美人,三国东吴末帝孙皓后妃,张布之女。另有张布女,张美人姊被孙皓立为左夫人。《吴书五妃嫔传第五》:江表传曰:皓以张布女为美人,有宠,皓问曰:“汝父所在?”答曰:“贼以杀之。”皓大怒,棒杀之。后思其颜色,使巧工刻木作美人形象,恒置座侧。问左右:“布复有女否?”答曰:“布大女适故卫尉冯朝子纯。”即夺纯妻入宫,大有宠,拜为左夫人,昼夜与夫人房宴,不听朝政,使尚方以金作华燧、步摇、假髻以千数。令宫人著以相扑,朝成夕败,辄出更作,工匠因缘偷盗,府藏为空。会夫人死,皓哀愍思念,葬于苑中,大作冢,使工匠刻柏作木人,内冢中以为兵卫,以金银珍玩之物送葬,不可称计。已葬之后,皓治丧於内,半年不出。国人见葬太奢丽,皆谓皓已死,所葬者是也。皓舅子何都颜状似皓,云都代立。临海太守奚熙信讹言,举兵欲还诛都,都叔父植时为备海督,击杀熙,夷三族,讹言乃息,而人心犹疑。",
xiahoulingnv:
"夏侯令女,字令女,名不详。生卒年不详,三国时期人物。夏侯文宁之女(《三国演义》中为夏侯令之女),曹文叔之妻。其事迹见于《三国志·魏书·诸夏侯曹传第九》裴松之注引皇甫谧《列女传》。而在《三国演义》中,由于作者断句错误,便认为“夏侯令女”是“夏侯令之女”之意(见《三国演义》第107回:“乃夏侯令女也”,由其语气可推断)。",
lvlingqi:
"吕玲绮,虚拟人物,源于日本光荣株式会社(现光荣特库摩公司)旗下游戏《真·三国无双》系列,初次登场于《真三国无双7:猛将传》。吕布的女儿,寂寥而威风凛凛的战姬,发挥着不亚于父亲的武艺,非常勇敢地身先士卒立于前线。虽然有着能够直面困难的坚强意志,却由于过去的经历而有着非常害怕孤独的一面。",
liuyong:
"刘永,字公寿,涿郡涿县(今河北涿州)人,三国时期蜀汉昭烈帝刘备之子,蜀汉后主刘禅之弟。章武元年(221年)六月,封鲁王。建兴八年(230年),改封甘陵王。咸熙元年(264年),蜀汉灭亡,刘永被迁往洛阳,被任命为奉车都尉,封乡侯。",
wanniangongzhu:
"刘氏(生卒年不详),河南郡雒阳县(今河南省洛阳市)人,汉灵帝刘宏之女,汉少帝刘辩与汉献帝刘协的姐妹,封万年公主。",
mamidi: "马日磾(?~194年),字翁叔。扶风茂陵(今陕西省兴平市)人。东汉中后期大臣,经学大师马融之族孙(一作族子)。马日磾年轻时即继承马融学说,以才学入仕。曾任谏议大夫,与蔡邕、卢植等人东观典校官藏的《五经》记传,并参与续写《东观汉记》。后历任射声校尉、太尉、太常等职。初平三年(192年),掌权的李傕任命马日磾为太傅、录尚书事,与太仆赵岐共同出使关东。他到寿春袁术处后,对其多有所求,遭袁术轻鄙,袁术遂夺其符节,来随意征辟将士,并企图强迫马日磾任其军师,马日磾求去不能,忧愤发病,兴平元年(194年),卒于寿春。",
guanning:
"管宁(158年—241年),字幼安。北海郡朱虚县(今山东省安丘、临朐东南)人。汉末三国时期著名隐士。管宁与华歆、邴原并称为“一龙”。汉末天下大乱时,与邴原及王烈等人避于辽。在当地只谈经典而不问世事,做讲解《诗经》《书经》,谈祭礼、整治威仪、陈明礼让等教化工作,人们都很乐于接受他的教导。直到魏文帝黄初四年(公元223年)才返乡,辽东太守公孙恭亲自送别。此后曹魏几代帝王数次征召管宁,他都没有应命。正始二年(公元241年),管宁逝世,年八十四。著有《氏姓论》。",
tenggongzhu:
"滕公主,名讳不详,三国人物,吴大帝孙权之女。一说为养女,生父为孙权堂弟孙奂。黄武年间(222年—228年),以公主身份下嫁功臣滕胄之子滕胤,当时滕胤年仅20岁。滕胤皮肤白皙,容貌俊美,每逢入朝大臣们没有不惊叹称羡的。滕胤仕官后,上书言及时局,又对政策多有匡弼。孙权对公主也特别宠爱,因为滕胤的缘故,又格外增加对公主的赏赐,又几次探望慰劳。少帝孙亮时期,孙綝以宗室身份独揽大权作恶多端,引发群臣不满。五凤三年(256年)滕胤与连襟吕据密谋推翻孙綝,事败遭到夷三族 。公主则被亲兄孙壹救出,携其逃亡曹魏。",
caimaozhangyun:
"蔡瑁,字德珪,生卒年不详。襄阳蔡州人,东汉末年荆州名士。少年时与曹操交好。初平元年(公元190年),刘表为荆州刺史。时宗贼猖獗,蔡瑁协助刘表诛杀宗贼,平定荆州之地,蔡瑁因此得刘表重用,并在刘表任镇南将军时担任他的军师。刘表病亡后,蔡瑁拥护刘表幼子刘琮继位,并逼迫他投降南征的曹操。蔡瑁在曹操麾下历任从事中郎、司马、长水校尉,受封汉阳亭侯。张允,生卒年不详,荆州牧刘表的外甥,与蔡瑁一样是刘表幼子刘琮的党羽。刘表病重之时,张允害怕刘表会把州牧之位传给长子刘琦,于是将远赴而来的刘琦阻于门外,不准他与刘表相见。曹操大军到达新野时,张允也随蔡瑁一同投降曹操。之后便隐没于历史之中,并无记载。在《三国演义》中,蔡瑁张允擅长水战,是东吴心腹大患。周瑜用反间计诱骗曹操除掉二人,使得曹军再无能够统领水军的大将。",
zhangxun:
"张勋,东汉末年军阀袁术帐下大将,袁术称帝后受封大将军。初平四年(公元193年),袁术引兵入陈留,被曹操、袁绍合力击败,逃至雍丘。后入九江,杀死扬州刺史陈温而自领之,并任命张勋、桥蕤为大将。时孙策依附于袁术,被表为怀义校尉,张勋对其倾心敬服。袁术称帝后,任命张勋为大将军,攻打吕布,大败而还。其后曹操又以袁术称帝为名南下进攻,袁术闻之大惊,即走度淮,留张勋、桥蕤守蕲阳以拒曹。曹操破其军,斩桥蕤,张勋退走。建安四年(公元199年),袁术病死,张勋率残军欲南投孙策,途中被袁术旧部刘勋俘虏,其后下落不明。",
huzhao: "胡昭(162年-250年),字孔明,颍川(治今河南禹州)人。汉末三国时期隐士、书法家。胡昭善长隶书,与钟繇、邯郸淳、卫觊、韦诞齐名。有“钟氏小巧,胡氏豪放”之说,世人并称“钟胡”。",
guanhai:
"管亥(生卒年不详),青州黄巾军渠帅,率军侵略北海,围北海相孔融于都昌。孔融派遣太史慈突围而出,前往平原向刘备求援,刘备率军来到,击退管亥。《三国演义》中管亥在单挑中为关羽斩杀。",
yinfuren:
"尹夫人,原汉大将军何进的儿媳,丈夫早逝,生有一子何晏。曹操任司空时娶尹氏为妾,一并收养何晏,并生有一子曹矩。",
chengui:
"陈珪(生卒年不详),一作圭,字汉瑜。徐州下邳(治今江苏睢宁西北)人,广汉太守陈亹之孙,太尉陈球之侄,吴郡太守陈瑀(一作陈璃)、汝阴太守陈琮的从兄,陈登、陈应之父。官至沛相。",
wanglie:
"王烈,字彦方(141-219),平原县(今山东德州平原)人。生于永和六年(公元141年),卒于建安二十三年(公元218年)。王烈少时师从陈寔,闻名遐迩。董卓作乱时避乱辽东,并多次拒绝曹操的聘请。七十八岁时病死于辽东。",
panghui:
"庞会,(214—?),三国时期曹魏名将,庞德之子。曹丕即位后,思庞德忠烈,遂赐庞会等兄弟四人爵关内侯,邑各百户。庞会勇烈,有先父之风,官至中尉将军,封列侯。",
chenjiao:
"陈矫(?-237年7月11日),字季弼,广陵郡东阳县(治今安徽省天长市西北,今地属江苏省如皋市)人。三国时期曹魏名臣。陈矫本姓刘,因过继与母族而改姓陈。早年避乱江东,后广陵太守陈登请为功曹。曹操辟为丞相掾属,迁任相县令,转任征南长史。又为彭城、乐陵太守,迁任魏郡西部都尉。曹操东征,拜丞相长史,转西曹属、尚书。曹丕称帝,领吏部事,封高陵亭侯,迁尚书令。明帝继位后,进爵东乡侯,后转侍中,加光禄大夫,又拜司徒。景初元年(237年),陈矫去世,谥贞侯。",
gongsundu:
"公孙度 (?-204年),字升济,辽东襄平(今辽宁辽阳)人,东汉末年辽东太守。少随父迁居玄菟郡。初为玄菟小吏,建宁二年(169年),继升尚书郎、冀州刺史,后被免官。初平元年(190年),经同乡徐荣推荐,被董卓任命为辽东太守。公孙度到任后,厉行严刑峻法,打击豪强势力,使令行政通,羽翼渐丰。不久,中原地区董卓乱起,各地军阀无暇东顾。公孙度趁机自立为辽东侯、平州牧。继则东伐高句丽,西击乌桓,南取辽东半岛,越海取胶东半岛北部东莱诸县,开疆扩土;又招贤纳士,设馆开学,广招流民,威行海外,俨然以辽东王自居。建安九年(204年)病逝,子公孙康继承其位由于公孙度的锐意进取和苦心经营,使辽东地区在汉末三国的战乱年代,获得了暂时的安宁,推动了当地生产技术和封建文化的发展。",
leibo: "雷薄(生卒年不详),本为东汉末年袁术麾下部将。离开称帝后昏庸奢侈的袁术,与陈兰一起占据嵩山为山贼。后来袭击兵败的袁术,抢夺财宝。同时在《三国演义》中也有出场。",
liupi: "刘辟,东汉末年黄巾起义军将领。黄巾军将领。黄巾之乱后,与龚都一起率军盘踞在汝南。欲追随刘备,将汝南让给刘备。《三国演义》中,在与曹操的部将高览交战时,为保护刘备而战死。",
zhenghun:
"郑浑(生卒年不详),字文公。开封(今河南省开封市)人。汉末及三国时期曹魏大臣,东汉名儒郑众曾孙、名士郑泰之弟。郑浑早年避乱淮南,后转投豫章太守华歆。又被曹操辟为掾属,历任下蔡县长、邵陵县令,任内颇有政绩,深得民心。任左冯翊时,击杀扰乱郡县的梁兴,又击败作乱的山贼。历任上党太守、京兆尹、丞相掾属等职。曹丕称帝后,拜侍御史,加驸马都尉。先后任阳平、沛郡太守,任内兴修水利,使农田常年丰收,被百姓称为“郑陂”。后转任山阳和魏郡太守。魏明帝曹叡听闻郑浑的事迹之后,下诏将其政绩布告天下。官至将作大匠。卒年不详。",
furongfuqian:
"傅肜(?-222年),义阳(今湖北枣阳)人,三国时蜀汉将领。刘备攻伐吴国时,傅肜为别督。后刘备被陆逊击败,傅肜率部断后,奋战至死。死前怒斥道:“吴狗!何有汉将军降者!”
傅佥[qiān] ( ? ~263年),义阳(治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。",
qinlang:
"秦朗(生卒年不详),字元明,小字阿蘇(一作阿鳔),新兴(治今山西忻州)云中人。三国时期曹魏将领,官至骁骑将军、给事中,曾率兵讨伐鲜卑轲比能和步度根的叛军。",
xianglang:
"向朗(约167年—247年),字巨达。襄阳郡宜城县(今湖北宜城)人,三国时期蜀汉官员、藏书家、学者。向朗早年师从于司马徽,并被荆州牧刘表任命为临沮县长。后随刘备入蜀,历任巴西、牂牁、房陵太守,并拜步兵校尉,领丞相长史,随丞相诸葛亮北伐。因包庇马谡被免职,后为光禄勋,转左将军、特进,封显明亭侯。曾代理丞相册封张皇后及太子刘璿。晚年专心研究典籍,诱导青年学习,家中藏书丰富,受到举国尊重。延熙十年(247年),向朗去世。《全三国文》收录有一篇《遗言戒子》",
yuantanyuanxiyuanshang:
"袁谭、袁尚的武将介绍请移步「袁谭袁尚」,此处为袁熙的介绍。
袁熙(?-207年),字显奕(《后汉书》、《东光世系》作显雍),汝南郡汝阳县(今河南商水)人,是东汉末年占据河北的军阀袁绍次子,袁绍打败公孙瓒后,令袁熙为幽州刺史。袁绍官渡兵败后不久病死,其兄长袁谭、弟弟袁尚各自独立,互相攻伐,曹操趁机进攻袁谭、袁尚,并逐渐占河北。袁熙接纳兵败的袁尚后,因为属下叛变而逃往乌桓,被曹操击败后,逃往辽东太守公孙康帐下,却被公孙康杀死,二人首级被献给曹操。",
zhanghu:
"张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。张辽之子,三国时期曹魏武将。官至偏将军,封晋阳侯,有一子张统。",
mengjie:
"孟节,南中蛮王孟获之兄。是小说《三国演义》中杜撰的人物,史上并无记载。诸葛亮南征孟获之时,帐下军士因误饮哑泉之水失语。当地山神告知诸葛亮,言万安溪畔有一高士隐居彼处,号“万安隐者”。其草庵后有一泉,名安乐泉,可解哑泉之毒。庵前生有一草,名薤叶芸香,可防瘴气之染。诸葛亮于是带人连夜前往其隐居之处,求得泉水草叶解毒防瘴,拜求隐士姓名,方知其名为孟节,由此而叹:“方信盗跖、下惠之事,今亦有之。”诸葛亮欲申奏刘禅,立其为王,孟节辞之。又以金帛赠之,孟节坚辞不受。诸葛亮嗟叹不已,拜别而回。",
peiyuanshao:
"裴元绍,《三国演义》人物,原黄巾军之武将。黄巾起义失败之后,与周仓一同率领残部在山中落草当山贼。公元200年,在关羽欲返刘备旗下,在突破曹操的五道关卡后路过其落草之地,与周仓一同向关羽要求能以期成为关羽家臣。但此时仅周仓同行,其他弟兄则于山中等待。不久后,因其欲夺偶然路过的赵云之马,反遭讨伐战败身死。",
zhangchu:
"张楚,《阵面对决》第九弹“燎原”中登场的一个原创人物。她是张角的女儿,张宁的姐姐,在逃亡途中被刘备捕获。之后在诸葛亮的建议下,张楚被囚禁。在《阵面对决》的“怒焰”故事线中,张楚随着刘备入了西川,并被软禁在成都。夷陵之战后,刘备大败,全国主力外出用以支援刘备,朝内空虚,张楚趁机逃跑。",
dongwan: "董绾,袁术老婆,嫉妒冯芳女的美貌,与冯方女有矛盾。",
yuanyin:
"袁胤(生卒年不详),东汉末期人物,据说是袁隗之子,是袁术从弟。兴平二年(公元195年)被袁术任命为丹杨太守,后因孙策平定江东被逐。建安四年(公元199年),袁术卒,袁胤因畏惧曹操,遂率领袁术部曲并带着其灵柩及妻子到皖城并投奔庐江太守刘勋。6个月后皖城被孙策所破,袁胤等人迁居吴郡,此后事迹不详。",
gaoxiang:
"高翔(又作高详、高祥)(生卒年不详),荆州南郡(治今湖北省公安县)人,三国时期蜀汉将领。曾随刘备攻打汉中,后又随蜀汉丞相诸葛亮参加北伐曹魏的战争。建兴九年(公元231年)的北伐中大破司马懿。官至杂号大将军(即某杂号将军加大,但无考何杂号将军),封玄乡侯。此后,关于高翔的记载不详。",
zhoushan:
"周善,《三国演义》中人物,不见于正史记载。为吴侯孙权的家将,此人最有胆量,自幼穿房入户,多随孙策。权为骗其妹回吴,遣善将五百人,扮为商人,分作五船;更诈修国书,以备盘诘;船内暗藏兵器。周善领命,往荆州。正骗得孙夫人带刘禅上船,赵云前来抢走禅,周善在后梢挟住舵,只顾放船下水。正僵持时张飞赶到,周善见张飞上船,提刀来迎,被张飞手起一剑砍倒,提头掷于孙夫人前。",
zhangkai:
"张闿,陶谦的手下都尉。奉命截杀曹操之父曹嵩,杀死曹嵩,夺去财宝逃往淮南投奔袁术,并担任刺杀陈王刘宠和陈国相骆俊的任务。",
mengyou:
"孟优,《三国演义》里的人物,南蛮王孟获之弟。与诸葛亮的南征军交战,向败战的兄长推荐朵思大王,劝兄长借助朵思之力与蜀汉军对抗。后来与兄长一起发誓归顺蜀汉。",
liuchongluojun:
"刘宠(?~197年),汉明帝刘庄玄孙,陈敬王刘羡曾孙,陈顷王刘崇之孙,陈孝王刘承之子,陈国第六位国君,也是东汉陈国的最后一位国君。骆俊(?-197),字孝远,东汉末年扬州会稽郡乌伤县(今浙江义乌)人。宗室陈王刘宠的国相,在任期间励精图治,深得民众爱戴。刘宠勇猛过人,善使弓弩,箭法高超。在其父刘承死后,继承陈王爵位。中平年间,黄巾军起义,郡县官兵都弃城逃走,刘宠于是征兵自守卫。当时天下饥荒,诸王侯都已不再享有租赋,反屡遭抢掠,有的甚至流离在外,死于荒野。只有陈国仍很富强,邻郡百姓纷纷前去投靠,陈国拥有部众达十余万人。初平元年(190年),各州郡起兵讨伐董卓,刘宠率军屯驻阳夏,自称辅汉大将军。建安二年(197年),袁术向陈国求取粮草,遭陈国国相骆俊拒绝,袁术大为生气,便派刺客张闿假装路过陈国,乘机杀死骆俊和刘宠。",
yuechen:
"乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。",
kuaiqi: "蒯祺(?~219年),南郡中卢人,荆州望族子弟,与荆州牧刘表帐下谋士蒯良、蒯越为同族,东汉末年房陵太守。建安二十四年(219年),汉中王刘备遣宜都太守孟达从秭归北攻房陵,蒯祺于战斗中被孟达所部士兵所杀。清朝任兆麟《心斋十种》中的《襄阳记》辑本引用《万历襄阳府志》“(蒯)钦从祖祺妇,即诸葛孔明之姊也”,称蒯祺娶故兖州泰山郡丞诸葛珪长女,即他是知名政治家、蜀汉丞相诸葛亮的姐夫。但在任兆麟之前的《襄阳记》辑本中,并没有这一条。",
pangshanmin:
"庞山民,荆州襄阳人,三国时期曹魏大臣。庞山民出身荆州庞氏,为隐士庞德公之子、凤雏庞统的堂兄,娶诸葛亮二姐诸葛氏(“若雪”为网络小说虚构)为妻。后出仕曹魏,历任黄门、吏部郎等职。",
gongsunxiu:
"公孙修(?-238),三国时期人物,公孙渊之子。景初元年(237年),魏明帝曹叡派出幽州刺史毌丘俭攻打公孙渊,久战不利回师。公孙渊即自立为燕王,改元绍汉,引诱鲜卑侵扰北方,背叛曹魏。景初二年(238年)春,曹魏又派司马懿和高句丽国王高位宫率军攻打公孙渊,围城日久,公孙渊粮尽之后,与儿子公孙修一起出逃后被擒获,父子二人同时被斩首示众。",
},
characterTitle: {},
characterFilter: {},
dynamicTranslate: {
cuijian: function (player) {
return (
"出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你" +
(player.hasMark("zhtongyuan_basic") ? "" : ",然后你交给其等量的牌") +
"。" +
(player.hasMark("zhtongyuan_trick") ? "若其手牌中没有【闪】,则你摸两张牌。" : "")
);
},
dunshi: function (player) {
var info = player.storage.dunshi;
var str = "每回合限一次。你可以视为使用或打出一张";
var list = ["sha", "shan", "tao", "jiu"];
for (var i of list) {
var strx = "【" + get.translation(i) + "】";
if (info && !info[0].includes(i))
strx = '' + strx + "";
str += strx;
if (i != "jiu") str += "/";
}
str +=
",然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。";
return str;
},
dcporui: function (player) {
return (
"每轮限" +
(player.hasMark("dcgonghu_basic") ? "两" : "一") +
"次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】" +
(player.hasMark("dcgonghu_damage") ? "" : ",然后你交给其X张手牌") +
"(X为其本回合失去的牌数且至多为5)。"
);
},
dcmanwang: function (player) {
var num = 4 - player.countMark("dcmanwang");
var str = "出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:";
var list = ["⒈获得〖叛侵〗。", "⒉摸一张牌。", "⒊回复1点体力。", "⒋摸两张牌并失去〖叛侵〗。"];
for (var i = 0; i < 4; i++) {
if (i == num) {
str += '';
}
str += list[i];
}
if (num < 4) str += "";
return str;
},
dcjianzhuan(player) {
let str = "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:";
const list = [
"⒈令一名角色弃置X张牌",
";",
"⒉摸X张牌",
";",
"⒊重铸X张牌",
";",
"⒋弃置X张牌",
],
info = get.info("dcjianzhuan").choices,
storage = player.getStorage("dcjianzhuan");
let choices = [];
for (const k in info) choices.push(k);
for (let i = 0; i < list.length; i++) {
const j = i / 2,
goon = Array.from({ length: list.length })
.map((_, i) => i)
.includes(j);
if (goon && storage.includes(choices[j]))
str += '';
str += list[i];
if (goon && storage.includes(choices[j])) str += "";
}
return (
str +
"(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。"
);
},
},
perfectPair: {},
characterReplace: {
dongbai: ["dongbai", "re_dongbai", "jsrg_dongbai"],
chunyuqiong: ["chunyuqiong", "re_chunyuqiong", "jsrg_chunyuqiong"],
kanze: ["kanze", "re_kanze"],
chendeng: ["ol_chendeng", "re_chendeng", "chendeng", "jsrg_chendeng"],
miheng: ["re_miheng", "miheng"],
liuba: ["ol_liuba", "dc_liuba", "liuba"],
lvkuanglvxiang: ["lvkuanglvxiang", "dc_lvkuanglvxiang"],
dc_huangquan: ["xf_huangquan", "dc_huangquan"],
yuejiu: ["dc_yuejiu", "yuejiu"],
jiling: ["dc_jiling", "tw_jiling", "jiling"],
sp_jiaxu: ["sp_jiaxu", "dc_sp_jiaxu", "yj_jiaxu"],
qiaorui: ["qiaorui", "tw_qiaorui"],
mamidi: ["mamidi", "xin_mamidi"],
mengyou: ["mengyou", "ns_mengyou"],
zhangchu: ["zhangchu", "jsrg_zhangchu"],
xianglang: ["xianglang", "mb_xianglang"],
chengui: ["chengui", "mb_chengui"],
liuyong: ["liuyong", "jsrg_liuyong"],
zhangxuan: ["zhangxuan", "jsrg_zhangxuan"],
gaoxiang: ["gaoxiang", "jsrg_gaoxiang"],
lingcao: ["lingcao", "dc_lingcao"],
sp_menghuo: ["sp_menghuo", "dc_sp_menghuo"],
sunchen: ["dc_sunchen", "pe_sunchen"],
},
translate: {
re_panfeng: "潘凤",
xinkuangfu: "狂斧",
xinkuangfu_info:
"出牌阶段限一次,你可选择:1,弃置装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】造成伤害,你摸两张牌。2,弃置一名其他角色装备区里的一张牌,你使用无对应实体牌的普【杀】。若此【杀】未造成伤害,你弃置两张手牌。(均无距离和次数限制)",
xingdaorong: "邢道荣",
xuxie: "虚猲",
xuxie_info:
"出牌阶段开始时,你可以减1点体力上限并选择所有距离1以内的角色,弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时,若你的体力上限不为全场最多,则你加1点体力上限,然后回复1点体力或摸两张牌。",
caoxing: "曹性",
cxliushi: "流矢",
cxliushi2: "流矢",
cxliushi_info:
"出牌阶段,你可以将一张红桃牌置于牌堆顶,视为对一名角色使用一张【杀】(无距离限制且不计入使用次数)。当此【杀】造成伤害后,受到伤害的角色获得一个“流”。有“流”的角色手牌上限-X(X为其“流”数)。",
zhanwan: "斩腕",
zhanwan_info: "锁定技,有“流”的角色于弃牌阶段弃牌后,你摸等量的牌,然后其移去所有的“流”。",
re_chunyuqiong: "淳于琼",
recangchu: "仓储",
recangchu2: "仓储",
recangchu3: "仓储",
recangchu_info:
"锁定技。①游戏开始时,你获得3个“粮”。你的手牌上限+X(X为“粮”数)。②每回合限一次,当你于回合外得到牌后,你获得一个“粮”。(你的“粮”数不能超过存活角色数)",
reliangying: "粮营",
reliangying_info:
"弃牌阶段开始时,你可以摸至多X张牌,然后交给等量的角色各一张牌。(X为你的“粮”数)",
reshishou: "失守",
reshishou2: "失守",
reshishou_info:
"锁定技,当你使用【酒】时或受到1点火焰伤害后,你移去一个“粮”。准备阶段,若你没有“粮”,你失去1点体力。",
xiahoujie: "夏侯杰",
liedan: "裂胆",
liedan_info:
"锁定技,其他角色的准备阶段开始时,若X大于0,则你摸X张牌。若X等于3,则你加1点体力上限(至多加到8)。若X为0,则你失去1点体力并获得一枚“裂”(X为你的手牌数,体力值,装备区牌数中大于其的数量)。准备阶段,若“裂”数大于4,则你死亡。",
zhuangdan: "壮胆",
zhuangdan_mark: "壮胆",
zhuangdan_info:
"锁定技,其他角色的回合结束时,若你的手牌数为全场唯一最多,则你令〖裂胆〗失效直到你下回合结束。",
dc_caiyang: "蔡阳",
dcxunji: "寻嫉",
dcxunji_info:
"出牌阶段限一次,你可以选择一名其他角色。该角色的下个结束阶段开始时,若其此回合使用过黑色牌,则你视为对其使用一张【决斗】,且当此【决斗】对其造成伤害后,其对你造成等量的伤害。",
dcjiaofeng: "交锋",
dcjiaofeng_info:
"锁定技。每回合限一次,当你造成伤害时,若你本回合内未造成过其他伤害且你已损失的体力值:大于0,则你摸一张牌;大于1,则此伤害+1;大于2,则你回复1点体力。",
zhoushan: "周善",
dcmiyun: "密运",
dcmiyun_tag: "安",
dcmiyun_info:
"锁定技。①一轮游戏开始时,你依次执行:1.若你有“安”,你将包括“安”的在内的任意张手牌交给一名其他角色,然后你将手牌补至体力上限;2.你正面向上获得一名其他角色的一张牌,称为“安”。②当你不因〖密运①〗失去“安”后,你失去1点体力。",
dcdanying: "胆迎",
dcdanying_info:
"每回合限一次。你可以展示“安”,然后视为使用或打出一张【杀】或【闪】。然后当你于本回合下一次成为牌的目标后,使用者弃置你的一张牌。",
re_sunluyu: "孙鲁育",
remeibu: "魅步",
remeibu_info:
"其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌A,该角色于本阶段内拥有〖止息〗,且当其因〖止息〗弃置与牌A花色相同的牌时,你获得之。",
rezhixi: "止息",
rezhixi_info: "锁定技,当你使用【杀】或普通锦囊牌时,你弃置一张手牌。",
remumu: "穆穆",
remumu_info:
"出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌,然后你本回合可使用【杀】的次数+1;2.获得一名角色装备区里的一张牌,然后你本回合可使用【杀】的次数-1。",
re_dongbai: "董白",
relianzhu: "连诛",
relianzhu_info:
"出牌阶段限一次,你可将一张牌正面朝上交给一名其他角色。若此牌为:红色,你摸一张牌;黑色,对方弃置两张牌或令你摸两张牌。",
rexiahui: "黠慧",
rexiahui_info:
"锁定技,①你的黑色牌不计入手牌上限。②当有其他角色获得你的黑色牌后,其于下次扣减体力前不能使用,打出,弃置这些牌。③一名其他角色的回合结束时,若其本回合失去过其所有“黠慧”牌,则其失去1点体力。",
heyan: "何晏",
yachai: "崖柴",
yachai_info:
"当你受到伤害后,你可令伤害来源选择一项:①其本回合不能再使用手牌,然后你摸两张牌;②其展示所有手牌,然后将其手牌中一种花色的所有牌交给你;③弃置一半数量的手牌(向上取整)。",
qingtan: "清谈",
qingtan_info:
"出牌阶段限一次,你可令所有有手牌的角色同时选择一张手牌并同时展示。你可以获得其中一种花色的牌,然后展示此花色牌的角色各摸一张牌。若如此做,弃置其他的牌。",
zhaoyan: "赵嫣",
jinhui: "锦绘",
jinhui_info:
"出牌阶段限一次,你可以随机亮出牌堆中的三张不具有“伤害”标签且使用目标范围为“自己”或“一名角色”的牌,然后选择一名其他角色。该角色选择并按如下“锦绘”规则使用其中一张,然后你可以按如下“锦绘”规则使用剩余的任意张牌:若此牌的使用目标为“自己”,则对自己使用该牌,否则对对方使用该牌(无距离限制且不计入次数限制)。",
qingman: "轻幔",
qingman_info: "锁定技。一名角色的回合结束时,你将手牌摸至X张(X为其装备区中空栏的数量)。",
wangtao: "王桃",
wangyue: "王悦",
huguan: "护关",
huguan_info:
"一名角色于出牌阶段内使用第一张牌时,若此牌为红色,则你可以声明一种花色。该花色的牌不计入其本回合的手牌上限。",
yaopei: "摇佩",
yaopei_info:
"其他角色的弃牌阶段结束时,若你本回合内对其发动过〖护关〗,则你可以弃置一张与其于此阶段弃置的牌花色均不相同的牌。然后你选择一项:①其摸两张牌,你回复1点体力。②其回复1点体力,你摸两张牌。",
mingluan: "鸣鸾",
mingluan_info:
"其他角色的结束阶段开始时,若有角色于本回合内回复过体力,则你可以弃置任意张牌,然后摸X张牌(X为当前角色的手牌数,且至多摸至5张)。",
zhangxuan: "张嫙",
tongli: "同礼",
//tongli_info:'当你于出牌阶段内不因〖同礼〗而使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内不因〖同礼〗而使用过的牌数相等,则你可以于此牌结算结束后依次视为对此牌的所有目标使用X张名称和属性相同的牌(X为你手牌中的花色数)。',
tongli_info:
"当你于出牌阶段内使用基本牌或普通锦囊牌指定第一个目标后,若你手牌中的花色数和你于本阶段内使用过的牌数相等,则你可以令此牌额外结算X次(X为你手牌中的花色数)。",
shezang: "奢葬",
shezang_info:
"每轮限一次。当你或你回合内的其他角色进入濒死状态时,你可以从牌堆中获得每种花色的牌各一张。",
tengyin: "滕胤",
chenjian: "陈见",
chenjian_info:
"准备阶段,你可亮出牌堆顶的3+X张牌(X为你“陈见”标记的数量且至多为2),然后执行以下一至两项:⒈弃置一张牌,然后令一名角色获得与你弃置牌花色相同的牌。⒉使用其中剩余的一张牌。若你执行了所有选项,则你获得一枚“陈见”并重铸所有手牌。",
xixiu: "皙秀",
xixiu_info:
"锁定技。①当你成为其他角色使用牌的目标时,若你的装备区内有和此牌花色相同的牌,则你摸一张牌。②若你装备区内的牌数为1,则其他角色不能弃置你装备区内的牌。",
zhangyao: "张媱",
yuanyu: "怨语",
yuanyu_info:
"出牌阶段限一次。你可以摸一张牌,然后选择一张手牌和一名其他角色。该角色获得如下效果直到你发动〖夕颜〗:{你与该角色的弃牌阶段开始时,或当该角色造成1点伤害后,其须将一张手牌作为“怨”置于你的武将牌上}。然后你将你选择的手牌作为“怨”置于你的武将牌上。",
xiyan: "夕颜",
xiyan_info:
"当有牌作为“怨”移动到你的武将牌上后,若“怨”中的花色数达到4种,则你可以获得所有“怨”。然后若当前回合角色:是你,你本回合手牌上限+4且使用牌无次数限制且重置你的〖怨语〗于此阶段的发动次数;不是你,你可令当前回合角色本回合手牌上限-4且不能使用基本牌。",
xiahoulingnv: "夏侯令女",
fuping: "浮萍",
fuping_info:
"①其他角色对你使用的牌结算结束后,若你未因此技能记录过此牌的名称且你有未废除的装备栏,则你可以废除一个装备栏,记录此牌的名称。②每回合每种牌名限一次。你可以将一张非基本牌当做〖浮萍①〗记录过的基本牌或锦囊牌使用或打出。③若你的所有装备栏均已被废除,则你使用牌无距离限制。",
weilie: "炜烈",
weilie_info:
"每局游戏限X次。出牌阶段,你可以弃置一张牌并选择一名已受伤的角色,令该角色回复1点体力。然后若其体力值小于体力上限,则其摸一张牌(X为你〖浮萍①〗中的记录数+1)。",
dc_sunru: "孙茹",
xiecui: "撷翠",
xiecui_info:
"当有角色于回合内第一次因执行牌的效果而造成伤害时,你可以令此伤害+1。若其势力为吴,则该角色获得此伤害牌对应的实体牌,且其本回合的手牌上限+1。",
youxu: "忧恤",
youxu_info:
"一名角色A的回合结束时,若其手牌数大于体力值,则你可以展示A的一张牌,然后将此牌交给另一名角色B。若B的体力值为全场最少,则B回复1点体力。",
huaxin: "华歆",
wanggui: "望归",
wanggui_info:
"每回合限触发一次,当你造成或受到伤害后,若你:仅明置了此武将牌,则你可对与你势力不同的一名角色造成1点伤害;武将牌均明置,则你可令与你势力相同的角色各摸一张牌。",
spwanggui: "望归",
spwanggui_info:
"①当你受到伤害后,你可以摸一张牌,或和一名势力相同的其他角色各摸一张牌;②每回合限一次,当你造成伤害后,你可以对一名与你势力不同的角色造成1点伤害。",
xibing: "息兵",
xibing_info:
"当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)且本回合不能再使用手牌。",
xibing_info_guozhan:
"当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸至五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。",
luyusheng: "陆郁生",
zhente: "贞特",
zhente2: "贞特",
zhente_info:
"每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.此牌对你无效。",
zhente_info_guozhan:
"每回合限一次,当你成为其他角色使用黑色基本牌或黑色普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用黑色牌;2.此牌对你无效。",
zhiwei: "至微",
zhiwei2: "至微",
zhiwei_info:
"游戏开始时/你的回合开始时,若场上没有因此法被选择过的角色存活,则你选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。",
zhiwei_info_guozhan:
"你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。",
zhanghu: "张虎",
cuijian: "摧坚",
cuijian_info:
"出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你,然后你交给其等量的牌。",
zhtongyuan: "同援",
zhtongyuan_info:
"锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。",
lvlingqi: "吕玲绮",
guowu: "帼舞",
guowu_info:
"出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】或普通锦囊牌可以多指定至多两个目标。",
guowu_info_guozhan:
"出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】可以多指定至多两个目标。",
zhuangrong: "妆戎",
zhuangrong_info:
"觉醒技,一名角色的回合结束时,若你的体力值或手牌数为1,你减1点体力上限并回复体力至上限,将手牌摸至体力上限,然后获得〖神威〗和〖无双〗。",
llqshenwei: "神威",
llqshenwei_info: "锁定技,摸牌阶段开始时,你令额定摸牌数+2;你的手牌上限+2。",
re_kanze: "阚泽",
rekuanshi: "宽释",
rekuanshi_info:
"结束阶段,你可以选择一名角色。你获得如下效果直到你下回合开始:每回合限一次,当其于一回合内受到第2点伤害后,其回复1点体力。",
liuyong: "刘永",
zhuning: "诛佞",
zhuning_info:
"出牌阶段限一次。你可将任意张牌交给一名其他角色(称为“隙”),然后可视为使用一张具有伤害标签的基本牌/锦囊牌(不计入次数限制)。若你以此法使用的牌未造成伤害,则你将〖诛佞〗于本回合内改为“限两次”。",
fengxiang: "封乡",
fengxiang_info:
"锁定技。①当你受到伤害后,若场上:存在“隙”唯一最多的角色,则其回复1点体力;不存在,则你摸一张牌。②当有角色的手牌移动后,若场上“隙”最多的角色因此发生变化,则你摸一张牌。",
fengxiang_tag: "隙",
re_xunchen: "荀谌",
refenglve: "锋略",
refenglve_info:
"出牌阶段限一次,你可以和一名其他角色进行拼点。若你赢,你获得其区域里的两张牌;若平局,则你获得你的拼点牌且令此技能于本阶段内的发动次数上限+1;若你输,其获得你的拼点牌。",
anyong: "暗涌",
anyong_info:
"当一名角色于其回合内第一次造成伤害后,若伤害值为1,则你可弃置一张牌,并对受伤角色造成1点伤害。",
wanniangongzhu: "万年公主",
zhenge: "枕戈",
zhenge_info:
"准备阶段,你可以选择一名角色。该角色本局游戏的攻击范围+1(至多+5)。然后若除其外的所有角色都在该角色的攻击范围内,则你可以令其视为对另一名角色使用一张【杀】。",
xinghan: "兴汉",
xinghan_info:
"锁定技,每回合的第一张【杀】造成伤害后,若此【杀】的使用者成为过〖枕戈〗的目标,则你摸一张牌。若你的手牌数不是全场唯一最多的,则改为摸X张牌(X为该角色的攻击范围且最多为5)。",
re_chendeng: "陈登",
refuyuan: "扶援",
refuyuan_info:
"一名角色成为【杀】的目标后,若其本回合内没有成为过其他红色牌的目标,则你可以令其摸一张牌。",
reyingshui: "营说",
reyingshui_info:
"出牌阶段限一次,你可将一张牌交给攻击范围内的一名其他角色,然后其选择一项:①交给你至少两张装备牌。②受到1点伤害。",
rewangzu: "望族",
rewangzu_info:
"每回合限一次。当你受到其他角色造成的伤害时,你可随机弃置一张手牌,令此伤害-1。若你所在阵营的存活角色数是全场最多的,则你可以自行选择弃置的牌。",
re_miheng: "祢衡",
rekuangcai: "狂才",
rekuangcai_info:
"锁定技。①你于回合内使用牌无距离和次数限制。②弃牌阶段开始时,若你本回合内:未使用过牌,则你本局游戏的手牌上限+1;使用过牌但未造成过伤害,则你本局游戏的手牌上限-1。③结束阶段开始时,你摸X张牌(X为你本回合内造成的伤害且至多为5)。",
reshejian: "舌剑",
reshejian_info:
"每回合限两次。当你成为其他角色使用牌的唯一目标后,你可以弃置至少两张手牌。若如此做,你选择一项:⒈弃置其等量的牌。⒉对其造成1点伤害。",
fengxi: "冯熙",
yusui: "玉碎",
yusui_info:
"当你成为其他角色使用黑色牌的目标后,你可以失去1点体力,然后选择一项:⒈令其将手牌数弃置至与你相同;⒉令其失去Y点体力(Y为其的体力值减去你的体力值,不为正时不可选择)。",
boyan: "驳言",
boyan_info:
"出牌阶段限一次,你可选择一名其他角色。其将手牌摸至体力上限(至多摸至五张),然后其本回合不能使用或打出手牌。",
re_dengzhi: "邓芝",
jianliang: "简亮",
jianliang_info: "摸牌阶段开始时,若你的手牌数不为全场最多,则你可以令至多两名角色各摸一张牌。",
weimeng: "危盟",
weimeng_info:
"出牌阶段限一次,你可以获得一名其他角色的至多X张手牌,然后交给其等量的牌(X为你的体力值)。若你给出的牌点数之和:大于得到的牌,则你摸一张牌;小于得到的牌,弃置该角色区域内的一张牌。",
mamidi: "马日磾",
bingjie: "秉节",
bingjie_info:
"出牌阶段开始时,你可减1点体力上限,然后当你于本阶段内使用【杀】或普通锦囊牌指定其他角色为目标后,其弃置一张牌。若其弃置的牌与你使用的牌颜色相同,其无法响应此牌。",
zhengding: "正订",
zhengding_info:
"锁定技。当你于回合外使用或打出牌响应其他角色使用的牌时,若这两张牌颜色相同,则你加1点体力上限并回复1点体力。",
dc_jiben: "吉本",
xunli: "询疠",
xunli_info:
"锁定技。①当有黑色牌因弃置而进入弃牌堆后,若X大于0,则你将其中的X张牌置于武将牌上作为“疠”(X=min(这些牌的数量,9-Y),Y=你的“疠”数)。②出牌阶段开始时,你可以用任意张黑色手牌交换等量的“疠”。",
zhishi: "指誓",
zhishi_info:
"结束阶段,你可选择一名角色。当该角色于你的下回合开始前{成为【杀】的目标后或进入濒死状态时},你可移去任意张“疠”,然后其摸等量的牌。",
lieyi: "烈医",
lieyi_info:
"出牌阶段限一次。你可以展示所有“疠”并选择一名其他角色,对其使用其中的一张可对其使用的牌(无距离和次数限制)并重复此流程,并将其余的牌置于弃牌堆。然后若其存活且未于此流程中因受到伤害而进入过濒死状态,则你失去1点体力。",
guanning: "管宁",
dunshi: "遁世",
dunshi_info:
"每回合限一次。你可以视为使用或打出一张【杀】/【闪】/【桃】/【酒】,然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。",
dc_gaolan: "高览",
xizhen: "袭阵",
xizhen_info:
"出牌阶段开始时,你可选择一名其他角色,视为对其使用【杀】或【决斗】。然后当有角色于本阶段内使用或打出牌响应你时,该角色回复1点体力,你摸一张牌(若其满体力,改为两张)。",
dc_huangchengyan: "黄承彦",
dcjiezhen: "解阵",
dcjiezhen_info:
"出牌阶段限一次,你可选择一名其他角色。该角色获得〖八阵〗,且其所有不为{锁定技、限定技、觉醒技、主公技、带有Charlotte标签}的技能失效。你的下回合开始时,或其因〖八卦阵〗发起的判定结算结束后,你令其恢复其以此法失效的所有技能并失去以此法获得的〖八阵〗,然后获得其区域内的一张牌。",
dczecai: "择才",
dczecai_info:
"限定技。一轮游戏开始时,若游戏轮数大于1,则你可令一名其他角色获得〖集智〗直到下一轮游戏开始;若其是上一轮内使用过锦囊牌数量唯一最多的角色,则其获得一个额外的回合。",
dcyinshi: "隐世",
dcyinshi_info:
"锁定技。①每回合限一次,当你受到伤害时,若此伤害的渠道不为有颜色的牌,则你防止此伤害。②当有因〖八卦阵〗发起的判定的判定牌生效时,你获得此判定牌。",
tenggongzhu: "滕公主",
xingchong: "幸宠",
xingchong_info:
"一轮游戏开始时,你可声明两个自然数X和Y,且(X+Y)≤min(5, 你的体力上限)。你摸X张牌并展示Y张手牌。若如此做,当你于本轮内失去一张以此法展示的牌后,你摸两张牌。",
liunian: "流年",
liunian_info:
"锁定技。一名角色的回合结束时,若本回合内进行了本次游戏的第一次洗牌,则你加1点体力上限;若本回合内进行了本次游戏的第二次洗牌,则你于本回合结束时回复1点体力,且本局游戏内的手牌上限+10。",
caimaozhangyun: "蔡瑁张允",
lianzhou: "连舟",
lianzhou_info: "锁定技。准备阶段,你横置你的武将牌。然后你可横置任意名体力值等于你的角色。",
jinglan: "惊澜",
jinglan_info:
"锁定技。当你造成伤害后,若你的手牌数:大于体力值,你弃置四张手牌;等于体力值,你弃置一张牌并回复1点体力;小于体力值,你受到1点无来源火焰伤害并摸五张牌。",
dc_yanghu: "羊祜",
dcdeshao: "德劭",
dcdeshao_info:
"每回合限两次。当你成为其他角色使用的黑色牌的目标后,你可以摸一张牌,然后若其手牌数不小于你,则你弃置其一张牌。",
dcmingfa: "明伐",
dcmingfa_info:
"①出牌阶段限一次。当你使用【杀】或普通锦囊牌结算结束后,若你的武将牌上没有“明伐”牌,则你可以将此牌作为“明伐”牌置于武将牌上并选择一名其他角色,记录该角色和此牌的名称。②一名角色的回合结束时,若其是你〖明伐①〗记录的角色,则你视为对其依次使用X张〖明伐①〗记录的牌,然后移去“明伐”牌(X为其手牌数且至少为1,至多为5)。③一名角色死亡时,若其是你〖明伐①〗记录的角色,则你移去“明伐”牌。",
dc_jiling: "纪灵",
dcshuangren: "双刃",
dcshuangren_info:
"出牌阶段开始时,你可以和一名其他角色A进行拼点。若你赢,你选择一名角色B,或选择包含A在内的两名角色A和B(B的势力需与A相同),然后视为对被选择的角色使用一张【杀】(不计入次数限制);若你没赢,则你本阶段内不能使用【杀】。",
zhangxun: "张勋",
suizheng: "随征",
suizheng_info:
"结束阶段,你可以选择一名角色A,获得如下效果直到其下回合结束:①A于下回合出牌阶段内使用【杀】的次数上限+1且无距离限制;②A下回合的出牌阶段结束时,你可以选择一名此阶段内受到过A造成的伤害的角色B,视为对B使用一张【杀】。",
dc_liuba: "刘巴",
dczhubi: "铸币",
dczhubi_info:
"当有♦牌因弃置而进入弃牌堆后,你可以令系统从牌堆/弃牌堆中检索一张【无中生有】,并将此牌置于牌堆顶。",
dcliuzhuan: "流转",
dcliuzhuan_tag: "转",
dcliuzhuan_info:
"锁定技。①其他角色于其回合内不于摸牌阶段而得到的牌称为“转”。②你不能成为实体牌中包含“转”的牌的目标。③当有“转”直接进入弃牌堆或经由处理区进入弃牌堆后,你获得之。",
huzhao: "胡昭",
midu: "弥笃",
midu_info:
"出牌阶段限一次。你可以选择一项:⒈废除任意个装备栏或判定区,并令一名角色摸等量的牌。⒉恢复一个已经被废除的装备栏或判定区,然后你获得〖活墨〗直到下回合开始。",
xianwang: "贤望",
xianwang_info:
"锁定技。若你有被废除的装备栏,则其他角色至你的距离+1,你至其他角色的距离-1;若废除的装备栏数大于2,则改为距离+2/-2。",
guanhai: "管亥",
suoliang: "索粮",
suoliang_info:
"每回合限一次。当你对其他角色造成伤害后,你可以选择并展示其的至多X张牌(X为其体力上限且至多为5)。若这些牌中有♥或♣牌,则你获得这些牌;否则你弃置这些牌。",
qinbao: "侵暴",
qinbao_info: "锁定技。当你使用【杀】或普通锦囊牌时,你令所有手牌数不小于你的角色不能响应此牌。",
dc_lvkuanglvxiang: "吕旷吕翔",
dcshuhe: "数合",
dcshuhe_info:
"出牌阶段限一次,你可以展示一张手牌并获得一枚“爵”。若场上有与此牌点数相同的牌,则你获得这些牌;否则你将此牌交给一名其他角色。",
dcliehou: "列侯",
dcliehou_info:
"锁定技。摸牌阶段开始时,你令额定摸牌数+X;然后此摸牌阶段结束时,你选择一项:⒈弃置X张牌。⒉失去1点体力(X为你的“爵”数+1且至多为5)。",
yinfuren: "尹夫人",
dcyingyu: "媵予",
dcyingyu_info:
"准备阶段开始时,你可以展示两名角色的各一张手牌。若这两张牌的花色不同,则你可以令一名角色获得另一名角色的展示牌。",
dcyongbi: "拥嬖",
dcyongbi_info:
"限定技。出牌阶段,你可以将所有手牌交给一名其他男性角色。你将〖媵予〗的发动时机改为“准备阶段和结束阶段开始时”。然后若这些牌中包含的花色数:大于1,则你与其本局游戏的手牌上限+2;大于2,则当你或其于本局游戏内受到大于1的伤害时,此伤害-1。",
dc_huangquan: "黄权",
dcquanjian: "劝谏",
dcquanjian_info:
"出牌阶段每项各限一次。你可以选择一项流程并选择一名其他角色A:⒈令A对其攻击范围内的另一名角色B造成1点伤害。⒉令A将手牌数调整至手牌上限(至多摸至五张),且其本回合内不能使用手牌。然后A选择一项:⒈执行此流程。⒉本回合下次受到的伤害+1。",
dctujue: "途绝",
dctujue_info:
"限定技。当你进入濒死状态时,你可以将所有牌交给一名其他角色。然后你回复等量的体力并摸等量的牌。",
chengui: "陈珪",
dcyingtu: "营图",
dcyingtu_info:
"每回合限一次。当你的上家/下家于摸牌阶段外得到牌后,你可以获得其一张牌,然后将一张牌交给你的下家/上家。若你给出的牌为装备牌,则其使用之。",
dccongshi: "从势",
dccongshi_info:
"锁定技。一名角色使用的装备牌结算结束后,若其装备区内的牌数为全场最多,则你摸一张牌。",
wanglie: "王烈",
dcchongwang: "崇望",
dcchongwang_info:
"其他角色使用基本牌或普通锦囊牌时,若你是本局游戏内上一张被使用的牌的使用者,则你可以选择一项:⒈令其于此牌结算结束后收回此牌对应的所有实体牌;⒉取消此牌的所有目标。",
dchuagui: "化归",
dchuagui_info:
"出牌阶段开始时,你可以选择至多X名有牌的其他角色(X为场上每个阵营中最大阵营的人数,且你的选择结果不展示)。这些角色同时选择一项:⒈交给你一张牌,⒉展示一张牌。若这些角色均选择选项二,则你获得所有展示牌。",
gongsundu: "公孙度",
dczhenze: "震泽",
dczhenze_info:
"弃牌阶段开始时,你可以选择一项:1.令所有手牌数与体力值大小关系与你不同的角色失去1点体力;2.令所有手牌数和体力值关系与你相同的角色回复1点体力。",
dcanliao: "安辽",
dcanliao_info: "出牌阶段限X次(X为群势力角色数)。你可以重铸一名角色的一张牌。",
dc_yuejiu: "乐就",
dccuijin: "催进",
dccuijin_info:
"当你或你攻击范围内的角色使用【杀】或【决斗】时,你可以弃置一张牌,令此牌的伤害基数+1。然后当此牌被目标角色抵消或无效或防止伤害后,你摸两张牌并对使用者造成1点伤害。",
panghui: "庞会",
dcyiyong: "异勇",
dcyiyong_info:
"当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。",
chenjiao: "陈矫",
dcxieshoux: "协守/清严",
dcxieshou: "协守",
dcxieshou_info:
"每回合限一次。当一名角色受到伤害后,若你至其的距离不大于2,你可以令你的手牌上限-1,然后其选择一项:1.回复1点体力;2.复原,摸两张牌。",
dcqingyan: "清严",
dcqingyan_info:
"每回合限两次。当你成为其他角色使用黑色牌的目标后,若你的手牌数:小于体力值,你可以将手牌补至体力上限;不小于体力值,你可以弃置一张牌令你的手牌上限+1。",
dcqizi: "弃子",
dcqizi_info: "锁定技。你不能对至其的距离大于2且正在进行濒死流程的角色使用【桃】。",
leibo: "雷薄",
dcsilve: "私掠",
dcsilve_info:
"游戏开始时,你选择一名其他角色(对其他角色不可见),称为“私掠”角色。然后你获得以下效果:①当“私掠”角色造成伤害后,若你本回合未因此效果得到过受伤角色的牌,你可以获得受伤角色一张牌;②当“私掠”角色受到其他角色造成的伤害后,若伤害来源存活,你须对伤害来源使用一张【杀】(无距离限制),否则你弃置一张手牌。",
dcshuaijie: "衰劫",
dcshuaijie_info:
"限定技。出牌阶段,若你的体力值与装备区里的牌数均大于“私掠”角色,或没有角色有“私掠”,你可以减1点体力上限,然后选择一项:1.获得“私掠”角色至多三张牌;2.从牌堆随机获得三张类型各不同的牌。最后将你的“私掠”角色改为你。",
dc_sp_jiaxu: "新杀SP贾诩",
dc_sp_jiaxu_prefix: "新杀SP",
dcjianshu: "间书",
dcjianshu_info:
"出牌阶段限一次。你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,你令前者与后者拼点。赢的角色随机弃置一张牌,没赢的角色失去1点体力。若有角色因此死亡,你令你〖间书〗于此阶段发动的次数上限+1。",
dcyongdi: "拥嫡",
dcyongdi_info:
"限定技。出牌阶段,你可以选择一名男性角色,若其:体力上限最少,其加1点体力上限;体力值最少,其回复1点体力;手牌数最少,其摸X张牌(X为其体力上限且至多为5)。",
liupi: "新杀刘辟",
liupi_prefix: "新杀",
dcjuying: "踞营",
dcjuying_info:
"出牌阶段结束时,若你于此阶段内使用【杀】的次数未达到上限,你可以选择任意项:1.下回合使用【杀】的次数上限+1;2.本回合手牌上限+2;3.摸三张牌。若你选择的项数超过了你的体力值,你弃置一张牌。",
dc_huanghao: "新杀黄皓",
dc_huanghao_prefix: "新杀",
dcqinqing: "寝情",
dcqinqing_info:
"结束阶段,你可以弃置一名攻击范围内包含一号位的其他角色一张牌。然后若其手牌数大于一号位,你摸一张牌。",
dccunwei: "存畏",
dccunwei_info:
"锁定技。当你成为其他角色使用的锦囊牌的目标后,若你是唯一目标,你摸一张牌;否则你弃置一张牌。",
dc_zhaotongzhaoguang: "赵统赵广",
dcqingren: "青刃",
dcqingren_info: "结束阶段,你可以摸X张牌(X为你本回合发动〖翊赞〗的次数)。",
dclongyuan: "龙渊",
dclongyuan_info:
"锁定技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。",
zhenghun: "郑浑",
dcqiangzhi: "强峙",
dcqiangzhi_info:
"出牌阶段限一次。你可以弃置你和一名其他角色的共计三张牌。然后若你与其之中有角色因此失去了三张牌,该角色对另一名角色造成1点伤害。",
dcpitian: "辟田",
dcpitian_info:
"①当你的牌被弃置后,或当你受到伤害后,你的手牌上限+1。②结束阶段,若你的手牌数小于手牌上限,你可以摸至手牌上限(至多摸五张),然后重置因〖辟田①〗增加的手牌上限。",
furongfuqian: "傅肜傅佥",
dcxuewei: "血卫",
dcxuewei_info:
"结束阶段,你可以选择一名体力值不大于你的角色,然后你获得如下效果直到你的下回合开始时:当其受到伤害时,防止此伤害,然后你失去1点体力,你与其各摸一张牌(若该角色为你,则改为你摸一张牌)。",
dcyuguan: "御关",
dcyuguan_info:
"一名角色的回合结束时,若你已损失的体力值为全场最多,你可以减1点体力上限,然后令至多X名角色将手牌摸至体力上限(X为你已损失的体力值)。",
qinlang: "秦朗",
dchaochong: "昊宠",
dchaochong_info:
"当你使用牌后,你可以将手牌摸至或弃置至你的手牌上限数(至多摸五张)。然后若你以此法:得到牌,你的手牌上限-1;失去牌,你的手牌上限+1。",
dcjinjin: "矜谨",
dcjinjin_info:
"每回合限两次。当你造成或受到伤害后,你可以重置因〖昊宠〗增加或减少的手牌上限,令伤害来源弃置至多X张牌,然后你摸Y张牌(X为你以此法变化的手牌上限且至少为1,Y为X减其以此法弃置的牌数)。",
xianglang: "向朗",
dckanji: "勘集",
dckanji_info:
"出牌阶段限两次。你可以展示所有手牌,若花色均不同,你摸两张牌。然后若你的手牌因此包含了四种花色,你跳过下一个弃牌阶段。",
dcqianzheng: "愆正",
dcqianzheng_info:
"每回合限两次。当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以重铸两张牌。若你以此法重铸的牌中没有与指定你为目标的牌类别相同的牌,你于此牌对应的实体牌进入弃牌堆后获得此牌对应的所有实体牌。",
qiaorui: "桥蕤",
dcaishou: "隘守",
dcaishou_tag: "隘",
dcaishou_info:
"①结束阶段,你可以摸X张牌,称为“隘”(X为你的体力上限)。②准备阶段,你弃置所有“隘”,若你以此法弃置的牌数大于体力值且你的体力上限小于9,你加1点体力上限。③当你于回合外失去最后一张“隘”后,你减1点体力上限。",
dcsaowei: "扫围",
dcsaowei_info:
"当一名其他角色使用【杀】结算结束后,若此牌的目标角色不包含你且均在你的攻击范围内,你可以将一张“隘”当做【杀】对所有目标角色使用。以此法转化的【杀】结算完毕后,若此【杀】造成过伤害,你获得此【杀】对应的实体牌。",
yuantanyuanxiyuanshang: "袁谭袁尚袁熙",
dcneifa: "内伐",
dcneifa_info:
"出牌阶段开始时,你可以摸三张牌,然后弃置一张牌。若你弃置的牌类型为:基本牌,本阶段你不能使用锦囊牌,且【杀】的使用次数上限+X且可以额外指定一名目标;锦囊牌,本阶段你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5。你以此法选择的额外目标均无距离限制)。",
dc_sunziliufang: "新杀孙资刘放",
dc_sunziliufang_prefix: "新杀",
dcqinshen: "勤慎",
dcqinshen_info: "弃牌阶段结束时,你可以摸X张牌(X为本回合未进入过弃牌堆的花色数)。",
dcweidang: "伪谠",
dcweidang_info:
"其他角色的结束阶段,你可以将一张字数为X的牌置于牌堆底,然后获得牌堆里一张字数为X的牌(X为本回合未进入过弃牌堆的花色数)。若你能使用此牌,你使用之。",
mengjie: "孟节",
dcyinlu: "引路",
dcyinlu_info:
"①游戏开始时,你令三名角色依次分别获得“乐泉”、“藿溪”、“瘴气”标记(若场上角色数为2则改为令一名其他角色获得其中2枚,你获得剩余标记),然后你获得“芸香”标记并获得1点“芸香”值。②准备阶段/有〖引路〗标记的角色死亡时,你可以移动一名角色的1枚/其的所有〖引路〗标记。",
dcyinlu_lequan: "乐泉",
dcyinlu_lequan_info: "结束阶段,你可以弃置一张♦牌并回复1点体力。",
dcyinlu_huoxi: "藿溪",
dcyinlu_huoxi_info: "结束阶段,你可以弃置一张♥牌并摸两张牌。",
dcyinlu_zhangqi: "瘴气",
dcyinlu_zhangqi_info: "锁定技。结束阶段,你须弃置一张♠牌,否则失去1点体力。",
dcyinlu_yunxiang: "芸香",
dcyinlu_yunxiang_info:
"①结束阶段,你可以弃置一张♣牌,获得1点“芸香”值。②当你受到伤害时,你可以扣减所有“芸香”值,减少等量的伤害。",
dcyouqi: "幽栖",
dcyouqi_info: "锁定技。当其他角色因〖引路〗标记弃置牌后,你有一定概率获得此牌。",
dcyouqi_faq: "〖幽栖〗概率
",
dcyouqi_faq_info:
"当满足〖幽栖〗条件时,系统生成一个随机数X∈[0,1)。若X小于(1.25-0.25Y),或幸运星模式已开启,你获得此牌(Y为你至该角色的距离)。",
dc_sunhanhua: "孙寒华",
dchuiling: "汇灵",
dchuiling_info:
"锁定技。当你使用牌时,若此牌颜色为弃牌堆中数量较少的颜色,你获得1枚“灵”标记。若弃牌堆中:红色牌数大于黑色牌数,你回复1点体力;黑色牌数大于红色牌数,你可以弃置一名其他角色的一张牌。",
dcchongxu: "冲虚",
dcchongxu_info:
"限定技。出牌阶段,若“灵”数不小于4,你可以失去〖汇灵〗,增加等同于“灵”数的体力上限(至多增加场上人数的体力上限),然后获得〖踏寂〗和〖清荒〗。",
dctaji: "踏寂",
dctaji_info:
"当你失去手牌后,根据你失去牌的原因执行以下效果:1.使用:你弃置其他角色一张牌;2.打出:你摸一张牌;3.弃置:你回复1点体力;4.其他:你下一次对其他角色造成伤害时,此伤害+1。",
dcqinghuang: "清荒",
dcqinghuang_info:
"出牌阶段开始时,你可以减1点体力上限,然后你于本回合发动〖踏寂〗时额外随机执行一种效果。",
dc_huojun: "霍峻",
dcgue: "孤扼",
dcgue_info:
"每回合限一次。当你需要于回合外使用或打出【杀】或【闪】时,你可以发动此技能:你展示所有手牌,若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。",
dcsigong: "伺攻",
dcsigong_info:
"其他角色的回合结束时,若其于本回合内使用牌被响应过,你可以将手牌摸至或弃置至1,视为对其使用一张需使用X张【闪】抵消的【杀】,且此【杀】的伤害基数+1(X为你以此法弃置的牌数且至少为1)。当你以此法造成伤害后,该技能于本轮失效。",
peiyuanshao: "裴元绍",
oldmoyu: "没欲",
oldmoyu_info:
"出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】,且此【杀】伤害基数为X(X为你于本回合发动此技能的次数)。若此【杀】对你造成了伤害,你令此技能于本回合失效。",
dcmoyu: "没欲",
dcmoyu_info:
"出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】。若此【杀】:未对你造成过伤害,你将此技能于此阶段下次获得的牌数改为两张;对你造成过伤害,你令此技能于本回合失效。",
zhangchu: "张楚",
dcjizhong: "集众",
dcjizhong_info:
"出牌阶段限一次。你可以令一名其他角色摸两张牌,然后其选择一项:1.若其没有“信众”标记,其获得“信众”标记;2.交给你三张手牌。",
dcrihui: "日彗",
dcrihui_info:
"每回合限一次。当你使用普通锦囊牌或黑色基本牌结算结束后,若此牌的目标数为1且目标不为你,且其:没有“信众”,则所有有“信众”的角色依次视为对其使用一张与此牌牌名和属性相同的牌;有“信众”,则你可以获得其区域里的一张牌。",
dcguangshi: "光噬",
dcguangshi_info: "锁定技。准备阶段,若所有其他角色均有“信众”,你摸两张牌并失去1点体力。",
dongwan: "董绾",
dcshengdu: "生妒",
dcshengdu_info:
"回合开始时,你可以选择一名其他角色,令其获得1枚“生妒”标记。有“生妒”标记的角色于摸牌阶段得到牌后,你摸X张牌,然后其移去所有“生妒”标记(X为摸牌数乘以其拥有的“生妒”标记数)。",
dcjieling: "介绫",
dcjieling_info:
"出牌阶段每种花色限一次,你可以将两张花色不同的手牌当无距离限制且无任何次数限制的【杀】使用。然后若此【杀】:造成了伤害,所有目标角色失去1点体力;未造成伤害,所有目标角色依次获得1枚“生妒”标记。",
yuanyin: "袁胤",
dcmoshou: "墨守",
dcmoshou_info:
"当你成为其他角色使用的黑色牌的目标后,你可以摸X张牌(X为你本局游戏此前发动过此技能的次数÷3的余数+1)。",
dcyunjiu: "运柩",
dcyunjiu_info:
"一名角色死亡后,你可以弃置等同于其因死亡事件的规则而弃置的牌数,将其此次弃置的牌交给一名其他角色。然后你加1点体力上限并回复1点体力。",
gaoxiang: "高翔",
dcchiying: "驰应",
dcchiying_info:
"出牌阶段限一次。你可以选择一名体力不大于你的角色,令其攻击范围内的其他角色依次弃置一张牌。然后若你选择的角色不为你,其获得以此法弃置的牌中所有的基本牌。",
zhangkai: "张闿",
dcxiangshu: "相鼠",
dcxiangshu_info:
"其他角色的出牌阶段开始时,若其手牌数不小于其体力值,你可以选择一个不大于5的非负整数,然后你弃置一张牌或声明此数字。若如此做,此阶段结束时,若其手牌数与你选择的数字:差值不大于1,你获得其一张牌;相等,你对其造成1点伤害。",
mengyou: "孟优",
dcmanzhi: "蛮智",
dcmanzhi_info:
"①准备阶段,你可以选择一名其他角色并选择一项:1.令其交给你两张牌,然后其视为使用一张无距离限制的【杀】;2.获得其区域内至多两张牌,然后交给其等量的牌并摸一张牌。②结束阶段,若你的体力值与本回合准备阶段时的体力值相等,你可以执行你未于本回合执行过的〖蛮智①〗的分支。",
dc_sunchen: "孙綝",
dczigu: "自固",
dczigu_info:
"出牌阶段限一次。你可以弃置一张牌,然后获得场上的一张装备牌。若你没有因此获得其他角色的牌,你摸一张牌。",
dczuowei: "作威",
dczuowei_info:
"当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌且不能于本回合再触发该选项(X为你装备区里牌的数量且至少为1)。",
liuchongluojun: "刘宠骆俊",
dcminze: "悯泽",
dcminze_info:
"①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)。",
dcjini: "击逆",
dcjini_info:
"当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。",
yuechen: "乐綝",
dcporui: "破锐",
dcporui_info:
"每轮限一次。其他角色的结束阶段,你可以弃置一张牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为其本回合失去的牌数且至多为5)。",
dcgonghu: "共护",
dcgonghu_info:
"锁定技。①当你于回合外失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你造成或受到伤害后,若你本回合内造成或受到的总伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。",
yue_caiwenji: "乐蔡琰",
yue_caiwenji_prefix: "乐",
dcshuangjia: "霜笳",
dcshuangjia_tag: "胡笳",
dcshuangjia_info:
"锁定技。①游戏开始,你将你的手牌标记为“胡笳”。②你的“胡笳”牌不计入手牌上限。③其他角色至你的距离+X(X为你的“胡笳”数且至多为5)。",
dcbeifen: "悲愤",
dcbeifen_info:
"锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。",
dc_wuban: "吴班",
dcyouzhan: "诱战",
dcyouzhan_info:
"锁定技。当其他角色于你的回合内失去一张牌后,你摸一张牌(不计入本回合的手牌上限),且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数且至多为3)。",
yue_zhoufei: "乐周妃",
yue_zhoufei_prefix: "乐",
dclingkong: "灵箜",
dclingkong_tag: "箜篌",
dclingkong_info:
"锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于一回合内首次于摸牌阶段外得到牌后,你将这些牌标记为“箜篌”。",
dcxianshu: "贤淑",
dcxianshu_info:
"出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色,然后你摸X张牌(X为你与其的体力值之差且至多为5)。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。",
dc_zhangmancheng: "张曼成",
dclvecheng: "掠城",
dclvecheng_info:
"出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。",
dczhongji: "螽集",
dczhongji_info:
"当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。",
dc_jiachong: "贾充",
dcbeini: "悖逆",
dcbeini_info:
"出牌阶段限一次。你可以将手牌调整至体力上限,然后令一名角色视为对另一名角色使用一张【杀】,且这些角色的非锁定技失效直到回合结束。",
dcshizong: "恃纵",
dcshizong_info:
"当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。",
pangshanmin: "庞山民",
dccaisi: "才思",
dccaisi_info:
"当你于回合内/回合外使用基本牌结算结束后,你可以从牌堆/弃牌堆随机获得一张非基本牌,然后若你本回合发动此技能的次数:小于你的体力上限,本回合你发动此技能获得的牌数+1;大于等于你的体力上限,本回合此技能失效。",
dczhuoli: "擢吏",
dczhuoli_info:
"锁定技。一名角色的回合结束时,若你本回合使用或获得的牌数大于体力值,你加1点体力上限(不能超过游戏人数),回复1点体力。",
yue_caiyong: "乐蔡邕",
yue_caiyong_prefix: "乐",
dcjiaowei: "焦尾",
dcjiaowei_tag: "弦",
dcjiaowei_info:
"锁定技。①游戏开始时,你将所有手牌标记为“弦”。②你的“弦”牌不计入手牌上限。③当你受到伤害时,若来源的手牌数不大于你的“弦”牌数,防止此伤害。",
dcfeibai: "飞白",
dcfeibai_info:
"每回合限一次。当你使用牌结算结束后,若你本回合使用过至少两张牌,你可以随机获得一张字数为X的牌。若你的“弦”数不大于X,你重置〖飞白〗(X为此牌与你使用的上一张牌的字数之和)。",
kuaiqi: "蒯祺",
dcliangxiu: "良秀",
dcliangxiu_info:
"出牌阶段,你可以弃置两张不同类型的牌,然后从两张与你弃置的牌类型均不同的牌中选择一张获得之(每阶段每种类型限一次)。",
dcxunjie: "殉节",
dcxunjie_info:
"每轮每项限一次。一名角色的回合结束时,若你本回合于摸牌阶段外得到过牌,你可以选择一项:1.令一名角色将手牌数摸或弃置至与其体力值相同;2.令一名角色将体力回复或失去至与其手牌数相同。",
dc_dongzhao: "董昭",
dcyijia: "移驾",
dcyijia_info:
"一名角色受到伤害后,若你至其的距离不大于1,你可以将场上一张装备牌移动至其对应装备栏(替换原装备)。若其因此脱离了一名角色的攻击范围,你摸一张牌。",
dcdingji: "定基",
dcdingji_info:
"准备阶段,你可以令一名角色将手牌摸或弃置至五张,然后其展示手牌。若牌名均不同,则其可以视为使用其中一张基本或普通锦囊牌。",
yue_xiaoqiao: "乐小乔",
yue_xiaoqiao_prefix: "乐",
dcqiqin: "绮琴",
dcqiqin_tag: "琴",
dcqiqin_info:
"锁定技。①游戏开始时,你将所有手牌标记为“琴”。②你的“琴”牌不计入手牌上限。③准备阶段,你获得位于弃牌堆的所有“琴”。",
dcweiwan: "媦婉",
dcweiwan_info:
"出牌阶段限一次,你可以弃置一张“琴”并随机获得一名其他角色区域内花色与此牌不相同的牌各一张,若你获得了:一张牌,其失去1点体力;两张牌,本回合你对其使用牌无距离和次数限制;三张牌,本回合你不能对其使用牌。",
dc_lingcao: "新杀凌操",
dc_lingcao_prefix: "新杀",
dcdufeng: "独锋",
dcdufeng_info:
"锁定技。出牌阶段开始时,你失去1点体力或废除一个装备栏,摸X张牌,然后你的攻击范围与使用【杀】的次数上限均为X直到回合结束(X为你已废除的装备栏数与损失的体力值之和,至多为你的体力上限)。",
dc_sp_menghuo: "群孟获",
dc_sp_menghuo_prefix: "群",
dcmanwang: "蛮王",
dcmanwang_info:
"出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。",
dcpanqin: "叛侵",
dcpanqin_info:
"出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项,然后加1点体力上限并回复1点体力。",
dc_kongrong: "孔融",
dckrmingshi: "名士",
dckrmingshi_info:
"锁定技,当你受到其他角色造成的伤害时,若其手牌数大于你,则其需弃置一张手牌,否则此伤害-1。",
yue_daqiao: "乐大乔",
yue_daqiao_prefix: "乐",
dczixi: "姊希",
dczixi_info:
"①出牌阶段开始和结束时,你可以将一张“琴”当作一张无效果的【乐不思蜀】、【兵粮寸断】或【闪电】置于一名角色的判定区。②当你使用基本牌或普通锦囊牌指定唯一目标后,你可根据其判定区内的牌数执行对应项:1.令此牌对其额外结算一次;2.摸两张牌;3.弃置其判定区所有牌,对其造成3点伤害。",
jiangfei: "蒋琬费祎",
dcshengxi: "生息",
dcshengxi_info: "弃牌阶段结束时,若你本回合未造成过伤害,你可以摸两张牌。",
dcshoucheng: "守成",
dcshoucheng_info: "每回合限一次,当一名角色于其回合外失去手牌后,若其没有手牌,你可令其摸两张牌。",
dc_liuli: "刘理",
dcfuli: "抚黎",
dcfuli_info:
"出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。若你因此弃置了伤害类卡牌,则你可以选择一名角色,令其攻击范围-1直到你的下个回合开始。",
dcdehua: "德化",
dcdehua_info:
"锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。",
gongsunxiu: "公孙修",
dcgangu: "干蛊",
dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。",
dckuizhen: "溃阵",
dckuizhen_info:
"出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。",
dc_jiangji: "蒋济",
dcshiju: "势举",
dcshiju_info:
"其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。",
dcyingshi: "应时",
dcyingshi_info:
"每回合每项各限一次。当你使用普通锦囊牌指定目标后,你可令其中一个目标选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。",
dc_wangling: "王淩",
dcjichou: "集筹",
dcjichou_info:
"出牌阶段结束时,若你于此阶段使用过牌且这些牌的牌名均不同,你可以观看位于弃牌堆中的这些牌,选择任意张牌并选择等量角色,将这些牌交给这些角色各一张,然后你摸X张牌(X为你本局游戏首次发动〖集筹〗给出的牌数)。",
dcmouli: "谋立",
dcmouli_info:
"觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数不小于5,你加1点体力上限并回复1点体力,然后获得〖自缚〗。",
dczifu: "自缚",
dczifu_info:
"锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。",
dc_simashi: "司马师",
dcsanshi: "散士",
dcsanshi_tag: "死士",
dcsanshi_info:
"锁定技。①第一轮游戏开始时,你令系统将牌堆中每个点数的随机一张牌永久标记为“死士”(“死士”对你可见)。②一名角色的回合结束时,若本回合有“死士”不因你使用或打出而进入弃牌堆,你于弃牌堆中获得这些牌。③你使用“死士”不能被响应。",
dczhenrao: "震扰",
dczhenrao_info:
"每回合每名角色限一次。当你使用牌指定第一个目标后,若目标角色包含其他角色,或当其他角色使用牌指定你为目标后,你可以选择手牌数大于你的其中一个目标或此牌的使用者,然后对其造成1点伤害。",
dcchenlve: "沉略",
dcchenlve_info:
"限定技。出牌阶段,你可以将牌堆、弃牌堆、场上及其他角色的手牌区里的所有“死士”置入处理区,然后你获得这些牌。若如此做,你获得如下效果:1.此回合结束时,你将这些牌移出游戏;2.当你死亡时,你将所有以此法移出游戏的“死士”置入弃牌堆。",
dc_caoshuang: "新杀曹爽",
dc_caoshuang_prefix: "新杀",
dcjianzhuan: "渐专",
dcjianzhuan_info:
"锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:⒈令一名角色弃置X张牌;⒉摸X张牌;⒊重铸X张牌;⒋弃置X张牌(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。",
dcjianzhuan_faq: "渐专概率",
dcjianzhuan_faq_info:
"
当系统随机选择要删除的选项时,“弃置X张牌”的选项概率固定为90%;剩余选项平分剩余的的10%概率。
如第一次删除时,删除弃牌选项概率为90%,其余三个选项被删除的概率均为3.33%,若删除了非弃牌选项,第二次删除时,删除弃牌选项的概率依旧是90%,其余两个选项被删除的概率均为5%。",
dcfanshi: "返势",
dcfanshi_info:
"觉醒技,结束阶段,若〖渐专①〗剩余选项数小于2,则你执行三次X视为1的剩余选项,然后增加2点体力上限并回复2点体力,失去技能〖渐专〗并获得技能〖覆斗〗。",
dcfudou: "覆斗",
dcfudou_info:
"当你使用黑色牌/红色牌指定唯一目标后,若该角色不为你,且其于本局游戏对你/未对你造成过伤害,则你可以与其各失去1点体力/各摸一张牌。",
sp_baigei: "无双上将",
sp_caizijiaren: "才子佳人",
sp_zhilan: "芝兰玉树",
sp_zongheng: "纵横捭阖",
sp_guixin: "天下归心",
sp_jianghu: "江湖之远",
sp_daihan: "代汉涂高",
sp_taiping: "太平甲子",
sp_yanhan: "匡鼎炎汉",
sp_jishi: "悬壶济世",
sp_raoting: "绕庭之鸦",
sp_yijun: "异军突起",
sp_zhengyin: "正音雅乐",
sp_zhonghu: "冢虎狼顾",
},
};
});