noname/character/huicui.js

16471 lines
553 KiB
JavaScript
Raw Normal View History

2024-04-15 18:10:02 +00:00
import { lib, game, ui, get, ai, _status } from "../noname.js";
game.import("character", function () {
return {
2024-04-15 18:10:02 +00:00
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"]],
},
2024-04-15 18:10:02 +00:00
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"],
},
},
2024-02-05 16:26:11 +00:00
/** @type { importCharacterConfig['skill'] } */
2024-04-15 18:10:02 +00:00
skill: {
2024-03-02 04:22:27 +00:00
//新杀曹爽
2024-04-15 18:10:02 +00:00
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];
2024-03-02 04:22:27 +00:00
player.line(target);
2024-04-15 18:10:02 +00:00
await target.chooseToDiscard(num, "he", true);
2024-03-02 04:22:27 +00:00
}
},
},
2024-04-15 18:10:02 +00:00
draw_self: {
intro: "摸牌",
introx: (num) => "摸" + num + "张牌",
weight: 1,
ai_effect(player, num) {
2024-03-02 04:22:27 +00:00
return 3;
},
2024-04-15 18:10:02 +00:00
async content(player, num = 1) {
2024-03-02 04:22:27 +00:00
await player.draw(num);
},
},
2024-04-15 18:10:02 +00:00
recast_self: {
intro: "重铸",
introx: (num) => "重铸" + num + "张牌",
weight: 1,
ai_effect(player, num) {
2024-03-02 04:22:27 +00:00
return 1;
},
2024-04-15 18:10:02 +00:00
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]);
}
2024-03-02 04:22:27 +00:00
}
2024-04-15 18:10:02 +00:00
entries = entries.map((entry) => {
let weight = entry[1];
if (weight < 0) weight = (-remainedWeight / unfixedWeightTotal) * weight;
return [entry[0], weight];
});
2024-04-15 18:10:02 +00:00
let rand = Math.random() * 100;
let removeChoice = entries.find((entry) => {
rand -= entry[1];
return rand < 0;
})[0];
2024-04-15 18:10:02 +00:00
if (get.isLuckyStar(player) && Object.keys(entries).includes("弃牌"))
removeChoice = "弃牌";
player.markAuto("dcjianzhuan", [map[removeChoice]]);
2024-03-02 04:22:27 +00:00
player.popup(removeChoice);
2024-04-15 18:10:02 +00:00
game.log(player, "移去了", "#g" + removeChoice, "项");
2024-03-02 04:22:27 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
mark: true,
intro: {
markcount(storage) {
return 4 - (storage || []).length;
2024-03-02 04:22:27 +00:00
},
2024-04-15 18:10:02 +00:00
content(storage) {
if (!(storage || []).length) return "暂未移去任何项";
const info = get.info("dcjianzhuan").choices;
let str = "";
for (const i of storage) {
str += info[i].intro;
str += "、";
2024-03-02 04:22:27 +00:00
}
2024-04-15 18:10:02 +00:00
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);
2024-03-11 04:03:30 +00:00
}
2024-03-02 04:22:27 +00:00
}
}
await player.gainMaxHp(2);
await player.recover(2);
2024-04-15 18:10:02 +00:00
await player.changeSkills(["dcfudou"], ["dcjianzhuan"]);
},
derivation: "dcfudou",
2024-04-16 10:58:52 +00:00
ai: {
combo: "dcjianzhuan"
},
2024-04-15 18:10:02 +00:00
},
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");
2024-03-02 04:22:27 +00:00
await target.draw();
2024-04-15 18:10:02 +00:00
} else {
2024-03-02 04:22:27 +00:00
await player.loseHp();
await target.loseHp();
}
},
},
2024-02-26 19:16:29 +00:00
//司马师
2024-04-15 18:10:02 +00:00
dcsanshi: {
audio: 2,
trigger: { global: "roundStart" },
forced: true,
filter(event, player) {
return game.roundNumber === 1;
2024-02-26 19:16:29 +00:00
},
2024-04-15 18:10:02 +00:00
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";
2024-02-26 19:16:29 +00:00
});
}
return false;
});
},
2024-04-15 18:10:02 +00:00
forced: true,
notUseOrRespond(event, player) {
if (event.name !== "cardsDiscard") return true;
2024-04-12 12:22:36 +00:00
const evtx = event.getParent();
2024-04-15 18:10:02 +00:00
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";
})
);
2024-02-26 19:16:29 +00:00
}
});
2024-04-15 18:10:02 +00:00
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;
})
);
2024-02-26 19:16:29 +00:00
},
2024-04-15 18:10:02 +00:00
async content(event, trigger, player) {
2024-02-26 19:16:29 +00:00
trigger.directHit.addArray(game.filterPlayer());
2024-04-15 18:10:02 +00:00
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);
2024-02-26 19:16:29 +00:00
},
2024-04-15 18:10:02 +00:00
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");
2024-02-26 19:16:29 +00:00
}
},
},
},
2024-04-15 18:10:02 +00:00
ai: {
threaten: 3,
2024-02-26 19:27:31 +00:00
},
2024-02-26 19:16:29 +00:00
},
2024-04-15 18:10:02 +00:00
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)
);
2024-02-26 19:16:29 +00:00
});
}
return false;
},
2024-04-15 18:10:02 +00:00
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);
2024-02-26 19:16:29 +00:00
})
2024-02-27 06:39:25 +00:00
.forResult();
2024-04-15 18:10:02 +00:00
if (!result.bool) return;
const target = result.targets[0];
player.logSkill("dczhenrao", target);
2024-02-26 19:16:29 +00:00
await target.damage();
await game.asyncDelayx();
2024-04-15 18:10:02 +00:00
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) {
2024-02-26 19:16:29 +00:00
current.$throw(sishis);
2024-04-15 18:10:02 +00:00
lose_list.push([current, sishis]);
2024-02-26 19:16:29 +00:00
sishiList.addArray(sishis);
}
});
2024-04-15 18:10:02 +00:00
if (lose_list.length) {
await game.loseAsync({ lose_list }).setContent("chooseToCompareLose");
2024-02-26 19:16:29 +00:00
}
sishiList.addArray(cards.filter(isSishi));
2024-04-15 18:10:02 +00:00
if (lose_list.length) await game.asyncDelayx();
player.gain(sishiList, "gain2");
player
.when("phaseEnd")
.filter((evt) => evt === event.getParent("phase"))
2024-02-26 19:16:29 +00:00
.vars({
2024-04-15 18:10:02 +00:00
sishiList,
2024-02-26 19:16:29 +00:00
})
2024-04-15 18:10:02 +00:00
.then(() => {
const lose_list = [],
players = game.filterPlayer();
players.forEach((current) => {
const cards = current
.getCards("hej")
.filter((card) => sishiList.includes(card));
if (cards.length > 0) {
2024-02-26 19:16:29 +00:00
current.$throw(cards);
2024-04-15 18:10:02 +00:00
lose_list.push([current, cards]);
2024-02-26 19:16:29 +00:00
}
});
2024-04-15 18:10:02 +00:00
if (lose_list.length) {
game.loseAsync({ lose_list }).setContent("chooseToCompareLose");
2024-02-26 19:16:29 +00:00
}
2024-02-26 20:10:35 +00:00
})
2024-04-15 18:10:02 +00:00
.then(() => {
2024-02-26 19:16:29 +00:00
game.cardsGotoSpecial(sishiList);
2024-04-15 18:10:02 +00:00
game.log(sishiList, "被移出了游戏");
2024-02-26 19:16:29 +00:00
});
2024-04-15 18:10:02 +00:00
player
.when("die")
2024-02-26 19:16:29 +00:00
.vars({
2024-04-15 18:10:02 +00:00
sishiList,
2024-02-26 19:16:29 +00:00
})
.assign({
2024-04-15 18:10:02 +00:00
forceDie: true,
2024-02-26 19:16:29 +00:00
})
2024-04-15 18:10:02 +00:00
.then(() => {
2024-02-26 19:16:29 +00:00
game.cardsDiscard(sishiList);
2024-04-15 18:10:02 +00:00
game.log(sishiList, "被置入了弃牌堆");
2024-02-26 19:16:29 +00:00
});
},
2024-04-15 18:10:02 +00:00
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;
2024-02-26 19:27:31 +00:00
return 13;
2024-04-15 18:10:02 +00:00
},
2024-02-26 19:27:31 +00:00
},
2024-04-15 18:10:02 +00:00
combo: "dcsanshi",
2024-02-26 19:27:31 +00:00
},
2024-02-26 19:16:29 +00:00
},
2024-02-27 05:17:31 +00:00
//王凌
2024-04-15 18:10:02 +00:00
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"));
2024-02-27 05:17:31 +00:00
});
2024-04-15 18:10:02 +00:00
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,
2024-02-27 05:17:31 +00:00
])
2024-04-15 18:10:02 +00:00
.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);
2024-02-27 05:17:31 +00:00
})
2024-04-15 18:10:02 +00:00
.forResult("bool", "links");
if (bool) {
const [bool, targets] = await player
.chooseTarget(
2024-02-27 05:17:31 +00:00
`集筹:请选择${get.cnNumber(links.length)}名角色`,
2024-04-15 18:10:02 +00:00
`操作提示:请按照顺序选择要交给牌的目标,令这些角色按顺序获得这些牌:${get.translation(
links
)}`,
2024-02-27 05:17:31 +00:00
true,
2024-04-15 18:10:02 +00:00
links.length
2024-02-27 05:17:31 +00:00
)
2024-04-15 18:10:02 +00:00
.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();
});
2024-02-27 05:17:31 +00:00
}
2024-04-15 18:10:02 +00:00
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)));
2024-02-27 05:17:31 +00:00
});
2024-04-15 18:10:02 +00:00
return names.length >= 5;
},
forced: true,
juexingji: true,
skillAnimation: true,
animationColor: "water",
derivation: ["dczifu"],
async content(event, trigger, player) {
player.awakenSkill("dcmouli");
2024-02-27 05:17:31 +00:00
await player.gainMaxHp();
await player.recover();
2024-04-15 18:10:02 +00:00
await player.addSkills("dczifu");
},
2024-04-15 19:16:01 +00:00
ai: {
combo: "dcjichou",
},
2024-04-15 18:10:02 +00:00
},
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;
2024-02-27 05:17:31 +00:00
return true;
})
2024-04-15 18:10:02 +00:00
.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);
2024-02-27 05:17:31 +00:00
}
},
2024-04-15 18:10:02 +00:00
ai: {
halfneg: true,
2024-02-27 05:17:31 +00:00
},
},
2024-02-24 18:05:11 +00:00
//蒋济
2024-04-15 18:10:02 +00:00
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");
2024-02-24 18:05:11 +00:00
});
},
2024-04-15 18:10:02 +00:00
filterTarget(card, player, target) {
return target != player && target.hasSkill("dcshiju");
2024-02-24 18:05:11 +00:00
},
2024-04-15 18:10:02 +00:00
selectTarget() {
const num = game.countPlayer((current) => {
return current.hasSkill("dcshiju");
2024-02-24 18:05:11 +00:00
});
2024-04-15 18:10:02 +00:00
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);
2024-02-24 18:05:11 +00:00
}
2024-04-15 18:10:02 +00:00
return valueFix + 6 - get.value(card);
2024-02-24 18:05:11 +00:00
}
2024-04-15 18:10:02 +00:00
return 4 - get.value(card);
2024-02-24 18:05:11 +00:00
},
2024-04-15 18:10:02 +00:00
prompt() {
const list = game.filterPlayer((current) => {
return current.hasSkill("dcshiju");
2024-02-24 18:05:11 +00:00
});
2024-04-15 18:10:02 +00:00
return `将一张牌交给${get.translation(list)}${
list.length > 1 ? "中的一人" : ""
}若此牌为装备牌其可以使用之且你本回合的攻击范围+XX为其装备区的牌数若其以此法替换了装备你与其各摸两张牌`;
},
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);
2024-02-24 18:05:11 +00:00
}
}
},
2024-04-15 18:10:02 +00:00
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);
2024-02-24 18:05:11 +00:00
},
},
},
},
2024-04-15 18:10:02 +00:00
range: {
charlotte: true,
onremove: true,
mod: {
attackRange: function (player, num) {
return num + player.countMark("dcshiju_range");
2024-02-24 18:05:11 +00:00
},
},
2024-04-15 18:10:02 +00:00
intro: { content: "本回合攻击范围+#" },
2024-02-24 18:05:11 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
dcyingshi: {
audio: 2,
trigger: { player: "useCardToPlayered" },
filter(event, player) {
if (!event.isFirstTarget) return false;
if (get.type(event.card) !== "trick") return false;
2024-04-20 15:06:19 +00:00
return true;
2024-02-24 18:05:11 +00:00
},
2024-04-15 18:10:02 +00:00
direct: true,
async content(event, trigger, player) {
const result = await player
.chooseTarget()
.set("prompt", get.prompt("dcyingshi"))
.set(
"prompt2",
2024-04-20 15:06:19 +00:00
`令其中一名角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation(
2024-04-15 18:10:02 +00:00
trigger.card.name
)}⒉弃置${get.cnNumber(player.countCards("e"))}张牌此牌对其无效`
)
.set("filterTarget", (card, player, target) => {
return get.event("targets").includes(target);
2024-02-24 18:05:11 +00:00
})
2024-04-20 15:06:19 +00:00
.set("targets", trigger.targets)
2024-04-15 18:10:02 +00:00
.set(
"toFriends",
(() => {
2024-04-20 15:06:19 +00:00
const isPositive = trigger.targets.some((current) => {
2024-04-15 18:10:02 +00:00
return get.effect(current, trigger.card, trigger.player, player) > 0;
}),
2024-04-20 15:06:19 +00:00
isNegative = trigger.targets.some((current) => {
2024-04-15 18:10:02 +00:00
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;
2024-02-24 18:05:11 +00:00
return att;
}
2024-04-15 18:10:02 +00:00
if (player.hasSkill("dcyingshi_choice1") && !count) return 0;
return -get.attitude(player, target);
2024-02-27 06:39:25 +00:00
})
.forResult();
2024-04-15 18:10:02 +00:00
if (!result.bool) return;
const target = result.targets[0];
player.logSkill("dcyingshi", target);
2024-02-24 18:05:11 +00:00
let bool;
2024-04-15 18:10:02 +00:00
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) {
2024-02-24 18:05:11 +00:00
trigger.excluded.add(target);
2024-04-15 18:10:02 +00:00
} else {
player
.when({ global: "useCardAfter" })
.filter((evt) => evt === trigger.getParent())
2024-02-24 18:05:11 +00:00
.vars({
2024-04-15 18:10:02 +00:00
targetx: target,
cardx: {
name: trigger.card.name,
nature: trigger.card.nature,
isCard: true,
storage: { dcyingshi: true },
2024-02-24 18:05:11 +00:00
},
})
2024-04-15 18:10:02 +00:00
.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);
2024-02-24 18:05:11 +00:00
});
}
2024-04-15 18:10:02 +00:00
player.addTempSkill(`dcyingshi_choice${bool + 1}`);
2024-02-24 18:05:11 +00:00
},
2024-04-15 18:10:02 +00:00
subSkill: {
choice1: { charlotte: true },
choice2: { charlotte: true },
2024-02-24 18:05:11 +00:00
},
},
2024-02-24 15:39:51 +00:00
//公孙修
2024-04-15 18:10:02 +00:00
dcgangu: {
audio: 2,
trigger: { global: "loseHpAfter" },
filter(event, player) {
return event.player !== player;
},
usable: 1,
forced: true,
async content(event, trigger, player) {
2024-02-24 15:39:51 +00:00
await player.draw(2);
await player.loseHp();
},
},
2024-04-15 18:10:02 +00:00
dckuizhen: {
audio: 2,
enable: "phaseUse",
filter(event, player) {
return game.hasPlayer((current) => {
return lib.skill.dckuizhen.filterTarget(null, player, current);
2024-02-24 15:39:51 +00:00
});
},
2024-04-15 18:10:02 +00:00
filterTarget(card, player, target) {
return target.countCards("h") > player.countCards("h") || target.getHp() > player.getHp();
2024-02-24 15:39:51 +00:00
},
2024-04-15 18:10:02 +00:00
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;
})
) {
2024-02-24 15:39:51 +00:00
await player.viewHandcards(target);
2024-04-15 18:10:02 +00:00
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");
2024-02-24 15:39:51 +00:00
}
2024-04-15 18:10:02 +00:00
} else {
2024-02-24 15:39:51 +00:00
await target.loseHp();
}
},
2024-04-15 18:10:02 +00:00
ai: {
result: {
target(player, target) {
const [juedouEff, loseEff] = [
get.effect(player, { name: "juedou" }, target, player),
get.effect(target, { name: "losehp" }, target, player),
2024-02-24 18:05:11 +00:00
];
2024-04-15 18:10:02 +00:00
if (juedouEff > 0) return (loseEff * get.attitude(player, target)) / 10;
2024-02-24 18:05:11 +00:00
return 0;
},
2024-04-15 18:10:02 +00:00
},
2024-02-24 18:05:11 +00:00
},
2024-04-15 18:10:02 +00:00
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;
2024-02-24 15:39:51 +00:00
}
return false;
});
},
2024-04-15 18:10:02 +00:00
async content(event, trigger, player) {
trigger.addCount = false;
var stat = player.getStat().card,
name = trigger.card.name;
if (typeof stat[name] == "number") stat[name]--;
2024-02-24 15:39:51 +00:00
},
2024-04-15 18:10:02 +00:00
mod: {
cardUsable(card) {
if (!card.cards) return;
if (card.cards.some((card) => card.hasGaintag("dckuizhen"))) return Infinity;
2024-02-24 15:39:51 +00:00
},
},
2024-04-15 18:10:02 +00:00
},
},
2024-02-24 15:39:51 +00:00
},
2024-02-06 03:39:29 +00:00
//刘理
2024-04-15 18:10:02 +00:00
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;
2024-02-06 17:02:26 +00:00
return num;
};
2024-04-15 18:10:02 +00:00
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
);
2024-02-06 03:39:29 +00:00
};
2024-04-15 18:10:02 +00:00
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);
2024-02-06 03:39:29 +00:00
await player.discard(cards);
2024-04-15 18:10:02 +00:00
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];
2024-02-06 03:39:29 +00:00
player.line(target);
2024-04-15 18:10:02 +00:00
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 });
2024-02-06 03:39:29 +00:00
}
}
}
}
},
2024-04-15 18:10:02 +00:00
ai: {
order: 1,
result: {
player(player) {
const types = player.getDiscardableCards(player, "h").reduce((list, card) => {
2024-02-11 02:40:18 +00:00
return list.add(get.type2(card));
2024-04-15 18:10:02 +00:00
}, []);
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;
2024-02-06 03:39:29 +00:00
return 1;
},
},
},
2024-04-15 18:10:02 +00:00
subSkill: {
range: {
charlotte: true,
onremove: true,
mod: {
attackRange(player, num) {
return num - player.countMark("dcfuli_range");
2024-02-06 03:39:29 +00:00
},
},
2024-04-15 18:10:02 +00:00
marktext: " - ",
intro: { content: "攻击范围-#" },
2024-02-06 03:39:29 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
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);
2024-02-06 03:39:29 +00:00
});
2024-04-15 18:10:02 +00:00
if (list.length) {
const {
result: { bool, links },
} = await player
.chooseButton(
[
'###德化###<div class="text center">视为使用一张仍可以使用的伤害类卡牌</div>',
[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");
2024-02-06 03:39:29 +00:00
},
2024-04-15 18:10:02 +00:00
mod: {
maxHandcard(player, num) {
return num + player.getStorage("dcdehua").length;
2024-02-06 03:39:29 +00:00
},
2024-04-15 18:10:02 +00:00
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;
2024-02-06 03:39:29 +00:00
},
2024-04-15 18:10:02 +00:00
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;
2024-02-06 03:39:29 +00:00
},
2024-04-15 18:10:02 +00:00
aiValue(player, card) {
if (player.getStorage("dcdehua").includes(get.name(card))) return 0;
2024-02-06 03:39:29 +00:00
},
2024-04-15 18:10:02 +00:00
aiUseful() {
return lib.skill.dcdehua.mod.aiValue.apply(this, arguments);
2024-02-06 03:39:29 +00:00
},
},
2024-04-15 18:10:02 +00:00
intro: {
content(storage) {
return (
"<li>手牌上限+" +
storage.length +
"<br><li>不能从手牌中使用" +
get.translation(storage)
);
2024-02-06 03:39:29 +00:00
},
},
},
//蒋琬费祎
2024-04-15 18:10:02 +00:00
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;
2024-02-03 11:01:21 +00:00
});
},
async cost(event, trigger, player) {
2024-04-15 18:10:02 +00:00
const targetx = _status.currentPhase;
const targets = game
.filterPlayer((current) => {
if (targetx && current == targetx || !current.isIn()) return false;
2024-04-15 18:10:02 +00:00
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])) + "发动【守成】?",
2024-04-20 15:06:19 +00:00
"令其摸两张牌",
(card, player, target) => {
return get.event("targets").includes(target);
}
)
.set("targets", targets)
.set("ai", target => get.attitude(get.event("player"), target))
.forResult();
2024-02-03 11:01:21 +00:00
},
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);
2024-02-03 11:01:21 +00:00
},
2024-04-15 18:10:02 +00:00
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
);
2024-02-03 11:01:21 +00:00
});
2024-04-15 18:10:02 +00:00
},
},
},
},
2024-02-03 11:01:21 +00:00
},
2024-02-02 02:43:36 +00:00
//乐大乔
2024-04-15 18:10:02 +00:00
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,
};
2024-04-15 18:10:02 +00:00
lib.card[namex].cardimage = name;
lib.translate[namex] = lib.translate[name] + "·姊希";
lib.translate[namex + "_info"] =
"由【姊希】技能创造的无效果【" + lib.translate[name] + "】";
}
}
2024-02-02 02:43:36 +00:00
},
2024-04-15 18:10:02 +00:00
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]))
)
);
});
});
2024-04-15 18:10:02 +00:00
let map = {};
for (const name of names) {
map[get.translation(name)] = name;
}
const {
result: { bool, links },
} = await player
.chooseButton(2, [
"###" +
get.prompt("dczixi") +
'###<div class="text center">将一张“琴”以你选择的牌名置于一名角色的判定区</div>',
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);
2024-02-02 02:43:36 +00:00
await game.asyncDelay(0.5);
2024-04-15 18:10:02 +00:00
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;
2024-02-02 02:43:36 +00:00
},
},
2024-04-15 18:10:02 +00:00
ai: {
threaten(player, target) {
if (!player.hasSkill("dczixi") || ![1, 2, 3].includes(target.countCards("j")))
return;
return 3 + target.countCards("j");
2024-02-02 02:43:36 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
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);
2024-02-02 02:43:36 +00:00
return [
2024-04-15 18:10:02 +00:00
"令" + 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) {
2024-02-02 02:43:36 +00:00
case 1:
trigger.getParent().effectCount++;
2024-04-15 18:10:02 +00:00
game.log(trigger.card, "额外结算一次");
2024-02-02 02:43:36 +00:00
break;
case 2:
player.draw(2);
break;
case 3:
2024-04-15 18:10:02 +00:00
target.discard(target.getCards("j")).discarder = player;
2024-02-02 02:43:36 +00:00
target.damage(3);
break;
}
},
},
},
},
2024-02-01 02:09:36 +00:00
//孔融
2024-04-15 18:10:02 +00:00
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");
2024-02-01 02:09:36 +00:00
bs.remove(card);
2024-04-15 18:10:02 +00:00
if (card.cards) bs.removeArray(card.cards);
2024-02-01 02:09:36 +00:00
else bs.removeArray(ui.selected.cards);
2024-04-15 18:10:02 +00:00
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];
2024-02-01 02:09:36 +00:00
}
2024-04-15 18:10:02 +00:00
return [1, 0, 1, -0.5];
2024-02-01 02:09:36 +00:00
}
},
},
},
},
2024-01-21 17:22:59 +00:00
//新服SP孟获
2024-04-15 18:10:02 +00:00
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) {
2024-01-21 17:22:59 +00:00
player.draw(2);
2024-04-15 18:10:02 +00:00
player.removeSkills("dcpanqin");
2024-01-21 17:22:59 +00:00
}
},
2024-04-15 18:10:02 +00:00
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;
2024-01-21 17:22:59 +00:00
return 1;
},
},
},
2024-04-15 18:10:02 +00:00
derivation: "dcpanqin",
2024-01-21 17:22:59 +00:00
},
2024-04-15 18:10:02 +00:00
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") {
2024-01-21 17:22:59 +00:00
cards.add(i);
}
}
});
2024-04-15 18:10:02 +00:00
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")) {
2024-01-21 17:22:59 +00:00
case 1:
player.draw(2);
2024-04-15 18:10:02 +00:00
player.removeSkills("dcpanqin");
2024-01-21 17:22:59 +00:00
break;
case 2:
player.recover();
break;
case 3:
player.draw();
break;
case 4:
2024-04-15 18:10:02 +00:00
player.addSkills("dcpanqin");
2024-01-21 17:22:59 +00:00
break;
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-01-21 17:22:59 +00:00
player.gainMaxHp();
player.recover();
},
2024-04-15 18:10:02 +00:00
},
},
2024-01-21 17:22:59 +00:00
},
2024-01-21 04:34:44 +00:00
//凌操
2024-04-15 18:10:02 +00:00
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();
2024-01-21 04:34:44 +00:00
return list.randomGet();
2024-04-15 18:10:02 +00:00
});
next.set("list", list);
const { result } = await next;
if (result.control == "cancel2") await player.loseHp();
2024-01-21 04:34:44 +00:00
else await player.disableEquip(result.control);
2024-04-15 18:10:02 +00:00
if (!player.isIn()) return;
const num = Math.min(player.countDisabled() + player.getDamagedHp(), player.maxHp);
2024-01-21 04:34:44 +00:00
await player.draw(num);
2024-04-15 18:10:02 +00:00
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");
2024-01-21 04:34:44 +00:00
},
2024-04-15 18:10:02 +00:00
cardUsable(card, player, num) {
if (card.name == "sha") return player.countMark("dcdufeng_effect");
2024-01-21 04:34:44 +00:00
},
},
2024-04-15 18:10:02 +00:00
},
2024-01-21 04:34:44 +00:00
},
},
2024-01-13 06:45:13 +00:00
//小乔
2024-04-15 18:10:02 +00:00
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
);
2024-01-13 06:45:13 +00:00
},
2024-04-15 18:10:02 +00:00
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");
2024-01-13 06:45:13 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dcqiqin_tag")) return true;
2024-01-13 06:45:13 +00:00
},
2024-04-15 18:10:02 +00:00
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcqiqin_tag")) return false;
2024-01-13 06:45:13 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
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);
2024-01-13 06:45:13 +00:00
},
2024-04-15 18:10:02 +00:00
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("无牌可得!!");
2024-01-13 06:45:13 +00:00
return;
}
2024-04-15 18:10:02 +00:00
let suits = lib.suit.slice();
2024-01-13 06:45:13 +00:00
suits.reverse();
2024-04-15 18:10:02 +00:00
suits.add("none");
suits.forEach((suit2) => {
let cards2 = cards.filter((card) => get.suit(card, target) == suit2);
if (cards2.length) {
2024-01-13 06:45:13 +00:00
cards2.randomRemove();
cards.removeArray(cards2);
}
});
2024-04-15 18:10:02 +00:00
if (!cards.length) {
player.chat("无牌可得!!");
2024-01-13 06:45:13 +00:00
return;
}
2024-04-15 18:10:02 +00:00
player.gain(cards, target, "give");
switch (cards.length) {
2024-01-13 06:45:13 +00:00
case 1:
target.loseHp();
break;
case 2:
2024-04-15 18:10:02 +00:00
player.addTempSkill("tanbei_effect3");
target.addTempSkill("tanbei_effect1");
2024-01-13 06:45:13 +00:00
break;
case 3:
2024-04-15 18:10:02 +00:00
player.addTempSkill("tanbei_effect3");
target.addTempSkill("tanbei_effect2");
2024-01-13 06:45:13 +00:00
break;
}
},
2024-04-15 18:10:02 +00:00
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) {
2024-01-13 06:45:13 +00:00
case 1:
2024-04-15 18:10:02 +00:00
return (
num +
Math.max(0, get.sgn(get.effect(target, { name: "losehp" }, player, player)))
);
2024-01-13 06:45:13 +00:00
case 2:
2024-04-15 18:10:02 +00:00
return (
num +
player.countCards(
"he",
(card) =>
player.canUse(card, target, false) &&
get.effect(target, card, player, player) > 0
)
);
2024-01-13 06:45:13 +00:00
case 3:
2024-01-21 15:58:50 +00:00
return Math.ceil(num / 2);
default:
return num;
2024-01-13 06:45:13 +00:00
}
},
},
2023-11-24 22:17:35 +00:00
//董昭
2024-04-15 18:10:02 +00:00
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;
2023-11-24 22:17:35 +00:00
let result;
2024-04-15 18:10:02 +00:00
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;
2023-11-24 22:17:35 +00:00
}
}
}
2024-04-15 18:10:02 +00:00
if (delta > 0) {
if (target.hasSkillTag("nogain")) att /= 3;
return Math.sqrt(delta) * att * fix;
2023-11-24 22:17:35 +00:00
}
2024-04-15 18:10:02 +00:00
if (delta > -2 && att > 0) return fix == 0.5 ? 0.1 : -1;
return (-Math.sqrt(-delta) * att) / 2;
2023-11-24 22:17:35 +00:00
});
2024-04-15 18:10:02 +00:00
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);
2023-11-24 22:17:35 +00:00
}
target.showHandcards();
2024-04-15 18:10:02 +00:00
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;
2023-11-24 22:17:35 +00:00
}
}
}
game.delayex();
2024-04-15 18:10:02 +00:00
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);
2023-11-24 22:17:35 +00:00
});
});
2024-04-15 18:10:02 +00:00
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
);
2023-11-24 22:17:35 +00:00
}
},
},
2023-11-17 17:51:07 +00:00
//蒯祺
2024-04-15 18:10:02 +00:00
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"));
2024-04-15 18:10:02 +00:00
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)) {
2023-11-17 17:51:07 +00:00
cards.add(card);
2024-04-15 18:10:02 +00:00
if (cards.length >= 2) break;
2023-11-17 17:51:07 +00:00
}
}
2024-04-15 18:10:02 +00:00
if (cards.length >= 2) break;
2023-11-17 17:51:07 +00:00
}
let result;
2024-04-15 18:10:02 +00:00
if (!cards.length) {
player.chat("没牌了…");
game.log("但是哪里都找不到没有符合条件的牌!");
2023-11-17 17:51:07 +00:00
event.finish();
return;
2024-04-15 18:10:02 +00:00
} 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");
2023-11-17 17:51:07 +00:00
});
2024-04-15 18:10:02 +00:00
player.gain(toGain, "gain2");
2023-11-17 17:51:07 +00:00
}
},
2024-04-15 18:10:02 +00:00
intro: {
content: "已因此技能获得过$牌",
onunmark: true,
2023-11-17 17:51:07 +00:00
},
2024-04-15 18:10:02 +00:00
ai: {
order: 2,
result: { player: 1 },
2023-11-17 17:51:07 +00:00
},
},
2024-04-15 18:10:02 +00:00
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);
2023-11-17 17:51:07 +00:00
});
},
2024-04-15 18:10:02 +00:00
direct: true,
content: function* (event, map) {
const player = map.player;
const choices = [];
const choiceList = [
"令一名角色将手牌数摸或弃置至与其体力值相同",
"令一名角色将体力回复或失去至与其手牌数相同",
2023-11-17 17:51:07 +00:00
];
2024-04-15 18:10:02 +00:00
if (!player.isTempBanned("dcxunjie_handcard")) choices.push("选项一");
else
choiceList[0] =
'<span style="opacity:0.5">' + choiceList[0] + "(已被选择过)</span>";
if (!player.isTempBanned("dcxunjie_hp")) choices.push("选项二");
else
choiceList[1] =
'<span style="opacity:0.5">' + choiceList[1] + "(已被选择过)</span>";
2023-11-17 17:51:07 +00:00
let result;
2024-04-15 18:10:02 +00:00
if (_status.connectMode)
game.broadcastAll(() => {
_status.noclearcountdown = true;
2023-11-17 17:51:07 +00:00
});
2024-04-15 18:10:02 +00:00
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();
});
}
2023-11-17 17:51:07 +00:00
return event.finish();
}
2024-04-15 18:10:02 +00:00
let prompt = "";
const choice = result.control,
index = choice == "选项一" ? 0 : 1;
if (choices.length == 1) {
prompt = `###${get.prompt("dcxunjie")}###<div class="text center">${
choiceList[index]
}</div>`;
} else
prompt = `###殉节:请选择一名角色###<div class="text center">${choiceList[
index
].replace("一名", "该")}</div>`;
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));
},
2023-11-17 17:51:07 +00:00
},
//乐蔡邕
2024-04-15 18:10:02 +00:00
dcjiaowei: {
audio: 2,
trigger: {
global: "phaseBefore",
player: "enterGame",
},
2024-04-15 18:10:02 +00:00
forced: true,
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
2024-04-15 18:10:02 +00:00
group: "dcjiaowei_prevent",
content: function* (event, map) {
const player = map.player;
var cards = player.getCards("h");
player.addGaintag(cards, "dcjiaowei_tag");
},
2024-04-15 18:10:02 +00:00
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dcjiaowei_tag")) return true;
},
2024-04-15 18:10:02 +00:00
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcjiaowei_tag")) return false;
},
},
2024-04-15 18:10:02 +00:00
subSkill: {
prevent: {
audio: "dcjiaowei",
trigger: {
player: "damageBegin4",
},
2024-04-15 18:10:02 +00:00
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"))
);
},
2024-04-15 18:10:02 +00:00
content: function* (event, map) {
map.trigger.cancel();
},
2024-04-15 18:10:02 +00:00
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";
});
2024-04-15 18:10:02 +00:00
if (player.countCards("h") - cards.length <= num)
return "zeroplayertarget";
}
},
},
},
},
},
},
2024-04-15 18:10:02 +00:00
dcfeibai: {
audio: 2,
trigger: { player: "useCardAfter" },
usable: 1,
locked: false,
filter: function (event, player) {
return player.getHistory("useCard").indexOf(event) > 0;
},
2024-04-15 18:10:02 +00:00
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}的牌`;
},
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
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}的牌!`);
}
2024-04-15 18:10:02 +00:00
if (player.countCards("h", (card) => card.hasGaintag("dcjiaowei_tag")) <= len) {
player.storage.counttrigger.dcfeibai--;
2024-04-15 18:10:02 +00:00
game.log(player, "重置了", "#【飞白】");
}
},
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
if (cardx) return num + 8 + (len == 2 || len == 4 ? 2 : 0);
},
2024-04-15 18:10:02 +00:00
},
},
//庞山民
2024-04-15 18:10:02 +00:00
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) {
2024-01-13 06:45:13 +00:00
num--;
2024-04-15 18:10:02 +00:00
let card = get[position](
(card) => get.type(card) != "basic" && !cards.includes(card)
);
if (card) cards.add(card);
2024-01-13 06:45:13 +00:00
else break;
}
2024-04-15 18:10:02 +00:00
if (cards.length) yield player.gain(cards, "gain2");
else {
player.chat("没有非基本牌…");
game.log(`但是${position == "discardPile" ? "弃" : ""}牌堆里没有非基本牌!`);
}
2024-04-15 18:10:02 +00:00
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");
},
2024-04-15 18:10:02 +00:00
subSkill: { more: { charlotte: true, onremove: true } },
},
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
},
},
//魏贾充
2024-04-15 18:10:02 +00:00
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},然后选择两名角色,前者视为对后者使用一张【杀】,且这两者的非锁定技失效。`;
},
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
return lib.filter.cardEnabled(sha, target);
}
2024-04-15 18:10:02 +00:00
)
.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;
},
},
},
2024-04-15 18:10:02 +00:00
subSkill: {
fengyin: {
inherit: "fengyin",
},
2024-04-15 18:10:02 +00:00
fengyin2: {
inherit: "fengyin",
2024-02-19 08:24:57 +00:00
},
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
backup: function (links, player) {
return {
2024-04-15 18:10:02 +00:00
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,
},
2024-04-15 18:10:02 +00:00
position: "he",
popname: true,
ignoreMod: true,
ai1: function (card) {
return 1 / (1.1 + Math.max(-1, get.value(card)));
},
2024-04-15 18:10:02 +00:00
ai2: function (target) {
return get.attitude(get.player(), target);
},
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
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, "将一张牌置于了牌堆底");
}
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
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();
},
2024-04-15 18:10:02 +00:00
ai: {
order: 10,
},
2024-04-15 18:10:02 +00:00
};
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
subSkill: {
backup: {},
backup2: {
filterCard: () => false,
selectCard: -1,
precontent: function () {
delete event.result.skill;
2024-04-15 18:10:02 +00:00
},
},
},
},
2023-10-27 14:32:52 +00:00
//张曼成
2024-04-15 18:10:02 +00:00
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
);
2023-10-27 14:32:52 +00:00
});
2024-04-15 18:10:02 +00:00
var ts = target.hp;
if (hs >= ts && ts > 1) return -2;
2023-10-27 14:32:52 +00:00
return -1;
2024-04-15 18:10:02 +00:00
},
},
2023-10-27 14:32:52 +00:00
},
2024-04-15 18:10:02 +00:00
subSkill: {
xiongluan: {
trigger: { player: "phaseEnd" },
charlotte: true,
forced: true,
popup: false,
onremove: function (player, skill) {
player.removeGaintag("dclvecheng_xiongluan");
2023-10-27 14:32:52 +00:00
delete player.storage[skill];
},
2024-04-15 18:10:02 +00:00
filter: function (event, player) {
return player.getStorage("dclvecheng_xiongluan").some((i) => i.isIn());
2023-10-27 14:32:52 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
event.targets = player.getStorage("dclvecheng_xiongluan").slice();
2023-10-27 14:32:52 +00:00
event.targets.sortBySeat();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (!event.targets.length) {
2023-10-27 14:32:52 +00:00
event.finish();
return;
}
2024-04-15 18:10:02 +00:00
var target = event.targets.shift();
event.target = target;
2023-10-27 14:32:52 +00:00
target.showHandcards();
2024-04-15 18:10:02 +00:00
var cards = target.getCards("h", "sha");
if (!cards.length) event.redo();
else event.forced = false;
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (target.countCards("h", "sha")) {
event.forced = true;
2023-10-27 14:32:52 +00:00
event.goto(2);
return;
}
}
2024-04-15 18:10:02 +00:00
event.forced = false;
2023-10-27 14:32:52 +00:00
event.goto(1);
},
2024-04-15 18:10:02 +00:00
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;
2023-10-27 14:32:52 +00:00
},
2024-04-15 18:10:02 +00:00
},
},
},
2023-10-27 14:32:52 +00:00
},
2024-04-15 18:10:02 +00:00
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;
2023-10-27 14:32:52 +00:00
return true;
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var num = player.getHistory("useSkill", (evt) => {
return evt.skill == "dczhongji";
2023-10-27 14:32:52 +00:00
}).length;
2024-04-15 18:10:02 +00:00
player
.chooseToDiscard("螽集:请弃置" + get.cnNumber(num) + "张牌", "he", true, num)
.set("ai", get.unuseful);
},
ai: {
threaten: 3.2,
2023-10-27 14:32:52 +00:00
},
},
2023-09-28 09:54:32 +00:00
//乐周妃
2024-04-15 18:10:02 +00:00
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")) {
2023-09-28 09:54:32 +00:00
return true;
}
},
2024-04-15 18:10:02 +00:00
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dclingkong_tag")) {
2023-09-28 09:54:32 +00:00
return false;
}
},
},
2024-04-15 18:10:02 +00:00
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");
2023-09-28 09:54:32 +00:00
game.delayx();
},
},
},
},
2024-04-15 18:10:02 +00:00
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);
2023-09-28 09:54:32 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.give(cards, target, true);
event.color = get.color(cards[0], player);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (target.isIn()) {
var num = Math.min(Math.abs(target.getHp() - player.getHp()), 5);
if (num > 0) player.draw(num);
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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;
2023-09-28 09:54:32 +00:00
},
2024-04-15 18:10:02 +00:00
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;
2023-09-28 09:54:32 +00:00
},
},
},
},
//吴班
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
var targets = game.filterPlayer((current) => {
if (current == player) return false;
var evt = trigger.getl(current);
return evt && evt.cards2.length;
});
2024-04-15 18:10:02 +00:00
event.targets = targets;
player.logSkill("dcyouzhan", targets);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
event.target = targets.shift();
event.num = trigger.getl(event.target).cards2.length;
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (targets.length) {
2024-01-10 08:17:41 +00:00
event.goto(1);
}
},
2024-04-15 18:10:02 +00:00
ai: {
damageBonus: true,
skillTagFilter: function (player, tag, arg) {
if (!arg || !arg.target || !arg.target.hasSkill("dcyouzhan_effect")) return false;
},
2023-11-30 16:28:12 +00:00
},
2024-04-15 18:10:02 +00:00
subSkill: {
effect: {
audio: "dcyouzhan",
trigger: {
player: "damageBegin3",
},
2024-04-15 18:10:02 +00:00
filter: function (event, player) {
return player.hasMark("dcyouzhan_effect");
},
2024-04-15 18:10:02 +00:00
forced: true,
charlotte: true,
onremove: true,
content: function () {
"step 0";
trigger.num += player.countMark("dcyouzhan_effect");
player.removeSkill("dcyouzhan_effect");
},
2024-04-15 18:10:02 +00:00
mark: true,
intro: {
content: "本回合下一次受到的伤害+#",
},
ai: {
effect: {
target: function (card, player, target) {
if (get.tag(card, "damage"))
return 1 + 0.5 * target.countMark("dcyouzhan_effect");
},
},
},
},
2024-04-15 18:10:02 +00:00
draw: {
trigger: {
global: "phaseJieshuBegin",
},
2024-04-15 18:10:02 +00:00
forced: true,
charlotte: true,
filter: function (event, player) {
return !player.getHistory("damage").length;
},
2024-04-15 18:10:02 +00:00
content: function () {
player.draw(Math.min(3, player.getHistory("lose").length));
},
},
2024-04-15 18:10:02 +00:00
limit: {
charlotte: true,
onremove: function (player) {
player.removeGaintag("dcyouzhan");
2023-11-30 16:28:12 +00:00
},
2024-04-15 18:10:02 +00:00
mod: {
ignoredHandcard: function (card, player) {
if (card.hasGaintag("dcyouzhan")) return true;
2023-11-30 16:28:12 +00:00
},
2024-04-15 18:10:02 +00:00
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcyouzhan")) return false;
2023-11-30 16:28:12 +00:00
},
},
2024-04-15 18:10:02 +00:00
},
},
},
//乐蔡文姬
2024-04-15 18:10:02 +00:00
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;
}
},
2024-04-15 18:10:02 +00:00
cardDiscardable: function (card, player, name) {
if (name == "phaseDiscard" && card.hasGaintag("dcshuangjia_tag")) {
return false;
}
},
2024-04-15 18:10:02 +00:00
globalTo: function (from, to, distance) {
return (
distance +
Math.min(
5,
to.countCards("h", (card) => card.hasGaintag("dcshuangjia_tag"))
)
);
},
},
},
2024-04-15 18:10:02 +00:00
dcbeifen: {
audio: 2,
trigger: {
player: ["loseAfter"],
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
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));
});
2024-04-15 18:10:02 +00:00
var cards = [];
while (suits.length) {
var suit = suits.shift();
var card = get.cardPile((cardx) => {
return get.suit(cardx, false) == suit;
});
2024-04-15 18:10:02 +00:00
if (card) cards.push(card);
}
2024-04-15 18:10:02 +00:00
if (cards.length) {
player.gain(cards, "gain2");
}
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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));
});
2024-04-15 18:10:02 +00:00
if (suits.length) return num + suits.length * 2.5;
}
},
},
},
//孟优
2024-04-15 18:10:02 +00:00
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;
2023-09-28 13:58:14 +00:00
break;
}
}
});
2024-04-15 18:10:02 +00:00
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"))
);
});
2024-04-15 18:10:02 +00:00
},
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
event.target = target;
var choices = [];
var choiceList = [
"令其交给你两张牌,然后其视为使用一张无距离限制的【杀】",
"你获得其区域内的至多两张牌,然后交给其等量的牌并摸一张牌",
];
2024-04-15 18:10:02 +00:00
var chosen = [player.hasSkill("dcmanzhi_1"), player.hasSkill("dcmanzhi_2")];
if (target.countCards("he") && (!chosen[0] || trigger.name == "phaseZhunbei"))
choices.push("选项一");
else
choiceList[0] =
'<span style="opacity:0.5">' +
choiceList[0] +
(chosen[0] ? "(已被选择过)" : "") +
"</span>";
if (target.countCards("hej") && (!chosen[1] || trigger.name == "phaseZhunbei"))
choices.push("选项二");
else
choiceList[1] =
'<span style="opacity:0.5">' +
choiceList[1] +
(chosen[1] ? "(已被选择过)" : "") +
"</span>";
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();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (_status.connectMode) {
game.broadcastAll(function () {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
2024-04-15 18:10:02 +00:00
if (result.control == "cancel2") {
event.finish();
2024-04-15 18:10:02 +00:00
return;
}
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (result.bool) {
target.give(result.cards, player);
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
target.chooseUseTarget("sha", true, "nodistance");
event.finish();
2024-04-15 18:31:36 +00:00
"step 5";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 6";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.give(result.cards, target);
player.draw();
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
1: { charlotte: true },
2: { charlotte: true },
},
},
//孙綝
2024-04-15 18:10:02 +00:00
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");
});
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.gainPlayerCard("e", target, true);
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
result: {
player: 1,
},
},
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (!result.bool) event.finish();
else if (event.sign <= 0 && !event.isMine() && !event.isOnline()) game.delayx();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var sign = event.sign;
if (sign > 0) {
player.logSkill("dczuowei");
trigger.directHit.addArray(game.players);
event.finish();
2024-04-15 18:10:02 +00:00
} else if (sign == 0) {
var target = result.targets[0];
player.logSkill("dczuowei", target);
target.damage();
2024-04-15 18:10:02 +00:00
} else {
player.logSkill("dczuowei");
player.draw(2);
2024-04-15 18:10:02 +00:00
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];
},
},
},
},
//刘宠骆俊
2024-04-15 18:10:02 +00:00
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: "本回合以此法交出的牌名:$",
},
},
2024-04-15 18:10:02 +00:00
draw: {
trigger: { player: "phaseJieshuBegin" },
filter: function (event, player) {
return player.getStorage("dcminze_given").length;
},
2024-04-15 18:10:02 +00:00
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);
},
},
},
},
2024-04-15 18:10:02 +00:00
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);
2023-08-22 09:17:49 +00:00
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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);
});
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
counted: {
onremove: true,
charlotte: true,
},
},
},
//乐綝
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0],
cards = result.cards;
event.target = target;
player.logSkill("dcporui", target);
player.discard(cards);
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var card = { name: "sha", isCard: true, storage: { dcporui: true } };
if (player.canUse(card, target, false) && target.isIn()) {
player.useCard(card, target);
event.num--;
2024-04-15 18:10:02 +00:00
} else event.goto(4);
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (event.num > 0) event.goto(2);
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 5";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.give(result.cards, target);
}
event.finish();
2024-04-15 18:31:36 +00:00
"step 6";
2024-04-15 18:10:02 +00:00
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();
}
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
round: { charlotte: true, onremove: true },
},
ai: {
expose: 0.4,
threaten: 3.8,
},
},
2024-04-15 18:10:02 +00:00
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;
}
});
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (event.targets) {
player.logSkill("dcgonghu_trick", event.targets);
trigger.targets.addArray(event.targets);
}
},
},
2024-04-15 18:10:02 +00:00
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";
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.directHit.addArray(game.filterPlayer());
2024-04-15 18:10:02 +00:00
game.log(trigger.card, "不可被响应");
},
},
2024-04-15 18:10:02 +00:00
},
},
//张闿
2024-04-15 18:10:02 +00:00
dcxiangshu: {
audio: 2,
trigger: { global: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return event.player != player && event.player.countCards("h") >= event.player.hp;
},
2024-04-15 18:10:02 +00:00
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;
})()
);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
player
.chooseToDiscard("相鼠:是否弃置一张牌不公布此数字?")
.set("ai", (card) => 2 - get.value(card));
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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);
}
},
2024-04-15 18:10:02 +00:00
intro: { content: "猜测的数字为#" },
},
},
},
//裴元绍
2024-04-15 18:10:02 +00:00
dcmoyu: {
audio: 2,
2024-04-25 22:41:54 +00:00
init() {
2024-04-15 18:10:02 +00:00
game.addGlobalSkill("dcmoyu_ai");
},
2024-04-25 22:41:54 +00:00
onremove() {
2024-04-26 19:14:46 +00:00
if (!game.hasPlayer(i => i.hasSkill("dcmoyu"), true)) game.removeGlobalSkill("dcmoyu_ai");
2024-04-15 18:10:02 +00:00
},
enable: "phaseUse",
2024-04-25 22:41:54 +00:00
filter(event, player) {
return game.hasPlayer((current) => lib.skill.dcmoyu.filterTarget(null, player, current));
},
filterTarget(card, player, target) {
2024-04-26 19:14:46 +00:00
return player != target && !player.getStorage("dcmoyu_clear").includes(target) && target.countGainableCards(player, "hej");
2024-04-25 22:41:54 +00:00
},
2024-04-26 19:14:46 +00:00
async content(event, trigger, player) {
const target = event.target;
2024-04-25 22:41:54 +00:00
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
2024-04-26 19:14:46 +00:00
.chooseToUse(
function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
},
"是否对" + get.translation(player) + "使用一张无距离限制的【杀】?"
)
2024-04-25 22:41:54 +00:00
.set("targetRequired", true)
.set("complexSelect", true)
.set("filterTarget", function (card, player, target) {
2024-04-26 19:14:46 +00:00
if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false;
2024-04-25 22:41:54 +00:00
return lib.filter.targetEnabled.apply(this, arguments);
})
.set("sourcex", player)
.set("num", num)
2024-04-26 19:14:46 +00:00
.set("oncard", card => {
2024-04-25 22:41:54 +00:00
_status.event.baseDamage = _status.event.getParent().num;
})
.forResult();
if (result.bool) {
if (
2024-04-26 19:14:46 +00:00
player.hasHistory("damage", evt => {
2024-04-25 22:41:54 +00:00
return evt.card && evt.card.name == "sha" && evt.getParent(4) == event;
})
) {
player.tempBanSkill("dcmoyu");
2024-04-26 19:14:46 +00:00
} else {
2024-04-25 22:41:54 +00:00
player.addTempSkill("dcmoyu_add", "phaseChange");
}
}
},
subSkill: {
clear: {
charlotte: true,
onremove: true,
},
ban: {
charlotte: true,
mark: true,
marktext: "欲",
intro: { content: "偷马贼被反打了!" },
},
add: {
charlotte: true,
2024-04-26 19:14:46 +00:00
mark: true,
2024-04-25 22:41:54 +00:00
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",
2024-04-15 18:10:02 +00:00
filter: function (event, player) {
return (
2024-04-25 22:41:54 +00:00
!player.hasSkill("oldmoyu_ban") &&
game.hasPlayer((current) => lib.skill.oldmoyu.filterTarget(null, player, current))
2024-04-15 18:10:02 +00:00
);
},
filterTarget: function (card, player, target) {
return (
player != target &&
2024-04-25 22:41:54 +00:00
!player.getStorage("oldmoyu_clear").includes(target) &&
2024-04-15 18:10:02 +00:00
target.countGainableCards(player, "hej")
);
},
content: function () {
"step 0";
2024-04-25 22:41:54 +00:00
player.addTempSkill("oldmoyu_clear");
player.markAuto("oldmoyu_clear", [target]);
2024-04-15 18:10:02 +00:00
player.gainPlayerCard(target, "hej", true);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-25 22:41:54 +00:00
var num = player.getStorage("oldmoyu_clear").length;
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (
player.hasHistory("damage", (evt) => {
return evt.card && evt.card.name == "sha" && evt.getParent(4) == event;
})
)
2024-04-25 22:41:54 +00:00
player.addTempSkill("oldmoyu_ban");
2024-04-15 18:10:02 +00:00
}
},
subSkill: {
clear: {
charlotte: true,
onremove: true,
},
ban: {
charlotte: true,
mark: true,
marktext: "欲",
intro: { content: "偷马贼被反打了!" },
},
ai: {
trigger: { player: "dieAfter" },
filter: () => {
2024-04-25 22:41:54 +00:00
return !game.hasPlayer((i) => i.hasSkill("oldmoyu"), true);
2024-04-15 18:10:02 +00:00
},
silent: true,
forceDie: true,
content: () => {
2024-04-25 22:41:54 +00:00
game.removeGlobalSkill("oldmoyu_ai");
2024-04-15 18:10:02 +00:00
},
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;
2024-04-25 22:41:54 +00:00
if (!current.hasSkill("oldmoyu")) return false;
2024-04-15 18:10:02 +00:00
if (current.hasJudge("lebu")) return false;
return get.attitude(current, target) > 0;
});
list.sortBySeat(currentx);
2024-04-15 18:10:02 +00:00
if (list.indexOf(target) != 0) return "zerotarget";
}
},
},
2024-04-15 18:10:02 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
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;
}) <=
2024-04-25 22:41:54 +00:00
player.getStorage("oldmoyu_clear").length + 1
2024-04-15 18:10:02 +00:00
)
return 0;
return eff;
2024-04-15 18:10:02 +00:00
},
},
},
},
//张楚
2024-04-15 18:10:02 +00:00
dcjizhong: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: lib.filter.notMe,
selectTarget: 1,
content: function () {
"step 0";
target.draw(2);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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);
},
},
},
},
2024-04-15 18:10:02 +00:00
dcrihui: {
2024-04-12 14:11:26 +00:00
audio: 2,
2024-04-15 18:10:02 +00:00
trigger: { player: "useCardAfter" },
2024-04-12 14:11:26 +00:00
usable: 1,
filter: function (event, player) {
2024-04-15 18:10:02 +00:00
if (!event.targets || event.targets.length != 1 || event.targets[0] == player)
return false;
2024-04-12 14:11:26 +00:00
var card = event.card;
var target = event.targets[0];
2024-04-15 18:10:02 +00:00
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],
2024-04-12 14:11:26 +00:00
prompt2(event, player) {
const target = event.targets[0];
2024-04-15 18:10:02 +00:00
if (target.hasMark("dcjizhong")) return "获得该角色区域内的一张牌";
2024-04-12 14:11:26 +00:00
else {
const card = { name: event.card.name, nature: event.card.nature, isCard: true };
2024-04-15 18:10:02 +00:00
return "令所有有“信众”的角色依次视为对其使用一张" + get.translation(card);
2024-04-12 14:11:26 +00:00
}
},
2024-04-12 14:11:26 +00:00
check(event, player) {
const target = event.targets[0];
2024-04-15 18:10:02 +00:00
if (target.hasMark("dcjizhong")) {
return get.effect(target, { name: "shunshou_copy" }, event, player) > 0;
} else {
2024-04-12 14:11:26 +00:00
const card = { name: event.card.name, nature: event.card.nature, isCard: true };
let eff = 0;
2024-04-15 18:10:02 +00:00
game.countPlayer((current) => {
if (!current.hasMark("dcjizhong") || !current.canUse(card, player, false)) return;
2024-04-12 14:11:26 +00:00
eff += get.effect(target, card, current, player);
});
return eff > 0;
}
2024-04-12 14:11:26 +00:00
},
async content(event, trigger, player) {
const target = trigger.targets[0];
2024-04-15 18:10:02 +00:00
if (target.hasMark("dcjizhong")) {
await player.gainPlayerCard(target, "hej", true);
} else {
2024-04-12 14:11:26 +00:00
const card = { name: trigger.card.name, nature: trigger.card.nature, isCard: true };
2024-04-15 18:10:02 +00:00
const targets = game
.filterPlayer((current) => current.hasMark("dcjizhong"))
.sortBySeat(_status.currentPhase);
2024-04-12 14:11:26 +00:00
for (const current of targets) {
if (target.isIn() && current.isIn() && current.canUse(card, target, false)) {
await current.useCard(card, target, false);
}
}
}
2024-04-12 14:11:26 +00:00
},
2024-04-15 18:10:02 +00:00
ai: {
combo: "dcjizhong",
},
},
2024-04-15 18:10:02 +00:00
dcguangshi: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
filter: function (event, player) {
return !game.hasPlayer((current) => current != player && !current.hasMark("dcjizhong"));
},
2024-04-15 18:10:02 +00:00
forced: true,
content: function () {
player.draw(2);
2023-12-04 10:19:54 +00:00
player.loseHp();
2024-04-14 15:27:22 +00:00
},
2024-04-15 18:10:02 +00:00
ai: {
combo: "dcjizhong",
},
},
//董绾
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcshengdu", target);
target.addMark("dcshengdu", 1);
}
},
2024-04-15 18:10:02 +00:00
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")
);
},
2024-04-15 18:10:02 +00:00
forced: true,
logTarget: "player",
content: function () {
var num = trigger.player.countMark("dcshengdu");
player.draw(num * trigger.cards.length);
trigger.player.removeMark("dcshengdu", num);
},
2024-04-15 18:10:02 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
dcjieling: {
audio: 2,
enable: "phaseUse",
position: "hs",
viewAs: {
name: "sha",
storage: { dcjieling: true },
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:10:02 +00:00
var targets = trigger.targets.filter((i) => i.isIn());
player.logSkill("dcjieling_after", targets);
if (damaged) {
for (var target of targets) {
target.loseHp();
}
2024-04-15 18:10:02 +00:00
} else {
for (var target of targets) {
target.addMark("dcshengdu", 1);
}
}
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
count: {
intro: {
content: function (s, p) {
let str = "此阶段已转化过的卡牌花色:";
for (let i = 0; i < s.length; i++) {
str += get.translation(s[i]);
}
return str;
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
charlotte: true,
onremove: true,
},
},
},
//袁胤
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
mark: true,
marktext: "守",
intro: {
markcount: function (storage, player) {
if (typeof storage != "number") return 1;
return (storage % 3) + 1;
},
2024-04-15 18:10:02 +00:00
content: "本局游戏已发动过$次技能",
},
},
2024-04-15 18:10:02 +00:00
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];
2024-04-15 18:10:02 +00:00
if (!evt) event.finish();
else {
var cards = [];
//冷知识,角色死亡后只有手牌区和装备区的牌是被系统弃置的,其余牌的处理方式均为置入弃牌堆
cards.addArray(evt.hs).addArray(evt.es);
2024-04-15 18:10:02 +00:00
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"),
'<div class="text center">弃置' +
get.cnNumber(num) +
"张牌,令一名其他角色获得以下这些牌</div>",
cards
);
dialog.videoId = id;
return dialog;
};
2024-04-15 18:10:02 +00:00
if (player.isOnline2()) {
player.send(func, cards, event.videoId);
}
2024-04-15 18:10:02 +00:00
event.dialog = func(cards, event.videoId);
if (player != game.me || _status.auto) {
event.dialog.style.display = "none";
}
player.chooseCardTarget({
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
ai2: function (target) {
return (
get.attitude(_status.event.player, target) /
Math.sqrt(target.countCards("h") + 1)
);
},
});
2024-04-15 18:10:02 +00:00
} else event.finish();
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (player.isOnline2()) {
player.send("closeDialog", event.videoId);
}
event.dialog.close();
2024-04-15 18:10:02 +00:00
if (result.bool) {
var cardsx = result.cards,
target = result.targets[0];
player.logSkill("dcyunjiu", target);
player.discard(cardsx);
2024-04-15 18:10:02 +00:00
target.gain(cards.filterInD("d"), "gain2").giver = player;
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
player.gainMaxHp();
player.recover();
2024-04-15 18:10:02 +00:00
},
},
//高翔
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var current = targets.shift();
if (current.countCards("he")) current.chooseToDiscard("驰应:请弃置一张牌", "he", true);
if (targets.length) event.redo();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (target != player) {
var cards = [];
game.getGlobalHistory("cardMove", (evt) => {
if (evt.getParent(3) == event) {
cards.addArray(evt.cards.filter((card) => get.type(card) == "basic"));
}
});
2024-04-15 18:10:02 +00:00
cards = cards.filterInD("d");
if (cards.length) target.gain(cards, "gain2");
}
2024-04-15 18:10:02 +00:00
},
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)
);
},
},
},
},
//霍峻
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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]);
}
2024-04-15 18:10:02 +00:00
return ui.create.dialog("孤扼", [vcards, "vcard"], "hidden");
},
2024-04-15 18:10:02 +00:00
check: function (button) {
if (_status.event.player.countCards("h", { name: ["sha", "shan"] }) > 1) return 0;
return 1;
},
2024-04-15 18:10:02 +00:00
backup: function (links, player) {
return {
2024-04-15 18:10:02 +00:00
filterCard: () => false,
selectCard: -1,
viewAs: {
name: links[0][2],
isCard: true,
},
2024-04-15 18:10:02 +00:00
popname: true,
precontent: function () {
"step 0";
player.logSkill("dcgue");
player.addTempSkill("dcgue_blocker");
if (player.countCards("h")) player.showHandcards();
delete event.result.skill;
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
},
2024-04-15 18:10:02 +00:00
};
},
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
},
},
},
},
2024-04-15 18:10:02 +00:00
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);
});
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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;
}
});
}
},
2024-04-15 18:10:02 +00:00
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"
);
},
2024-04-15 18:10:02 +00:00
content: function () {
player.addTempSkill("dcsigong_round", "roundStart");
},
},
},
},
//孙寒华
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
if (mark) {
if (!event.logged) player.logSkill("dchuiling");
player.addMark("dchuiling", 1);
event.logged = true;
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
if (!event.logged) player.logSkill("dchuiling", target);
else player.line(target);
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
markColor: [
["rgba(241, 42, 42, 0.75)", "black"],
["", ""],
["rgba(18, 4, 4, 0.75)", "rgb(200, 200, 200)"],
],
2024-04-15 18:10:02 +00:00
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++;
2023-07-31 02:39:46 +00:00
}
}
2024-04-15 18:10:02 +00:00
game.broadcastAll(function (ind) {
var bgColor = lib.skill.dchuiling_hint.markColor[ind][0],
text =
'<span style="color: ' +
lib.skill.dchuiling_hint.markColor[ind][1] +
'">灵</span>';
for (var player of game.players) {
if (player.marks.dchuiling) {
player.marks.dchuiling.firstChild.style.backgroundColor = bgColor;
player.marks.dchuiling.firstChild.innerHTML = text;
}
}
2024-04-15 18:10:02 +00:00
}, Math.sign(black - red) + 1);
},
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
return num + 10;
}
return;
}
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
return num + 10;
}
return;
2024-04-15 18:10:02 +00:00
} else {
var color = get.color(card);
if ((color == "red" && red < black) || (color == "black" && red > black))
return num + 10;
}
},
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
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")));
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
result: {
player: function (player) {
var count = player.countMark("dchuiling");
if (count >= game.countPlayer() - 1) return 1;
return count >= 6 || player.hp <= 2 ? 1 : 0;
},
},
},
},
2024-04-15 18:10:02 +00:00
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
);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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");
},
],
];
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
var next = game.createEvent("dctaji_" + name);
next.player = player;
next.setContent(effect[1]);
break;
}
}
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
damage: {
trigger: { source: "damageBegin1" },
forced: true,
charlotte: true,
onremove: true,
filter: function (event, player) {
return event.player != player;
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.num += player.countMark("dctaji_damage");
player.removeSkill("dctaji_damage");
},
2024-04-15 18:10:02 +00:00
intro: {
content: "下次对其他角色造成伤害时,此伤害+#",
},
},
},
2024-04-15 18:10:02 +00:00
},
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)
);
}
},
2024-04-15 18:10:02 +00:00
content: function () {
player.loseMaxHp();
2024-04-15 18:10:02 +00:00
player.addTempSkill("dcqinghuang_add");
player.addMark("dcqinghuang_add", 1, false);
},
2024-04-15 18:10:02 +00:00
ai: {
combo: "dctaji",
},
subSkill: {
add: {
charlotte: true,
onremove: true,
},
2024-04-14 15:27:22 +00:00
},
},
//孟节
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var targets = result.targets;
player.line(targets);
2024-04-15 18:10:02 +00:00
for (var i = 0; i < targets.length; i++) {
targets[i].addMark(event.marks[i]);
}
}
event.goto(5);
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
player.logSkill("dcyinlu", game.players);
var list = [];
for (var mark of event.marks) {
list.push([
mark,
'<div class="popup text" style="width:calc(100% - 10px);display:inline-block"><div class="skill">【' +
get.translation(mark) +
"】</div><div>" +
lib.translate[mark + "_info"] +
"</div></div>",
]);
}
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);
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var marks = result.links;
for (var mark of marks) target.addMark(mark, 1);
event.marks.removeArray(marks);
2024-04-15 18:10:02 +00:00
for (var mark of event.marks) player.addMark(mark, 1);
}
2024-04-15 18:31:36 +00:00
"step 5";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
return game.hasPlayer((current) => {
return lib.skill.dcyinlu.hasMark(current);
2024-04-15 18:10:02 +00:00
});
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
} 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;
}
2024-04-15 18:10:02 +00:00
)
.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;
}
}
2024-04-15 18:10:02 +00:00
return Math.random();
})
.set("complexTarget", true);
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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 (
'<div class="skill">【' +
get.translation(mark) +
"】</div><div>" +
lib.translate[mark + "_info"] +
"</div>"
);
})
)
.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];
})()
);
}
2024-04-15 18:10:02 +00:00
} else {
if (_status.connectMode)
game.broadcastAll(function () {
delete _status.noclearcountdown;
game.stopCountChoose();
});
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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]);
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:31:36 +00:00
"step 5";
event.marks.shift();
2024-04-15 18:10:02 +00:00
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));
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.recover();
}
},
2024-04-15 18:10:02 +00:00
},
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");
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.draw(2);
}
},
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (!result.bool) {
player.logSkill("dcyinlu_zhangqi");
player.loseHp();
}
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
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");
},
2024-04-15 18:10:02 +00:00
onremove: function (player) {
delete player.storage.dcyinlu_xiang;
},
2024-04-15 18:10:02 +00:00
marktext: "芸",
intro: {
name: "芸香",
name2: "芸香",
markcount: function (storage, player) {
return player.countMark("dcyinlu_xiang");
},
content: function (storage, player) {
return (
"①结束阶段你可以弃置一张♣牌获得1点“芸香”值。②当你受到伤害时你可以扣减所有“芸香”值减少等量的伤害。<li>当前芸香值:" +
player.countMark("dcyinlu_xiang")
);
},
},
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
}
2024-04-15 18:10:02 +00:00
},
},
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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");
}
},
2024-04-15 18:10:02 +00:00
ai: {
combo: "dcyinlu",
},
},
//孙资刘放
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
filter: function (event, player) {
return lib.skill.dcqinshen.getNum() > 0;
},
2024-04-15 18:10:02 +00:00
content: function () {
player.draw(lib.skill.dcqinshen.getNum());
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
dcweidang: {
audio: 2,
trigger: { global: "phaseJieshuBegin" },
2023-09-05 05:17:59 +00:00
/**
* @deprecated
*/
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var card = get.cardPile((cardx) => get.cardNameLength(cardx) == num);
if (card) {
player.gain(card, "gain2");
if (player.hasUseTarget(card)) {
player.chooseUseTarget(card, true);
}
}
2024-04-15 18:10:02 +00:00
},
},
//三袁
2024-04-15 18:10:02 +00:00
dcneifa: {
audio: 2,
trigger: { player: "phaseUseBegin" },
content: function () {
"step 0";
player.draw(3);
2024-04-15 18:10:02 +00:00
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)
);
});
2024-04-15 18:10:02 +00:00
var numx = player.countCards("h", function (card) {
return get.type2(card, player) == "trick";
});
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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");
}
},
},
2024-04-15 18:10:02 +00:00
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);
});
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
player.logSkill("dcneifa", event.targets);
trigger.targets.addArray(event.targets);
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
},
},
//桥蕤
2024-04-15 18:10:02 +00:00
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")));
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var len = 0;
player.getHistory("lose", (evt) => {
if (evt.getParent(2) == event) len += evt.cards.length;
});
2024-04-15 18:10:02 +00:00
if (len > Math.max(0, player.hp) && player.maxHp < 9) {
player.gainMaxHp();
}
},
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
content: function () {
player.loseMaxHp();
2024-04-15 18:10:02 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
},
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({
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
ai2: () => 1,
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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");
2023-09-29 16:58:01 +00:00
}
2023-10-15 16:12:04 +00:00
});
}
},
},
//向朗
2024-04-15 18:10:02 +00:00
dckanji: {
audio: 2,
enable: "phaseUse",
usable: 2,
filter: function (event, player) {
return player.countCards("h");
},
content: function () {
"step 0";
player.showHandcards();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var suits = [];
player.getCards("h", (card) => suits.add(get.suit(card)));
if (suits.length == player.countCards("h")) {
player.draw(2);
2024-04-15 18:10:02 +00:00
event.suitsLength = suits.length;
player.addTempSkill("dckanji_check");
}
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
charlotte: true,
forced: true,
popup: false,
content: function () {
player.skip("phaseDiscard");
game.log(player, "跳过了", "#y弃牌阶段");
},
2024-04-15 18:10:02 +00:00
},
},
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;
},
},
},
},
2024-04-15 18:10:02 +00:00
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
);
},
2024-04-12 14:11:26 +00:00
async cost(event, trigger, player) {
2024-04-15 18:10:02 +00:00
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();
2024-04-12 14:11:26 +00:00
},
async content(event, trigger, player) {
2024-04-15 18:10:02 +00:00
if (event.cards.every((card) => get.type2(card) != get.type2(trigger.card))) {
2024-04-12 14:11:26 +00:00
trigger.getParent().dcqianzheng = true;
2024-04-15 18:10:02 +00:00
player.addTempSkill("dcqianzheng_gain");
}
2024-04-12 14:11:26 +00:00
await player.recast(event.cards);
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
charlotte: true,
forced: true,
popup: false,
content: function () {
player.gain(trigger.cards.filterInD("d"), "gain2");
},
2024-04-15 18:10:02 +00:00
},
},
},
//秦朗
2024-04-15 18:10:02 +00:00
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");
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
}
},
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
markimage: "image/card/handcard.png",
intro: {
content: function (storage, player) {
var num = player.storage.dchaochong;
return "手牌上限" + (num >= 0 ? "+" : "") + num;
},
},
2024-04-15 18:10:02 +00:00
mod: {
maxHandcard: function (player, num) {
return num + player.countMark("dchaochong");
},
},
2024-04-15 18:10:02 +00:00
ai: { threaten: 2.2 },
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var num = event.delta;
if (result.bool) num -= result.cards.length;
if (num > 0) player.draw(num);
},
2024-04-15 18:10:02 +00:00
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)];
}
},
},
},
},
//二傅
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 1";
player.loseHp();
2024-04-15 18:10:02 +00:00
if (trigger.player != player) game.asyncDraw([player, trigger.player]);
else player.draw("nodelay");
2024-04-15 18:31:36 +00:00
"step 2";
game.delayx();
},
2024-04-15 18:10:02 +00:00
ai: {
filterDamage: true,
skillTagFilter: function (player, tag, arg) {
if (arg && arg.player && arg.player.hasSkillTag("jueqing", false, player))
return false;
return true;
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
},
},
},
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
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;
2024-03-18 12:38:28 +00:00
});
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.loseMaxHp();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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"))
);
});
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var targets = result.targets.sortBySeat(_status.currentPhase);
player.line(targets);
2024-04-15 18:10:02 +00:00
for (var target of targets) {
target.drawTo(target.maxHp);
}
}
2024-04-15 18:10:02 +00:00
},
},
//郑浑
2024-04-15 18:10:02 +00:00
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(['<div class="text center">你的手牌</div>', player.getCards("h")]);
if (player.countCards("e"))
dialog.addArray(['<div class="text center">你的装备</div>', player.getCards("e")]);
if (target.countCards("h")) {
dialog.add('<div class="text center">' + get.translation(target) + "的手牌</div>");
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([
'<div class="text center">' + get.translation(target) + "的装备</div>",
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
);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
if (list1.length && list2.length) {
game.loseAsync({
2024-04-15 18:10:02 +00:00
lose_list: [
[player, list1],
[target, list2],
],
2024-04-15 18:10:02 +00:00
discarder: player,
}).setContent("discardMultiple");
event.finish();
2024-04-15 18:10:02 +00:00
} else if (list2.length) target.discard(list2);
else player.discard(list1);
2024-04-15 18:10:02 +00:00
if (list2.length >= 3) event.players.reverse();
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
event.players[0].line(event.players[1]);
event.players[1].damage(event.players[0]);
},
2024-04-15 18:10:02 +00:00
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
);
},
},
2024-04-15 18:10:02 +00:00
},
},
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
},
},
2024-04-15 18:10:02 +00:00
charlotte: true,
mod: {
maxHandcard: function (player, num) {
return num + player.countMark("dcpitian_handcard");
},
},
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
ai: {
effect: {
target: function (card, player, target) {
if (get.tag(card, "discard")) return 0.9;
if (get.tag(card, "damage")) return 0.95;
},
},
},
},
//新服二赵
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
player.storage.yizan = true;
},
derivation: "yizan_rewrite",
ai: {
combo: "yizan_use",
},
},
//黄皓
2024-04-15 18:10:02 +00:00
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);
});
},
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var zhu = game.filterPlayer((current) => current.getSeatNum() == 1)[0];
if (zhu && zhu.isIn()) {
if (target.countCards("h") > zhu.countCards("h")) player.draw();
}
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
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, "存畏:请弃置一张牌");
},
2024-04-27 11:59:50 +00:00
ai: {
halfneg: true
},
},
//刘辟
2024-04-15 18:10:02 +00:00
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]);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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];
},
},
},
2024-04-15 18:10:02 +00:00
subSkill: {
sha: {
trigger: { player: "phaseBegin" },
filter: function (event, player) {
return player.countMark("dcjuying_sha") > 0;
},
2024-04-15 18:10:02 +00:00
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");
},
2024-04-15 18:10:02 +00:00
intro: { content: "下回合使用【杀】的次数上限+#" },
},
2024-04-15 18:10:02 +00:00
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");
},
},
},
},
},
//新服加强魏贾诩
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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");
2024-04-15 18:31:36 +00:00
"step 1";
targets[0].chooseToCompare(targets[1]);
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
player.addTempSkill("dcjianshu_check", "phaseUseAfter");
if (result.bool) {
var cards = targets[0].getCards("he", function (card) {
return lib.filter.cardDiscardable(card, targets[0], "dcjianshu");
});
2024-04-15 18:10:02 +00:00
if (cards.length > 0) targets[0].discard(cards.randomGet());
targets[1].loseHp();
2024-04-15 18:10:02 +00:00
} else if (result.tie) {
targets[0].loseHp();
targets[1].loseHp();
2024-04-15 18:10:02 +00:00
} else {
var cards = targets[1].getCards("he", function (card) {
return lib.filter.cardDiscardable(card, targets[1], "dcjianshu");
});
2024-04-15 18:10:02 +00:00
if (cards.length > 0) targets[1].discard(cards.randomGet());
targets[0].loseHp();
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
check: {
trigger: { global: "dieAfter" },
charlotte: true,
forced: true,
popup: false,
filter: function (event, player) {
return event.getParent(3).name == "dcjianshu";
},
2024-04-15 18:10:02 +00:00
content: function () {
delete player.getStat("skill").dcjianshu;
},
},
},
2024-04-15 18:10:02 +00:00
ai: {
expose: 0.4,
order: 4,
result: {
target: function (player, target) {
if (ui.selected.targets.length) return -1;
return -0.5;
2024-04-15 18:10:02 +00:00
},
},
},
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
if (!game.hasPlayer((current) => current.maxHp < target.maxHp)) {
target.gainMaxHp();
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (target.isMinHp()) {
target.recover();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (target.isMinHandcard()) {
target.draw(Math.min(5, target.maxHp));
}
2024-04-15 18:31:36 +00:00
"step 3";
game.delayx();
},
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
},
},
},
},
//雷普
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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");
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
},
},
},
2024-04-15 18:10:02 +00:00
target: {
marktext: "掠",
intro: {
name: "私掠",
content: function (storage, player) {
return "被" + get.translation(storage) + "盯上了!";
},
},
},
2024-04-15 18:10:02 +00:00
robbed: { onremove: true, charlotte: true },
},
},
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
var choices = [];
var choiceList = ["获得“私掠”角色至多三张牌", "从牌堆中获得三张类型各不相同的牌"];
var targets = player.getStorage("dcsilve").filter((i) => i.isIn());
event.targets = targets;
if (targets.length) choices.push("选项一");
else choiceList[0] = '<span style="opacity:0.5; ">' + choiceList[0] + "</span>";
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("选项一") ? "选项一" : "选项二";
})()
);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.control == "选项一") {
if (targets.length) {
for (var target of targets) {
if (target.countGainableCards(player, "he") > 0) {
player.line(target);
2024-04-15 18:10:02 +00:00
player.gainPlayerCard(target, "he", true, [1, 3]);
}
}
}
2024-04-15 18:10:02 +00:00
} 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
);
});
2024-04-15 18:10:02 +00:00
if (card) cards.push(card);
}
2024-04-15 18:10:02 +00:00
if (cards.length) player.gain(cards, "gain2");
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
},
},
},
},
//庞会
2024-04-15 18:10:02 +00:00
dcyiyong: {
audio: 2,
trigger: {
source: "damageBegin1",
},
//usable:2,
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var lose_list = [],
cards = [];
for (var i = 0; i < result.length; i++) {
var current = event.list[i],
cards2 = result[i].cards;
cards.push(cards2);
2024-04-15 18:10:02 +00:00
event["cards" + i] = cards2;
event.cards = cards;
lose_list.push([current, cards2]);
}
game.loseAsync({ lose_list: lose_list }).setContent("discardMultiple");
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
if (num0 >= num1) {
trigger.num++;
}
2024-04-15 18:10:02 +00:00
},
},
//乐就
2024-04-15 18:10:02 +00:00
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,
];
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (typeof trigger.baseDamage != "number") trigger.baseDamage = 1;
trigger.baseDamage++;
2024-04-15 18:10:02 +00:00
player.addSkill("dccuijin_damage");
player.markAuto("dccuijin_damage", [trigger.card]);
if (!player.storage.dccuijin_map)
player.storage.dccuijin_map = { cards: [], targets: [] };
2024-03-09 06:59:51 +00:00
player.storage.dccuijin_map.cards.push(trigger.card);
player.storage.dccuijin_map.targets.push(trigger.targets.slice());
}
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
} else if (idx !== -1) {
player.storage.dccuijin_map.cards.splice(idx, 1);
player.storage.dccuijin_map.targets.splice(idx, 1);
2024-03-09 06:59:51 +00:00
}
event.finish();
2024-04-15 18:10:02 +00:00
} 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;
}
2024-04-15 18:10:02 +00:00
if (
player.storage.dccuijin_map.targets[idx].includes(target) &&
!target.hasHistory("damage", (evt) => {
return evt.card == card;
})
) {
player.logSkill("dccuijin_damage", source);
2024-03-09 06:59:51 +00:00
player.storage.dccuijin_map.targets[idx].remove(target);
player.draw(2);
2024-04-15 18:10:02 +00:00
if (source && source.isIn()) {
player.line(trigger.player, "green");
trigger.player.damage();
}
}
}
2024-04-15 18:31:36 +00:00
"step 1";
game.delayx();
},
},
},
},
//陈矫
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var list = [],
target = trigger.player;
event.target = target;
var choiceList = ["回复1点体力", "复原,摸两张牌"];
if (target.getDamagedHp() == 0)
choiceList[0] = '<span style="opacity:0.5; ">' + choiceList[0] + "</span>";
else list.push("选项一");
list.push("选项二");
target
.chooseControl(list)
.set("choiceList", choiceList)
.set("prompt", get.translation(player) + "对你发动了【协守】,请选择一项");
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.control == "选项一") {
target.recover();
2024-04-15 18:10:02 +00:00
} else {
target.link(false);
target.draw(2);
}
},
2024-04-15 18:10:02 +00:00
ai: {
expose: 0.3,
},
},
2024-04-15 18:10:02 +00:00
dcxieshoux: {
markimage: "image/card/handcard.png",
intro: {
content: function (storage, player) {
var num = player.storage.dcxieshoux;
return "手牌上限" + (num >= 0 ? "+" : "") + num;
},
},
2024-04-15 18:10:02 +00:00
charlotte: true,
mod: {
maxHandcard: function (player, num) {
return num + (player.storage.dcxieshoux || 0);
},
},
},
2024-04-15 18:10:02 +00:00
dcqingyan: {
trigger: {
target: "useCardToTargeted",
},
2024-04-15 18:10:02 +00:00
filter: function (event, player) {
return event.player != player && get.color(event.card) == "black";
},
2024-04-15 18:10:02 +00:00
usable: 2,
2024-04-12 14:11:26 +00:00
async cost(event, trigger, player) {
2024-04-15 18:10:02 +00:00
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();
2024-04-12 14:11:26 +00:00
}
},
async content(event, trigger, player) {
if (event.cards && event.cards.length) {
2024-04-18 12:20:44 +00:00
await player.discard(event.cards);
2024-04-12 14:11:26 +00:00
lib.skill.dcxieshou.change(player, 1);
} else {
player.drawTo(player.maxHp);
}
},
},
2024-04-15 18:10:02 +00:00
dcqizi: {
mod: {
cardSavable: function (card, player, target) {
if (
get.distance(player, target) > 2 &&
card.name == "tao" &&
target == _status.event.dying
)
return false;
},
2024-04-15 18:10:02 +00:00
},
2024-04-19 11:36:34 +00:00
ai: {
neg: true
},
},
//公孙度
2024-04-15 18:10:02 +00:00
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 = [
["≥", ""],
["≠", ""],
["≤", ""],
];
2024-04-15 18:10:02 +00:00
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] = '<span style="opacity:0.5">' + choiceList[0] + "</span>";
if (!recovers.length)
choiceList[1] = '<span style="opacity:0.5">' + choiceList[1] + "</span>";
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 "选项一";
}
})()
);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.control == "cancel2") {
event.finish();
2024-04-15 18:10:02 +00:00
} else {
var lose = result.control == "选项一",
targets = event[lose ? "loses" : "recovers"];
player.logSkill("dczhenze", targets);
for (var i of targets) {
i[lose ? "loseHp" : "recover"]();
}
}
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
},
},
},
},
//王烈
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
}
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.player.gain(trigger.cards.filterInD(), "gain2");
},
},
},
},
2024-04-15 18:10:02 +00:00
dchuagui: {
audio: 2,
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current != player && current.countCards("he") > 0;
});
},
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.logSkill("dchuagui");
event.players = result.targets.slice(0);
event._global_waiting = true;
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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();
};
2024-04-15 18:10:02 +00:00
var sendback = function (result, player) {
if (!Array.isArray(result)) {
result = [
Math.random() < 0.5 ? "仅展示牌" : "交出牌",
player.getCards("he").randomGet(),
];
}
2024-04-15 18:10:02 +00:00
event.results.push([player, result]);
};
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
if (!event.players.includes(players[i])) continue;
if (players[i].isOnline()) {
event.withol = true;
players[i].send(send, player);
players[i].wait(sendback);
2024-04-15 18:10:02 +00:00
} 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);
2024-04-15 18:10:02 +00:00
if (_status.connectMode) game.me.wait(sendback);
} else {
event.ai_targets.push(players[i]);
}
}
2024-04-15 18:10:02 +00:00
if (event.ai_targets.length) {
event.ai_targets.randomSort();
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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(),
];
}
2024-04-15 18:10:02 +00:00
event.results.push([player, result]);
}
}
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
if (event.withol && !event.resultOL) {
game.pause();
}
2024-04-15 18:31:36 +00:00
"step 5";
2024-04-15 18:10:02 +00:00
if (event.ai_targets.length > 0) {
event.withai = true;
game.pause();
}
2024-04-15 18:31:36 +00:00
"step 6";
delete event._global_waiting;
2024-04-15 18:10:02 +00:00
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 = [];
2024-04-15 18:10:02 +00:00
var list = ["仅展示牌的玩家", "交出牌的玩家"];
for (var i = 0; i < list.length; i++) {
dialog.add('<div class="text center">' + list[i] + "</div>");
var buttons = ui.create.div(".buttons", dialog.content);
dialog.buttonss.push(buttons);
buttons.classList.add("popup");
buttons.classList.add("guanxing");
}
dialog.open();
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 7";
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
player.gain(cards, "give");
//step 8
//game.delayx();
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
event.result[0] = result.control;
player.chooseCard("he", true).set("_global_waiting", true);
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
event.result[1] = result.cards[0];
},
},
//陈珪
2024-04-15 18:10:02 +00:00
dcyingtu: {
audio: 2,
trigger: {
global: ["gainAfter", "loseAsyncAfter"],
},
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
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) {
2024-04-12 14:11:26 +00:00
return target;
},
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
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");
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var card = result.cards[0];
event.card = card;
player.line(target);
player.give(card, target);
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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();
},
2024-04-15 18:10:02 +00:00
content: function () {
player.draw();
},
},
//黄权
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
filter: function (button, player) {
return !player.hasSkill("dcquanjian_" + button.link, null, null, false);
},
2024-04-15 18:10:02 +00:00
check: () => 1 + Math.random(),
backup: function (links) {
return get.copy(lib.skill["dcquanjian_" + links[0]]);
},
2024-04-15 18:10:02 +00:00
prompt: function (links) {
if (links[0] == "damage") return "令一名其他角色对攻击范围内的另一名角色造成1点伤害";
return "令一名其他角色将手牌数调整至手牌上限(至多摸至五张)且本回合内不能使用手牌";
},
},
2024-04-15 18:10:02 +00:00
ai: {
order: 2,
result: { player: 1 },
},
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
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]));
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.index == 0) {
targets[1].damage(targets[0]);
2024-04-15 18:10:02 +00:00
} 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;
}
2024-04-15 18:10:02 +00:00
return get.damageEffect(target, ui.selected.targets[0], player, player);
},
},
},
},
2024-04-15 18:10:02 +00:00
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;
});
}
2024-04-15 18:10:02 +00:00
event.num = num;
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.index == 0) {
if (event.index == 0) target.chooseToDiscard("h", true, num);
else target.draw(num);
2024-04-15 18:10:02 +00:00
} else {
target.addMark("dcquanjian_effect", 1, false);
target.addTempSkill("dcquanjian_effect");
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
target.addTempSkill("dcquanjian_disable");
},
2024-04-15 18:10:02 +00:00
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;
},
},
},
},
2024-04-15 18:10:02 +00:00
effect: {
charlotte: true,
trigger: { player: "damageBegin3" },
forced: true,
onremove: true,
marktext: "谏",
content: function () {
trigger.num += player.countMark(event.name);
player.removeSkill(event.name);
},
2024-04-15 18:10:02 +00:00
intro: { content: "下次受到的伤害+#" },
ai: { threaten: 2.5 },
},
2024-04-15 18:10:02 +00:00
disable: {
charlotte: true,
mod: {
cardEnabled(card, player) {
2024-04-12 12:22:36 +00:00
if (card.cards) {
2024-04-15 18:10:02 +00:00
const hs = player.getCards("h");
if (card.cards.some((card) => hs.includes(card))) return false;
2024-04-12 12:22:36 +00:00
}
},
2024-04-15 18:10:02 +00:00
cardSavable(card, player) {
2024-04-12 12:22:36 +00:00
if (card.cards) {
2024-04-15 18:10:02 +00:00
const hs = player.getCards("h");
if (card.cards.some((card) => hs.includes(card))) return false;
2024-04-12 12:22:36 +00:00
}
},
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
},
},
//尹夫人
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var card = result.cards[0];
player.line(targets[0]);
2024-04-15 18:10:02 +00:00
player.showCards(
card,
get.translation(player) + "对" + get.translation(targets[0]) + "发动了【媵予】"
);
event.cards.push(card);
2024-04-15 18:10:02 +00:00
player.choosePlayerCard(targets[1], true, "h");
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
var card = result.cards[0];
player.line(targets[1]);
2024-04-15 18:10:02 +00:00
player.showCards(
card,
get.translation(player) + "对" + get.translation(targets[1]) + "发动了【媵予】"
);
event.cards.push(card);
2024-04-15 18:10:02 +00:00
if (get.suit(cards[0], targets[0]) == get.suit(cards[1], targets[1])) event.finish();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 5";
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
},
},
},
2024-04-15 18:10:02 +00:00
subSkill: {
eff1: {
mod: {
maxHandcard: (player, num) => num + player.countMark("dcyongbi_eff1"),
},
2024-04-15 18:10:02 +00:00
charlotte: true,
onremove: true,
marktext: "拥",
intro: { content: "手牌上限+#" },
},
2024-04-15 18:10:02 +00:00
eff2: {
trigger: { player: "damageBegin4" },
forced: true,
filter: function (event, player) {
return event.num > 1;
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.num -= player.countMark("dcyongbi_eff2");
},
2024-04-15 18:10:02 +00:00
charlotte: true,
onremove: true,
marktext: "嬖",
intro: { content: "受到大于1的伤害时此伤害-#" },
},
},
},
//吕旷吕翔
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
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;
}
}
}
}
2024-04-15 18:10:02 +00:00
if (goon) {
if (effect > 0) return 6 + effect - get.value(cardx);
return 0;
}
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
if (cards.length > 0) {
player.line(current, "thunder");
current.$throw(cards);
2024-04-15 18:10:02 +00:00
lose_list.push([current, cards]);
event.cards2.addArray(cards);
}
}
2024-04-15 18:10:02 +00:00
if (lose_list.length) {
event.lose_list = lose_list;
game.loseAsync({
2024-04-15 18:10:02 +00:00
lose_list: lose_list,
}).setContent("chooseToCompareLose");
} else {
event.goto(3);
2024-04-15 18:10:02 +00:00
player
.chooseTarget(
true,
lib.filter.notMe,
"将" + get.translation(event.cards[0]) + "交给一名其他角色"
)
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
});
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var cards = event.cards2;
if (cards.length > 0) {
if (event.lose_list) game.delayx();
player.gain(cards, "gain2");
}
event.finish();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
player.give(cards, target);
}
},
2024-04-15 18:10:02 +00:00
ai: {
order: 2,
result: {
player: 1,
},
},
},
2024-04-15 18:10:02 +00:00
dcliehou: {
audio: 2,
trigger: { player: "phaseDrawBegin2" },
forced: true,
filter: function (event, player) {
return !event.numFixed;
},
2024-04-15 18:10:02 +00:00
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
);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (!result.bool) player.loseHp();
},
},
},
2024-04-15 18:10:02 +00:00
marktext: "爵",
intro: {
name: "列侯(爵)",
name2: "爵",
content: "〖列侯〗的摸牌数+#",
},
},
//管亥
2024-04-15 18:10:02 +00:00
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) + "张牌"
);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:10:02 +00:00
if (cards.length) player.gain(cards, target, "giveAuto", "bySelf");
else {
var cards = result.cards.filter(function (card) {
return lib.filter.canBeDiscarded(card, target, player);
});
2024-04-15 18:10:02 +00:00
if (cards.length) target.discard(cards, "notBySelf");
}
}
},
},
2024-04-15 18:10:02 +00:00
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");
})
);
},
2024-04-15 18:10:02 +00:00
content: function () {
var hs = player.countCards("h");
trigger.directHit.addArray(
game.filterPlayer(function (current) {
return current != player && current.countCards("h") >= hs;
})
);
},
2024-04-15 18:10:02 +00:00
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")
);
},
},
},
//胡昭
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
if (player.hasDisabledSlot(i)) list2.push(i);
}
2024-04-15 18:10:02 +00:00
(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) + "栏" : "判定区",
]);
}
2024-04-15 18:10:02 +00:00
dialog.add([adds, "tdnodes"]);
};
if (list1.length) {
dialog.addText("未废除");
addTable(list1, true);
}
2024-04-15 18:10:02 +00:00
if (list2.length) {
dialog.addText("已废除");
addTable(list2, false);
}
return dialog;
},
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
select: [1, Infinity],
backup: function (links, player) {
if (!links[0][1]) {
return {
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
player.addTempSkills("rehuomo", { player: "phaseBegin" });
},
2024-04-15 18:10:02 +00:00
};
} else {
return {
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
bool = true;
}
2024-04-15 18:10:02 +00:00
if (list.length > 0) player.disableEquip(list);
if (bool) player.disableJudge();
target.draw(num);
},
2024-04-15 18:10:02 +00:00
ai: {
tag: {
draw: 1,
},
2024-04-15 18:10:02 +00:00
result: {
target: 2,
},
},
2024-04-15 18:10:02 +00:00
};
}
},
2024-04-15 18:10:02 +00:00
prompt: function (links, player) {
if (!links[0][1]) {
return "恢复一个装备栏或判定区并获得〖活墨〗";
}
2024-04-15 18:10:02 +00:00
var numc = get.cnNumber(links.length);
return "废除" + numc + "个区域并令一名角色摸" + numc + "张牌";
},
},
2024-04-15 18:10:02 +00:00
derivation: "rehuomo",
ai: {
order: 8,
result: { player: 1 },
},
2024-04-15 18:10:02 +00:00
subSkill: { backup: {} },
},
2024-04-15 18:10:02 +00:00
xianwang: {
mod: {
globalTo: function (source, player, distance) {
var num = player.countDisabledSlot();
if (num > 0) return distance + (num > 2 ? 2 : 1);
},
2024-04-15 18:10:02 +00:00
globalFrom: function (source, player, distance) {
var num = source.countDisabledSlot();
if (num > 0) return distance - (num > 2 ? 2 : 1);
},
},
},
//刘巴
2024-04-15 18:10:02 +00:00
dczhubi: {
audio: 2,
trigger: {
global: ["loseAfter", "loseAsyncAfter"],
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
prompt2: "检索一张【无中生有】并置于牌堆顶",
content: function () {
var card = get.cardPile(function (card) {
return card.name == "wuzhong" && get.suit(card) != "diamond";
});
2024-04-15 18:10:02 +00:00
if (card) {
game.log(player, "将", card, "置于牌堆顶");
card.fix();
2024-04-15 18:10:02 +00:00
ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
game.updateRoundNumber();
game.delayx();
}
},
},
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
} 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;
}
2024-04-15 18:10:02 +00:00
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;
}
});
},
2024-04-15 18:10:02 +00:00
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;
}
});
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
} 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);
}
});
}
2024-04-15 18:10:02 +00:00
if (cards && cards.length > 0) player.gain(cards, "gain2");
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.gaintag.add("dcliuzhuan_tag");
trigger.player.addTempSkill("dcliuzhuan_tag");
},
},
2024-04-15 18:10:02 +00:00
tag: {
charlotte: true,
onremove: (player, skill) => player.removeGaintag(skill),
},
},
},
//张勋
2024-04-15 18:10:02 +00:00
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")
)
);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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",
});
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
effect: {
audio: "suizheng",
charlotte: true,
mod: {
targetInRange: function (card) {
if (card.name == "sha") return true;
},
2024-04-15 18:10:02 +00:00
cardUsable: function (card, player, num) {
if (card.name == "sha") return num + player.countMark("suizheng_effect");
},
},
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
var targets = player.getStorage("suizheng_source").slice(0).sortBySeat();
event.targets = targets;
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:10:02 +00:00
if (!list.length) event.finish();
else if (target.isIn()) {
list = list.filter(function (i) {
return target.canUse("sha", i, false);
});
2024-04-15 18:10:02 +00:00
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 };
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
target.useCard(
{
name: "sha",
isCard: true,
},
result.targets,
false,
"suizheng_effect"
);
}
2024-04-15 18:10:02 +00:00
if (targets.length > 0) event.goto(1);
},
2024-04-15 18:10:02 +00:00
onremove: function (player) {
delete player.storage.suizheng_effect;
delete player.storage.suizheng_source;
},
2024-04-15 18:10:02 +00:00
intro: { content: "使用【杀】无距离限制且次数上限+#" },
},
},
},
//纪灵
2024-04-15 18:10:02 +00:00
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);
})
);
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
var goon;
2024-04-15 18:10:02 +00:00
if (player.needsToDiscard() > 1) {
goon = player.hasCard(function (card) {
return card.number > 10 && get.value(card) <= 5;
});
2024-04-15 18:10:02 +00:00
} else if (player.hasSha()) {
goon = player.hasCard(function (card) {
return (card.number >= 9 && get.value(card) <= 5) || get.value(card) <= 3;
});
2024-04-15 18:10:02 +00:00
} else {
goon = player.hasCard(function (card) {
return get.value(card) <= 5;
});
}
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("dcshuangren", target);
player.chooseToCompare(target);
2024-04-15 18:10:02 +00:00
} else {
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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和BB的势力需为" +
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();
}
2024-04-15 18:10:02 +00:00
} else {
player.addTempSkill("dcshuangren_debuff", "phaseUseAfter");
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (result.bool && result.targets && result.targets.length) {
player.useCard({ name: "sha", isCard: true }, result.targets, false);
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
debuff: {
charlotte: true,
mod: {
cardEnabled: function (card) {
if (card.name == "sha") return false;
},
},
},
},
},
//羊祜
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.draw();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var target = trigger.player;
if (player.countCards("h") <= target.countCards("h") && target.countCards("he") > 0) {
player.discardPlayerCard(target, true, "he");
player.addExpose(0.2);
}
},
},
2024-04-15 18:10:02 +00:00
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
);
},
2024-04-15 18:10:02 +00:00
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,
};
2024-04-15 18:10:02 +00:00
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")))
);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcmingfa", target);
var card = {
name: trigger.card.name,
nature: trigger.card.nature,
isCard: true,
};
2024-04-15 18:10:02 +00:00
player.storage.dcmingfa_info = [card, target];
player.addToExpansion(trigger.cards.filterInD(), "gain2").gaintag.add("dcmingfa");
}
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
var info = player.storage.dcmingfa_info;
if (info) {
dialog.addText(
"记录牌:" +
get.translation(info[0]) +
"<br>记录目标:" +
get.translation(info[1])
);
}
},
2024-04-15 18:10:02 +00:00
content: "expansion",
},
2024-04-15 18:10:02 +00:00
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
delete player.storage.dcmingfa_info;
},
2024-04-15 18:10:02 +00:00
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];
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
var target = trigger.player;
event.target = target;
var card = player.storage.dcmingfa_info[0];
delete player.storage.dcmingfa_info;
2024-04-15 18:10:02 +00:00
event.card = card;
event.count = Math.max(1, Math.min(5, target.countCards("h")));
if (!event.player.isIn()) event.goto(2);
2024-04-15 18:31:36 +00:00
"step 1";
event.count--;
2024-04-15 18:10:02 +00:00
if (target.isIn() && lib.filter.targetEnabled2(card, player, target)) {
player.useCard(get.copy(card), target);
if (event.count > 0) event.redo();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var cards = player.getExpansions("dcmingfa");
if (cards.length > 0) player.loseToDiscardpile(cards);
},
},
},
},
//蔡瑁张允
2024-04-15 18:10:02 +00:00
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();
});
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
if (!player.isLinked()) player.link();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var num = game.countPlayer(function (current) {
return current != player && current.hp == player.hp && !current.isLinked();
});
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var targets = result.targets.sortBySeat();
player.line(targets, "green");
for (var i of targets) i.link();
}
2024-04-15 18:10:02 +00:00
},
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) {
2024-04-20 13:52:28 +00:00
player.chooseToDiscard("he", true);
player.recover();
2024-04-15 18:10:02 +00:00
} else {
player.damage("fire", "nosource");
player.draw(5);
}
},
2024-04-15 18:10:02 +00:00
ai: { halfneg: true },
},
//滕公主
2024-04-15 18:10:02 +00:00
xingchong: {
audio: 2,
trigger: { global: "roundStart" },
direct: true,
filter: function (event, player) {
return player.maxHp > 0;
},
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (player.countCards("h") > 0) {
player
.chooseCard(
"h",
[1, Math.min(player.countCards("h"), event.num)],
"请选择要展示的牌"
)
.set("ai", () => 1 + Math.random());
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
forced: true,
popup: false,
charlotte: true,
onremove: function (player) {
player.removeGaintag("xingchong");
},
content: function () {
"step 0";
if (trigger.delay === false) game.delayx();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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++;
}
2024-04-15 18:10:02 +00:00
} 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);
},
},
},
},
2024-04-15 18:10:02 +00:00
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);
2023-09-13 11:56:48 +00:00
});
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
if (
game.hasGlobalHistory("cardMove", function (evt) {
return evt.washCard && evt.shuffleNumber == 1;
})
) {
2023-09-13 11:56:48 +00:00
player.gainMaxHp();
game.delayx();
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (
game.hasGlobalHistory("cardMove", function (evt) {
return evt.washCard && evt.shuffleNumber == 2;
})
) {
2023-09-13 11:56:48 +00:00
player.recover();
game.delayx();
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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");
},
},
2024-04-15 18:10:02 +00:00
marktext: "年",
intro: {
content: "手牌上限+#",
},
},
},
},
//黄承彦
2024-04-15 18:10:02 +00:00
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
);
});
2024-04-15 18:10:02 +00:00
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
);
});
2024-04-15 18:10:02 +00:00
if (!skills.length && target.hasEmptySlot(2)) return 1;
return -0.5 * skills.length;
},
},
},
2024-04-15 18:10:02 +00:00
subSkill: {
blocker: {
init: function (player, skill) {
player.addSkillBlocker(skill);
},
2024-04-15 18:10:02 +00:00
onremove: function (player, skill) {
player.removeSkillBlocker(skill);
player.removeAdditionalSkill(skill);
delete player.storage.dcjiezhen_blocker;
},
2024-04-15 18:10:02 +00:00
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 "无失效技能";
},
},
2024-04-15 18:10:02 +00:00
},
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");
}
2024-04-15 18:10:02 +00:00
player.removeSkill("dcjiezhen_clear");
event.finish();
return;
}
2024-04-15 18:10:02 +00:00
if (trigger.name == "phase") event.targets = targets.slice(0).sortBySeat();
else event.targets = [trigger.player];
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var target = targets.shift();
var storage = player.getStorage("dcjiezhen_clear");
if (storage.includes(target)) {
storage.remove(target);
2024-04-15 18:10:02 +00:00
target.removeSkill("dcjiezhen_blocker");
if (target.isIn() && target.countGainableCards(player, "hej") > 0)
player.gainPlayerCard(target, "hej", true);
}
2024-04-15 18:10:02 +00:00
if (targets.length > 0) {
event.redo();
2024-04-15 18:10:02 +00:00
} else {
player.removeSkill("dcjiezhen_clear");
}
},
},
},
2024-04-15 18:10:02 +00:00
derivation: "bazhen",
},
2024-04-15 18:10:02 +00:00
dczecai: {
audio: 2,
trigger: { global: "roundStart" },
limited: true,
skillAnimation: true,
direct: true,
animationColor: "soil",
filter: function (event, player) {
return game.roundNumber > 1;
},
2024-04-15 18:10:02 +00:00
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++;
}
2024-04-15 18:10:02 +00:00
if (history[i].isRound) break;
}
return num;
};
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
if (evt.player != target && !evt._finished) {
evt.finish();
2024-04-15 18:10:02 +00:00
evt._triggered = 5;
var evtx = evt.player.insertPhase();
delete evtx.skill;
}
}
}
},
2024-04-15 18:10:02 +00:00
derivation: "rejizhi",
subSkill: {
effect: {
charlotte: true,
mark: true,
marktext: "才",
intro: { content: "已拥有技能〖集智〗" },
},
},
},
2024-04-15 18:10:02 +00:00
dcyinshi: {
audio: 2,
trigger: { player: "damageBegin" },
usable: 1,
filter: function (event, player) {
return !event.card || get.color(event.card) == "none";
},
2024-04-15 18:10:02 +00:00
forced: true,
content: function () {
trigger.cancel();
},
2024-04-15 18:10:02 +00:00
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"
);
},
2024-04-15 18:10:02 +00:00
content: function () {
player.gain(trigger.result.card, "gain2");
},
},
},
},
//高览
2024-04-15 18:10:02 +00:00
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))
);
});
},
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
player.useCard({ name: result.control, isCard: true }, target, false);
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
player.draw(target.isHealthy() ? 2 : 1);
},
2024-04-15 18:10:02 +00:00
mark: "character",
intro: { content: "已指定$为目标" },
},
},
},
//管宁
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
marktext: "席",
mark: true,
intro: {
markcount: function (storage) {
return storage[1];
},
2024-04-15 18:10:02 +00:00
content: function (storage, player) {
if (!storage) return;
var str = "<li>";
if (!storage[0].length) {
str += "已无可用牌";
} else {
str += "剩余可用牌:";
str += get.translation(storage[0]);
}
str += "<br><li>“席”标记数量:";
str += storage[1];
return str;
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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 {
2024-04-15 18:10:02 +00:00
audio: "dunshi",
filterCard: function () {
return false;
},
2024-04-15 18:10:02 +00:00
popname: true,
viewAs: {
name: links[0][2],
isCard: true,
},
2024-04-15 18:10:02 +00:00
selectCard: -1,
precontent: function () {
player.addTempSkill("dunshi_damage");
player.storage.dunshi_damage = event.result.card.name;
},
};
},
2024-04-15 18:10:02 +00:00
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;
},
},
},
2024-04-15 18:10:02 +00:00
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);
}
}
2024-04-15 18:10:02 +00:00
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;
}
}
}
}
2024-04-15 18:10:02 +00:00
_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点体力上限然后摸等同于“席”数的牌",
2023-10-18 04:07:33 +00:00
];
2024-04-15 18:10:02 +00:00
var next = player.chooseButton([
"遁世:请选择两项",
[
list.map((item, i) => {
return [i, item];
}),
"textbutton",
],
2023-10-18 04:07:33 +00:00
]);
2024-04-15 18:10:02 +00:00
next.set("forced", true);
next.set("selectButton", 2);
next.set("ai", function (button) {
var player = _status.event.player;
switch (button.link) {
case 0:
2024-04-15 18:10:02 +00:00
if (get.attitude(player, _status.currentPhase) > 0) return 3;
return 0;
case 1:
return 1;
case 2:
2024-04-15 18:10:02 +00:00
var num = player.storage.dunshi[1];
for (var i of ui.selected.buttons) {
if (i.link == 1) num++;
}
2024-04-15 18:10:02 +00:00
if (num > 0 && player.isDamaged()) return 2;
return 0;
}
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:10:02 +00:00
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(
'<div class="popup pointerdiv" style="width:80%;display:inline-block"><div class="skill">【' +
get.translation(skills[i]) +
"】</div><div>" +
lib.translate[skills[i] + "_info"] +
"</div></div>"
);
}
2024-04-15 18:10:02 +00:00
dialog.addText(" <br> ");
};
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];
});
}
2024-04-15 18:10:02 +00:00
} else event.goto(3);
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
game.broadcastAll("closeDialog", event.videoId);
target.addSkills(result.control);
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
var storage = player.storage.dunshi;
if (event.links.includes(1)) {
storage[0].remove(event.cardname);
storage[1]++;
2024-04-15 18:10:02 +00:00
player.markSkill("dunshi");
}
2024-04-15 18:10:02 +00:00
if (event.links.includes(2)) {
player.loseMaxHp();
2024-04-15 18:10:02 +00:00
if (storage[1] > 0) player.draw(storage[1]);
}
},
},
},
},
//吉本
2024-04-15 18:10:02 +00:00
xunli: {
audio: 2,
trigger: {
global: ["loseAfter", "loseAsyncAfter"],
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
var next = player.chooseToMove("寻疠:是否交换“疠”和手牌?");
next.set("list", [
[get.translation(player) + "(你)的疠", cards],
[
"手牌区",
player.getCards("h", (card) => get.color(card, player) == "black"),
],
]);
2024-04-15 18:10:02 +00:00
next.set("filterMove", function (from, to) {
return typeof to != "number";
});
2024-04-15 18:10:02 +00:00
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);
};
2024-04-15 18:10:02 +00:00
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];
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
player.logSkill("zhishi", target);
player.storage.zhishi_mark = target;
player.addTempSkill("zhishi_mark", { player: "phaseBegin" });
}
},
2024-04-19 11:36:34 +00:00
ai: {
combo: "xunli",
expose: 0.3
},
2024-04-15 18:10:02 +00:00
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),
'<div class="text center">弃置任意张“疠”并令其摸等量的牌</div>',
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.logSkill("zhishi", target);
player.loseToDiscardpile(result.links);
target.draw(result.links.length);
}
},
2024-04-15 18:10:02 +00:00
mark: "character",
intro: {
content: "决定帮助$,具体帮不帮另说",
},
},
},
},
2024-04-15 18:10:02 +00:00
lieyi: {
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.getExpansions("xunli").length > 0;
},
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:10:02 +00:00
if (cards2.length) {
player
.chooseButton(["对" + get.translation(target) + "使用一张牌", cards2], true)
.set("ai", function (button) {
return get.order(button.link);
});
} else {
event.finish();
2024-04-15 18:10:02 +00:00
if (cards.length) player.loseToDiscardpile(cards);
if (
target.isIn() &&
!target.hasHistory("damage", function (evt) {
return evt.getParent("lieyi") == event && evt._dyinged;
})
)
player.loseHp();
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
player.useCard(result.links[0], target, false);
event.goto(0);
},
2024-04-15 18:10:02 +00:00
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");
}
}
2024-04-15 18:10:02 +00:00
if (damage >= target.hp) return effect;
if (player.hp > 2 && cards.length > 3) return effect / 3;
return 0;
},
},
2024-04-27 10:17:05 +00:00
combo: "xunli"
},
},
//马日磾
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
player.addTempSkill("bingjie_effect");
game.delayx();
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
}
},
2024-04-15 18:10:02 +00:00
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];
},
},
},
},
},
},
2024-04-15 18:10:02 +00:00
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]);
},
2024-04-15 18:10:02 +00:00
content: function () {
player.gainMaxHp();
player.recover();
},
},
//孙茹
2024-04-15 18:10:02 +00:00
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";
});
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.num++;
2024-04-15 18:10:02 +00:00
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");
}
}
},
2024-04-15 18:10:02 +00:00
subSkill: {
effect: {
charlotte: true,
mod: {
maxHandcard: (player, num) => num + player.countMark("xiecui_effect"),
},
2024-04-15 18:10:02 +00:00
marktext: "翠",
onremove: true,
intro: { content: "手牌上限+#" },
},
},
2024-04-15 18:10:02 +00:00
ai: { threaten: 1.75 },
},
2024-04-15 18:10:02 +00:00
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
);
2023-10-24 02:11:11 +00:00
});
2024-04-15 18:10:02 +00:00
},
content: function () {
"step 0";
if (player == trigger.player) {
player.chooseCard("h", true, "请展示一张手牌");
} else {
player.choosePlayerCard(trigger.player, true, "h");
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (target.isMinHp()) target.recover();
},
},
//夏侯令女
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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]);
}
2024-04-15 18:10:02 +00:00
return ui.create.dialog("浮萍", [list2, "vcard"]);
},
2024-04-15 18:10:02 +00:00
check: function (button) {
if (_status.event.getParent().type != "phase") return 1;
return _status.event.player.getUseValue({ name: button.link[2] }, null, true);
},
2024-04-15 18:10:02 +00:00
backup: function (links, player) {
return {
2024-04-15 18:10:02 +00:00
audio: "fuping",
filterCard: (card) => get.type(card) != "basic",
position: "he",
popname: true,
viewAs: {
name: links[0][2],
},
2024-04-15 18:10:02 +00:00
check: function (card) {
return 8 - get.value(card);
},
2024-04-15 18:10:02 +00:00
precontent: function () {
player.addTempSkill("fuping_round");
player.markAuto("fuping_round", [event.result.card.name]);
},
2024-04-15 18:10:02 +00:00
};
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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();
});
},
},
2024-04-15 18:10:02 +00:00
backup: { audio: "fuping" },
round: { charlotte: true, onremove: true },
},
},
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.addMark("weilie", 1, false);
target.recover();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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 烟雨墨染
2024-04-15 18:10:02 +00:00
yuanyu: {
audio: 2,
enable: "phaseUse",
usable: 1,
content: function () {
"step 0";
player.draw();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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({
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
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);
},
});
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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];
},
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
} else if (player.getStorage("yuanyu_damage").includes(event.player)) {
return event.player.countCards("h") > 0;
}
return false;
}
},
2024-04-15 18:10:02 +00:00
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];
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
event.target = event.targets.shift();
event.count = trigger.name == "damage" ? trigger.num : 1;
2024-04-15 18:31:36 +00:00
"step 2";
event.count--;
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:10:02 +00:00
if (suits.length) {
var str = "目前未包含的花色:";
for (var i of suits) str += get.translation(i);
next.set("prompt2", str);
}
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
player.addToExpansion(result.cards, target, "give").gaintag.add("yuanyu");
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
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));
2024-04-15 18:10:02 +00:00
if (!suits.length) return true;
}
return false;
},
2024-04-15 18:10:02 +00:00
logTarget: () => _status.currentPhase,
prompt2: "获得所有“怨”",
check: () => true,
content: function () {
"step 0";
player.removeSkill("yuanyu_damage");
var cards = player.getExpansions("yuanyu");
player.gain(cards, "gain2");
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
var target = _status.currentPhase;
if (player == target) {
player.addMark("xiyan_buff", 4, false);
player.addTempSkill("xiyan_buff");
delete player.getStat("skill").yuanyu;
event.finish();
2024-04-15 18:10:02 +00:00
} else {
player
.chooseBool(
"夕颜:是否令" +
get.translation(target) +
"本回合的手牌上限-4且不能使用基本牌"
)
.set("ai", function () {
return _status.event.bool;
})
.set("bool", get.attitude(player, target) < 0);
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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");
},
2024-04-15 18:10:02 +00:00
cardUsable: function (card, player) {
return Infinity;
},
},
2024-04-15 18:10:02 +00:00
sub: true,
},
2024-04-15 18:10:02 +00:00
debuff: {
charlotte: true,
mark: true,
marktext: " - ",
intro: {
content: "本回合手牌上限-#且不能使用基本牌",
},
mod: {
maxHandcard: function (player, num) {
return num - player.countMark("xiyan_debuff");
},
2024-04-15 18:10:02 +00:00
cardEnabled: function (card) {
if (get.type(card) == "basic") return false;
},
2024-04-15 18:10:02 +00:00
cardSavable: function (card) {
if (get.type(card) == "basic") return false;
},
},
2024-04-15 18:10:02 +00:00
sub: true,
},
},
2024-04-15 18:10:02 +00:00
ai: {
combo: "yuanyu",
},
},
//滕胤
2024-04-15 18:10:02 +00:00
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) + "发动了【陈见】");
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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 "选项一";
});
2024-01-29 01:48:40 +00:00
else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
event.goon = 0;
event.choosed = result.control;
if (result.control === "cancel2") event.finish();
else if (result.control === "选项二") event.goto(6);
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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);
2024-01-29 01:48:40 +00:00
else event.finish();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
if (result.bool) {
2024-01-29 01:48:40 +00:00
event.goon++;
2024-04-15 18:10:02 +00:00
var suit = get.suit(result.cards[0], player);
var cards2 = event.cards.filter(function (i) {
return get.suit(i, false) == suit;
});
2024-04-15 18:10:02 +00:00
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);
2024-01-29 01:48:40 +00:00
else event.goto(8);
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 5";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
target.gain(event.cards2, "gain2");
event.cards.removeArray(event.cards2);
}
2024-04-15 18:10:02 +00:00
if (event.choosed === "选项二") event.goto(8);
2024-04-15 18:31:36 +00:00
"step 6";
2024-04-15 18:10:02 +00:00
var cards2 = cards.filter(function (i) {
return player.hasUseTarget(i);
});
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 7";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.chooseUseTarget(true, result.links[0], false);
2024-01-29 01:48:40 +00:00
event.cards.removeArray(result.links);
2024-04-15 18:10:02 +00:00
event.goon += 2;
if (event.choosed === "选项二") event.goto(3);
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 8";
2024-04-15 18:10:02 +00:00
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;
},
},
2024-04-15 18:10:02 +00:00
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");
},
2024-04-15 18:10:02 +00:00
content: function () {
player.draw();
},
2024-04-15 18:10:02 +00:00
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];
}
},
},
},
},
//张嫙
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
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)+'张'
2024-04-15 18:10:02 +00:00
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) + "】";
},
2024-04-15 18:10:02 +00:00
check: function (event, player) {
return !get.tag(event.card, "norepeat");
},
2024-04-15 18:10:02 +00:00
content: function () {
//player.addTempSkill('tongli_effect');
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
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();
},
},
},*/
},
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
if (card) cards.push(card);
}
2024-04-15 18:10:02 +00:00
if (cards.length) player.gain(cards, "gain2");
},
},
//王桃王悦
2024-04-15 18:10:02 +00:00
huguan: {
audio: 2,
audioname: ["wangyue"],
init: function (player) {
game.addGlobalSkill("huguan_all");
},
2024-04-15 18:10:02 +00:00
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";
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
},
},
2024-04-15 18:10:02 +00:00
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;
},
2023-10-05 05:52:09 +00:00
},
2024-04-15 18:10:02 +00:00
trigger: {
player: ["phaseUseBegin", "useCard"],
2023-10-05 05:52:09 +00:00
},
2024-04-15 18:10:02 +00:00
filter: function (event, player) {
if (event.name === "useCard") return player.storage.huguan_all;
2023-10-05 05:52:09 +00:00
return true;
},
2024-04-15 18:10:02 +00:00
silent: true,
charlotte: true,
content: function () {
"step 0";
if (trigger.name === "useCard") {
2023-10-05 05:52:09 +00:00
player.storage.huguan_all = 0;
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 1";
2023-10-05 05:52:09 +00:00
let num = -157;
2024-04-15 18:10:02 +00:00
game.countPlayer(function (current) {
if (current.hasSkill("huguan"))
num = Math.max(num, get.attitude(_status.event.player, current));
}, true);
2024-04-15 18:10:02 +00:00
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;
},
},
},
},
2024-04-15 18:10:02 +00:00
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));
}
});
2024-04-15 18:10:02 +00:00
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));
2024-04-15 18:10:02 +00:00
}, "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({
2024-04-15 18:10:02 +00:00
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);
2023-10-05 05:52:09 +00:00
return 8 - get.value(card);
},
2024-04-15 18:10:02 +00:00
ai2: function (target) {
let player = _status.event.player,
source = _status.event.getTrigger().player;
2023-10-05 05:52:09 +00:00
let recoverer = player === target ? source : player;
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
},
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = trigger.player;
player.logSkill("yaopei", target);
player.discard(result.cards);
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
} else {
if (
(player.isHealthy() || player.hp > target.hp) &&
(get.mode() != "identity" || player.identity != "nei")
)
player.addExpose(0.15);
target.draw(2);
player.recover();
}
}
},
2024-04-19 11:36:34 +00:00
ai: {
combo: "huguan"
},
},
2024-04-15 18:10:02 +00:00
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
);
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
let he = player.getCards("he"),
2023-10-05 05:52:09 +00:00
disval = 0,
dis = 0,
spare = 30,
use = true;
2024-04-15 18:10:02 +00:00
for (let i of he) {
2023-10-05 05:52:09 +00:00
let val = get.value(i, player);
2024-04-15 18:10:02 +00:00
if (val < 6 && get.position(i) == "h") {
2023-10-05 05:52:09 +00:00
dis++;
disval += val;
2024-04-15 18:10:02 +00:00
} else if (val < spare) spare = val;
2023-10-05 05:52:09 +00:00
}
2024-04-15 18:10:02 +00:00
if (!dis) {
2023-10-05 05:52:09 +00:00
dis = 1;
disval = spare;
spare = -1;
}
2024-04-15 18:10:02 +00:00
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];
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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));
}
},
2024-04-15 18:10:02 +00:00
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");
},
2024-04-15 18:10:02 +00:00
content: function () {
player.addTempSkill("mingluan_mark");
},
},
2024-04-15 18:10:02 +00:00
mark: {
charlotte: true,
},
},
},
//赵嫣
2024-04-15 18:10:02 +00:00
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)
);
});
2024-04-15 18:10:02 +00:00
if (card) cards.push(card);
else break;
}
2024-04-15 18:10:02 +00:00
if (!cards.length) event.finish();
else {
player.showCards(cards, get.translation(player) + "发动了【锦绘】");
event.cards = cards;
game.cardsGotoOrdering(cards);
2024-04-15 18:10:02 +00:00
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;
}
}
}
2024-04-15 18:10:02 +00:00
return max_effect_player;
});
else event.finish();
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var card = result.links[0];
event.cards.remove(card);
2024-04-15 18:10:02 +00:00
var targetx = lib.skill.jinhui.getUsableTarget(card, target, player);
target.useCard(card, targetx, false, "noai");
}
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
var cards = cards.filter(function (card) {
return lib.skill.jinhui.getUsableTarget(card, player, target);
});
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var card = result.links[0];
cards.remove(card);
2024-04-15 18:10:02 +00:00
var targetx = lib.skill.jinhui.getUsableTarget(card, player, target);
if (targetx) {
player.useCard(card, targetx, false, "noai");
}
2024-04-15 18:10:02 +00:00
if (cards.length) event.goto(3);
} else event.finish();
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
ai: {
order: 5,
result: { player: 1 },
},
},
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
return num < num2;
},
2024-04-15 18:10:02 +00:00
content: function () {
var num2 = 0;
for (var i = 1; i <= 5; i++) {
num2 += trigger.player.countEmptySlot(i);
}
player.drawTo(num2);
},
},
//何晏
2024-04-15 18:10:02 +00:00
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) + "张手牌",
];
2024-04-15 18:10:02 +00:00
target
.chooseControl()
.set("choiceList", list)
.set("ai", function () {
return get.rand(0, 2);
});
} else event._result = { index: 0 };
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
switch (result.index) {
case 0:
2024-04-15 18:10:02 +00:00
target.addTempSkill("yachai_block");
player.draw(2);
event.finish();
break;
2024-04-15 18:10:02 +00:00
case 1:
target.showHandcards();
break;
case 2:
event.goto(4);
break;
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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));
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
var cards = target.getCards("h", function (card) {
return (
get.suit(card, target) == result.control &&
lib.filter.cardDiscardable(card, target, "yachai")
);
});
2024-04-15 18:10:02 +00:00
if (cards.length) target.give(cards, player, "give");
event.finish();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
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;
}
2024-03-16 14:19:55 +00:00
},
2024-04-15 18:10:02 +00:00
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;
}
},
},
},
},
},
2024-04-15 18:10:02 +00:00
qingtan: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return game.hasPlayer((current) => current.countCards("h") > 0);
},
2024-04-15 18:10:02 +00:00
filterTarget: function (card, player, target) {
return target.countCards("h") > 0;
},
2024-04-15 18:10:02 +00:00
selectTarget: -1,
multitarget: true,
multiline: true,
content: function () {
"step 0";
targets.sortBySeat();
2024-04-15 18:10:02 +00:00
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()] };
};
2024-04-15 18:10:02 +00:00
next._args.remove("glow_result");
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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);
}
2024-04-15 18:10:02 +00:00
var dialog = ["选择获得一种花色的所有牌"];
for (var suit of lib.suit) {
if (map[suit]) {
var targetsx = map[suit].map(function (card) {
return targets[cards.indexOf(card)];
});
2024-04-15 18:10:02 +00:00
dialog.push('<div class="text center">' + get.translation(targetsx) + "</div>");
dialog.push(map[suit]);
list.push(suit);
}
}
2024-04-15 18:10:02 +00:00
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;
}
}
2024-04-15 18:10:02 +00:00
return res;
});
else event.finish();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 5";
game.delayx();
},
2024-04-15 18:10:02 +00:00
ai: {
order: 7,
result: {
player: 0.3,
target: -1,
},
},
},
//邓芝
2024-04-15 18:10:02 +00:00
jianliang: {
audio: 2,
trigger: { player: "phaseDrawBegin2" },
filter: function (event, player) {
return !player.isMaxHandcard();
},
2024-04-15 18:10:02 +00:00
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)
);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var targets = result.targets.sortBySeat();
player.logSkill("jianliang", targets);
if (targets.length == 1) {
targets[0].draw();
event.finish();
2024-04-15 18:10:02 +00:00
} else game.asyncDraw(targets);
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
game.delayx();
},
},
2024-04-15 18:10:02 +00:00
weimeng: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return player.hp > 0 && target != player && target.countGainableCards(player, "h") > 0;
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.gainPlayerCard(target, "h", true, [1, player.hp]);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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,
},
2024-04-15 18:10:02 +00:00
result: {
target: function (player, target) {
return -Math.pow(Math.min(player.hp, target.countCards("h")), 2) / 4;
},
},
},
},
//冯熙
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
preHidden: true,
content: function () {
"step 0";
player.loseHp();
2024-04-15 18:10:02 +00:00
event.target = trigger.player;
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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++;
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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));
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
target.addTempSkill("boyan_block");
},
subSkill: {
block: {
mark: true,
intro: { content: "不能使用或打出手牌" },
charlotte: true,
mod: {
cardEnabled2: function (card) {
if (get.position(card) == "h") return false;
},
},
},
},
2024-04-15 18:10:02 +00:00
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;
},
},
},
},
//祢衡
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
content: function () {
player.draw(Math.min(5, player.getStat("damage")));
},
},
2024-04-15 18:10:02 +00:00
change: {
mod: {
maxHandcard: function (player, num) {
if (typeof player.storage.rekuangcai_change == "number")
return num + player.storage.rekuangcai_change;
},
},
2024-04-15 18:10:02 +00:00
charlotte: true,
mark: true,
intro: {
content: (num) => "手牌上限" + (num < 0 ? "" : "+") + num,
},
},
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
usable: 2,
2024-04-12 12:22:36 +00:00
async cost(event, trigger, player) {
2024-04-15 18:10:02 +00:00
event.result = await player
.chooseToDiscard(
"he",
[2, Infinity],
get.prompt("reshejian", trigger.player),
'<div class="text center">弃置至少两张手牌,然后选择一项:<br>⒈弃置其等量的牌。⒉对其造成1点伤害。</div>'
)
.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();
2024-04-12 12:22:36 +00:00
},
2024-04-15 18:10:02 +00:00
logTarget: "player",
2024-04-12 12:22:36 +00:00
content: function () {
2024-04-15 18:10:02 +00:00
"step 0";
2024-04-12 12:22:36 +00:00
player.discard(cards);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-12 12:22:36 +00:00
var num = cards.length;
event.num = num;
2024-04-15 18:10:02 +00:00
var target = targets[0],
str = get.translation(target);
2024-04-12 12:22:36 +00:00
event.target = target;
if (!target.isIn()) event.finish();
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.index == 0) player.discardPlayerCard(target, num, true, "he");
else target.damage();
},
},
//陈登
2024-04-15 18:10:02 +00:00
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)
);
});
})
);
},
2024-04-15 18:10:02 +00:00
check: function (event, player) {
return get.attitude(player, event.target) > 0;
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.target.draw();
},
},
2024-04-15 18:10:02 +00:00
reyingshui: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return (
player.countCards("he") > 0 && game.hasPlayer((current) => player.inRange(current))
);
},
2024-04-15 18:10:02 +00:00
position: "he",
filterCard: true,
filterTarget: function (card, player, target) {
return player.inRange(target);
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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));
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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,
2024-04-12 14:11:26 +00:00
async cost(event, trigger, player) {
var num = player.getFriends().length;
2024-04-15 18:10:02 +00:00
if (
!game.hasPlayer(function (current) {
return current != player && current.getFriends().length > num;
})
) {
2024-04-21 05:04:56 +00:00
event.result = await player
2024-04-15 18:10:02 +00:00
.chooseToDiscard(
"h",
get.prompt("rewangzu"),
"弃置一张牌并令伤害-1",
"chooseonly"
)
.set("ai", function (card) {
return 7 - get.value(card);
2024-04-21 05:04:56 +00:00
})
.forResult();
2024-04-15 18:10:02 +00:00
} else {
2024-04-21 05:04:56 +00:00
event.result = await player.chooseBool(get.prompt("rewangzu"), "随机弃置一张牌并令伤害-1").forResult();
}
2024-04-12 14:11:26 +00:00
},
async content(event, trigger, player) {
trigger.num--;
if (!event.cards || !event.cards.length) {
2024-04-15 18:10:02 +00:00
const cards = player.getCards("h", (card) =>
lib.filter.cardDiscardable(card, player, "rewangzu")
);
2024-04-12 14:11:26 +00:00
if (cards.length) player.discard(cards.randomGet());
2024-04-15 18:10:02 +00:00
} else {
2024-04-12 14:11:26 +00:00
player.discard(event.cards);
}
},
},
//万年公主
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
return 0;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
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();
}
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
target.useCard({ name: "sha", isCard: true }, result.targets[0], false);
}
2024-04-15 18:31:36 +00:00
"step 3";
game.delayx();
},
2024-04-15 18:10:02 +00:00
subSkill: {
effect: {
charlotte: true,
onremove: true,
mod: {
attackRange: function (player, num) {
return num + player.countMark("zhenge_effect");
},
},
2024-04-15 18:10:02 +00:00
intro: { content: "攻击范围+#" },
},
},
},
2024-04-15 18:10:02 +00:00
xinghan: {
audio: 2,
init: function (player) {
player.addSkill("xinghan_count");
},
2024-04-15 18:10:02 +00:00
onremove: function (player) {
player.removeSkill("xinghan_count");
},
2024-04-15 18:10:02 +00:00
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";
});
})
2024-04-15 18:10:02 +00:00
);
},
2024-04-15 18:10:02 +00:00
content: function () {
player.addTempSkill("xinghan_temp");
player.storage.xinghan_temp = trigger.card;
},
},
2024-04-15 18:10:02 +00:00
temp: { onremove: true },
},
2024-04-15 18:10:02 +00:00
ai: { combo: "zhenge" },
},
//荀谌
2024-04-15 18:10:02 +00:00
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")
);
})
);
},
2024-04-15 18:10:02 +00:00
filterTarget: function (card, player, target) {
return (
target != player &&
target.countCards("h") > 0 &&
!target.hasSkillTag("noCompareTarget")
);
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.chooseToCompare(target);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (!target.countCards("hej")) event.finish();
else {
2024-04-25 22:42:13 +00:00
// event.giver = target;
// event.gainner = player;
player.gainPlayerCard(
2024-04-15 18:10:02 +00:00
target,
true,
"hej",
2,
2024-04-25 22:42:13 +00:00
"获得" + get.translation(target) + "区域里的两张牌"
2024-04-15 18:10:02 +00:00
);
}
2024-04-15 18:10:02 +00:00
} else if (result.tie) {
delete player.getStat("skill").refenglve;
2024-04-25 22:42:13 +00:00
if (get.position(result.player, true) == "d") player.gain(result.player, "gain2");
// event.finish();
2024-04-15 18:10:02 +00:00
} else {
if (get.position(result.player, true) == "d") target.gain(result.player, "gain2");
2024-04-25 22:42:13 +00:00
// event.finish();
/*if(!player.countCards('he')) event.finish();
else{
event.giver=player;
event.gainner=target;
player.chooseCard(true,'he','交给'+get.translation(target)+'一张牌');
}*/
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-25 22:42:13 +00:00
// if (result.bool) event.giver.give(result.cards, event.gainner);
2024-04-15 18:10:02 +00:00
},
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"));
},
},
},
},
2024-04-15 18:10:02 +00:00
anyong: {
audio: 2,
trigger: { global: "damageSource" },
direct: true,
filter: function (event, player) {
return (
event.source &&
event.source == _status.currentPhase &&
event.num == 1 &&
2024-04-25 22:42:13 +00:00
// event.player != event.source &&
2024-04-15 18:10:02 +00:00
event.player.isIn() &&
player.countCards("he") > 0 &&
event.source
.getHistory("sourceDamage", function (evt) {
return evt.player != event.source;
})
.indexOf(event) == 0
);
},
2024-04-15 18:10:02 +00:00
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];
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) trigger.player.damage();
},
},
//刘永
2024-04-15 18:10:02 +00:00
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");
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.chooseUseTarget(
{ name: result.links[0][2], nature: result.links[0][3], isCard: true },
true,
false
);
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
return Math.max(1, 5 - nh);
},
},
2024-04-15 18:10:02 +00:00
},
},
2024-04-15 18:10:02 +00:00
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++;
}
}
}
2024-04-15 18:10:02 +00:00
num += cards.length;
if (num > max) {
max = num;
max2 = current;
} else if (num == max) max2 = null;
}
return max2;
},
2024-04-15 18:10:02 +00:00
audio: 2,
init: function (player) {
game.addGlobalSkill("fengxiang_use");
2023-09-30 13:47:59 +00:00
},
2024-04-15 18:10:02 +00:00
onremove: function (player) {
if (!game.hasPlayer((current) => current.hasSkill("fengxiang"), true))
game.removeGlobalSkill("fengxiang_use");
2023-09-30 13:47:59 +00:00
},
2024-04-15 18:10:02 +00:00
trigger: { player: "damageEnd" },
forced: true,
filter: function (event, player) {
var target = lib.skill.fengxiang.getMax();
return !target || target.isDamaged();
},
2024-04-15 18:10:02 +00:00
logTarget: function (event, player) {
return lib.skill.fengxiang.getMax() || player;
},
2024-04-15 18:10:02 +00:00
content: function () {
var target = lib.skill.fengxiang.getMax();
if (target) target.recover();
else player.draw();
},
2024-04-15 18:10:02 +00:00
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();
},
},
2024-04-15 18:10:02 +00:00
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;
},
2023-09-30 13:47:59 +00:00
},
2024-04-15 18:10:02 +00:00
trigger: { player: "dieAfter" },
filter: function (event, player) {
return !game.hasPlayer((current) => current.hasSkill("fengxiang"), true);
2023-09-30 13:47:59 +00:00
},
2024-04-15 18:10:02 +00:00
silent: true,
forceDie: true,
charlotte: true,
content: function () {
game.removeGlobalSkill("fengxiang_use");
},
},
},
},
//阚泽
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
player.logSkill("rekuanshi");
player.addTempSkill("rekuanshi_effect", { player: "phaseBegin" });
player.storage.rekuanshi_effect = result.targets[0];
game.delayx();
}
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.player.recover();
2024-04-15 18:10:02 +00:00
},
},
},
},
//吕玲绮
2024-04-15 18:10:02 +00:00
guowu: {
trigger: { player: "phaseUseBegin" },
filter: function (event, player) {
return player.countCards("h") > 0;
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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)
);
});
2024-04-15 18:10:02 +00:00
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);
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (player != game.me && !player.isOnline()) game.delayx();
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var targets = result.targets.sortBySeat();
player.logSkill("guowu_add", targets);
trigger.targets.addArray(targets);
//if(get.mode()=='guozhan') player.removeSkill('guowu_add');
},
},
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.awakenSkill("zhuangrong");
player.loseMaxHp();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (player.maxHp > player.hp) player.recover(player.maxHp - player.hp);
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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();
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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
);
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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;
},
},
},
},
2024-04-15 18:10:02 +00:00
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)
);
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (event.targets) {
player.logSkill("zhtongyuan", event.targets);
trigger.targets.addArray(event.targets);
}
},
},
2024-04-15 18:10:02 +00:00
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";
},
2024-04-15 18:10:02 +00:00
content: function () {
trigger.directHit.addArray(game.filterPlayer());
2024-04-15 18:10:02 +00:00
game.log(trigger.card, "不可被响应");
},
},
},
},
//陆郁生
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.index == 0) {
trigger.player.addTempSkill("zhente2");
trigger.player.storage.zhente2.add(get.color(trigger.card));
2024-04-15 18:10:02 +00:00
trigger.player.markSkill("zhente2");
} else trigger.excluded.add(player);
},
},
2024-04-15 18:10:02 +00:00
zhente2: {
mod: {
2024-03-03 05:23:05 +00:00
cardEnabled(card, player) {
const color = get.color(card);
2024-04-15 18:10:02 +00:00
if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false;
},
2024-04-15 18:10:02 +00:00
cardSavable(card, player) {
2024-03-03 05:23:05 +00:00
const color = get.color(card);
2024-04-15 18:10:02 +00:00
if (color != "unsure" && player.getStorage("zhente2").includes(color)) return false;
},
2024-04-15 18:10:02 +00:00
},
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();
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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();
},
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
logTarget: function (event, player) {
return player.storage.zhiwei2;
},
2024-04-15 18:10:02 +00:00
content: function () {
if (trigger.delay === false) game.delay();
player.storage.zhiwei2.gain(trigger.getl(player).cards2.filterInD("d"), "gain2");
},
},
2024-04-15 18:10:02 +00:00
clear: {
audio: "zhiwei",
trigger: {
global: "die",
player: ["hideCharacterEnd", "removeCharacterEnd"],
},
2024-04-15 18:10:02 +00:00
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";
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.removeSkill("zhiwei2");
if (trigger.name != "die" || get.mode() != "guozhan") event.finish();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (player.name1 == "gz_luyusheng" || player.name1 == "luyusheng")
player.hideCharacter(0);
if (player.name2 == "gz_luyusheng" || player.name2 == "luyusheng")
player.hideCharacter(1);
},
},
},
},
//华歆
2024-04-15 18:10:02 +00:00
spwanggui: {
audio: "wanggui",
trigger: { source: "damageSource" },
usable: 1,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current.group != player.group;
});
},
2024-04-15 18:10:02 +00:00
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();
2024-04-12 14:11:26 +00:00
},
2024-04-15 18:10:02 +00:00
async content(event, trigger, player) {
2024-04-12 14:11:26 +00:00
const target = event.targets[0];
target.damage();
},
2024-04-15 18:10:02 +00:00
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();
2024-04-12 14:11:26 +00:00
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
var target = targets[0];
if (player == target) {
2024-04-12 14:11:26 +00:00
player.draw();
event.finish();
2024-04-15 18:10:02 +00:00
} else {
var list = [player, target].sortBySeat();
2024-04-12 14:11:26 +00:00
game.asyncDraw(list);
}
2024-04-15 18:31:36 +00:00
"step 1";
game.delayx();
},
},
},
},
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
player.logSkill("wanggui", target);
target.damage();
}
event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
player
.chooseBool("望归:是否令所有与自己势力相同的角色各摸一张牌?")
.setHiddenSkill("wanggui");
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var targets = game.filterPlayer(function (current) {
return current.isFriendOf(player);
});
targets.sortBySeat();
2024-04-15 18:10:02 +00:00
player.logSkill("wanggui", targets);
game.asyncDraw(targets);
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 4";
game.delayx();
},
},
2024-04-15 18:10:02 +00:00
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"
);
};
2024-04-15 18:10:02 +00:00
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);
2024-04-20 14:01:05 +00:00
var num2 = Math.min(5, target.hp) - target.countCards("h");
2024-04-15 18:10:02 +00:00
if (num2 <= 0) return att <= 0;
var num = target.countCards("h", function (card) {
return target.hasValueTarget(card, null, true);
});
2024-04-15 18:10:02 +00:00
if (!num) return att > 0;
2024-04-20 14:01:05 +00:00
return (num - num2) * att < 0;
2024-04-15 18:10:02 +00:00
},
preHidden: true,
content: function () {
"step 0";
2024-04-20 14:01:05 +00:00
var num = Math.min(5, trigger.player.hp) - trigger.player.countCards("h");
2024-04-15 18:10:02 +00:00
if (num > 0) trigger.player.draw(num);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
trigger.player.addTempSkill("xibing2");
player._xibing = true;
if (get.mode() != "guozhan" || player.isUnseen(2) || trigger.player.isUnseen(2))
event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var target = trigger.player;
var players1 = [player.name1, player.name2];
var players2 = [target.name1, target.name2];
player
.chooseButton(2, [
"是否暗置自己和" + get.translation(target) + "的各一张武将牌?",
'<div class="text center">你的武将牌</div>',
[players1, "character"],
'<div class="text center">' + get.translation(target) + "的武将牌</div>",
[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)
);
});
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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");
}
},
},
2024-04-15 18:10:02 +00:00
xibing2: {
mod: {
cardEnabled2: function (card) {
if (get.position(card) == "h") return false;
},
},
},
2024-04-15 18:10:02 +00:00
xibing3: {
ai: { nomingzhi: true },
},
//小虎
2024-04-15 18:10:02 +00:00
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]);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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"
);
},
2024-04-15 18:10:02 +00:00
content: function () {
player.gain(trigger.cards[0], "gain2");
},
},
},
},
2024-04-15 18:10:02 +00:00
remumu: {
audio: "mumu",
trigger: {
player: "phaseUseBegin",
},
2024-04-15 18:10:02 +00:00
direct: true,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return current.countCards("e") > 0;
});
},
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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;
});
}
2024-04-15 18:10:02 +00:00
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (result.index == 0) {
player.addTempSkill("remumu3", "phaseUseAfter");
player.discardPlayerCard(target, "e", true);
} else {
player.addTempSkill("remumu2", "phaseUseAfter");
player.gainPlayerCard(target, "e", true);
}
},
},
2024-04-15 18:10:02 +00:00
remumu2: {
mod: {
cardUsable: function (card, player, num) {
if (card.name == "sha") return num - 1;
},
},
},
2024-04-15 18:10:02 +00:00
remumu3: {
mod: {
cardUsable: function (card, player, num) {
if (card.name == "sha") return num + 1;
},
},
},
2024-04-15 18:10:02 +00:00
rezhixi: {
trigger: {
player: "useCard",
},
2024-04-15 18:10:02 +00:00
forced: true,
filter: function (event, player) {
return (
(event.card.name == "sha" || get.type(event.card) == "trick") &&
player.countCards("h") > 0
);
},
2024-04-15 18:10:02 +00:00
content: function () {
player.chooseToDiscard("h", true);
},
2024-04-28 07:28:07 +00:00
ai: {
halfneg: true,
nokeep: true
},
},
//董白
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (get.color(cards[0], player) == "red") {
player.draw();
event.finish();
2024-04-15 18:10:02 +00:00
} 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);
});
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
if (!result.bool) player.draw(2);
},
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
},
},
},
},
2024-04-15 18:10:02 +00:00
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;
},
},
2024-04-15 18:10:02 +00:00
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();
},
2024-04-15 18:10:02 +00:00
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";
});
2024-04-15 18:10:02 +00:00
trigger.player.addGaintag(cards, "rexiahui");
},
},
2024-04-15 18:10:02 +00:00
block: {
mod: {
cardEnabled2: function (card) {
if (get.itemtype(card) == "card" && card.hasGaintag("rexiahui")) return false;
},
2024-04-15 18:10:02 +00:00
cardDiscardable: function (card) {
if (card.hasGaintag("rexiahui")) return false;
},
},
2024-04-15 18:10:02 +00:00
charlotte: true,
forced: true,
popup: false,
trigger: { player: "changeHp" },
filter: function (event, player) {
return event.num < 0;
},
2024-04-15 18:10:02 +00:00
content: function () {
player.removeSkill("rexiahui_block");
},
2024-04-15 18:10:02 +00:00
onremove: function (player) {
player.removeGaintag("rexiahui");
},
},
},
},
//周善
2024-04-15 18:10:02 +00:00
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({
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
ai2: function (target) {
return get.attitude(_status.event.player, target);
},
});
2024-04-15 18:10:02 +00:00
} else event.goto(3);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0],
cards = result.cards;
player.logSkill("dcmiyun", target);
player.give(cards, target);
} else event.goto(3);
2024-04-15 18:31:36 +00:00
"step 2";
player.drawTo(player.maxHp);
2024-04-15 18:31:36 +00:00
"step 3";
2024-04-15 18:10:02 +00:00
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();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
if (result.bool) {
var target = result.targets[0];
player.logSkill("dcmiyun", target);
player.gainPlayerCard(target, true, "visibleMove").chooseonly = true;
} else event.finish();
2024-04-15 18:31:36 +00:00
"step 5";
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
content: function () {
player.loseHp();
2024-04-15 18:10:02 +00:00
},
},
},
},
2024-04-15 18:10:02 +00:00
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);
},
},
2024-04-15 18:10:02 +00:00
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";
},
2024-04-15 18:10:02 +00:00
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;
},
2024-04-15 18:10:02 +00:00
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]);
}
2024-04-15 18:10:02 +00:00
var dialog = ui.create.dialog("胆迎", [vcards, "vcard"], "hidden");
dialog.direct = true;
return dialog;
},
2024-04-15 18:10:02 +00:00
backup: function (links, player) {
return {
2024-04-15 18:10:02 +00:00
filterCard: () => false,
selectCard: -1,
viewAs: {
name: links[0][2],
isCard: true,
},
2024-04-15 18:10:02 +00:00
popname: true,
precontent: function () {
player.logSkill("dcdanying");
player.showCards(
player.getCards("h", (card) => card.hasGaintag("dcmiyun_tag")),
get.translation(player) + "的“安”"
);
player.addTempSkill("dcdanying_discard");
},
2024-04-15 18:10:02 +00:00
};
},
2024-04-15 18:10:02 +00:00
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;
2024-04-15 18:10:02 +00:00
return [1, get.sgn(eff)];
},
},
},
},
},
},
//蔡阳
2024-04-15 18:10:02 +00:00
dcxunji: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return target != player && !player.getStorage("dcxunji_effect").includes(target);
},
2024-04-15 18:10:02 +00:00
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");
}
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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 () {
2024-01-21 04:57:23 +00:00
trigger.player.line(player);
2024-04-15 18:10:02 +00:00
player.damage(trigger.num, trigger.player);
},
},
},
},
2024-04-15 18:10:02 +00:00
dcjiaofeng: {
audio: 2,
trigger: { source: "damageBegin1" },
forced: true,
usable: 1,
filter: function (event, player) {
return player.isDamaged() && !player.getHistory("sourceDamage").length;
},
2024-04-15 18:10:02 +00:00
content: function () {
var num = player.getDamagedHp();
if (num > 0) player.draw();
if (num > 1) trigger.num++;
if (num > 2) player.recover();
},
},
//夏侯杰
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
if (num == 3 && player.maxHp < 8) player.gainMaxHp();
} else {
player.addMark("liedan", 1);
player.loseHp();
}
},
2024-04-15 18:10:02 +00:00
intro: { content: "mark" },
},
2024-04-15 18:10:02 +00:00
zhuangdan: {
audio: 2,
trigger: { global: "phaseEnd" },
forced: true,
filter: function (event, player) {
return player != event.player && player.isMaxHandcard(true);
},
2024-04-15 18:10:02 +00:00
content: function () {
player.addTempSkill("zhuangdan_mark", { player: "phaseEnd" });
},
ai: {
combo: "zhuangdan",
},
},
2024-04-15 18:10:02 +00:00
zhuangdan_mark: {
mark: true,
marktext: "胆",
intro: { content: "我超勇的" },
},
//乌巢酒仙
2024-04-15 18:10:02 +00:00
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);
2024-04-15 18:10:02 +00:00
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();
});
}
2024-04-15 18:10:02 +00:00
if (list.length) {
await game
.loseAsync({
gain_list: list,
player: player,
cards: list.slice().map((list) => list[1]),
giver: player,
animate: "giveAuto",
})
.setContent("gaincardMultiple");
}
}
},
},
2024-04-15 18:10:02 +00:00
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";
},
2024-04-15 18:10:02 +00:00
content: function () {
player.removeMark("recangchu", Math.min(player.countMark("recangchu"), trigger.num || 1));
},
2024-04-19 11:36:34 +00:00
ai: {
combo: "recangchu",
neg: true
},
2024-04-15 18:10:02 +00:00
group: "reshishou2",
},
2024-04-15 18:10:02 +00:00
reshishou2: {
audio: "reshishou",
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
filter: function (event, player) {
return !player.countMark("recangchu");
},
2024-04-15 18:10:02 +00:00
content: function () {
player.loseHp();
},
},
//曹性
2024-04-15 18:10:02 +00:00
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;
},
},
},
},
2024-04-15 18:10:02 +00:00
cxliushi2: {
mod: {
maxHandcard: function (player, num) {
return num - player.countMark("cxliushi2");
},
},
2024-04-15 18:10:02 +00:00
onremove: true,
charlotte: true,
intro: {
name2: "流",
content: "手牌上限-#",
},
},
2024-04-15 18:10:02 +00:00
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);
},
2024-04-15 18:10:02 +00:00
ai: {
combo: "cxliushi",
},
},
//说出吾名吓汝一跳
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
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++;
2024-04-15 18:10:02 +00:00
if (target.countDiscardableCards(player, "he") > 0) discard--;
}
2024-04-15 18:10:02 +00:00
if (att == 0) {
draw--;
2024-04-15 18:10:02 +00:00
if (target.countDiscardableCards(player, "he") > 0) discard--;
}
2024-04-15 18:10:02 +00:00
if (att < 0) {
draw--;
2024-04-15 18:10:02 +00:00
if (target.countDiscardableCards(player, "he") > 0) discard++;
}
}
2024-04-15 18:10:02 +00:00
return draw >= num || discard >= num;
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
player.loseMaxHp();
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
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++;
}
}
2024-04-15 18:10:02 +00:00
if (draw > discard) return 1;
return 0;
});
}
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
event.index = result.index;
if (result.index == 1) {
game.asyncDraw(targets);
2024-04-15 18:10:02 +00:00
} else event.goto(4);
2024-04-15 18:31:36 +00:00
"step 3";
game.delay();
event.finish();
2024-04-15 18:31:36 +00:00
"step 4";
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
content: function () {
player.gainMaxHp();
2024-04-15 18:10:02 +00:00
player.chooseDrawRecover(2, true);
},
},
//新潘凤
2024-04-15 18:10:02 +00:00
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;
});
},
2024-04-15 18:10:02 +00:00
content: function () {
"step 0";
if (player == target) player.chooseToDiscard("e", true);
else player.discardPlayerCard(target, "e", true);
2024-04-15 18:31:36 +00:00
"step 1";
2024-04-15 18:10:02 +00:00
player.chooseUseTarget("sha", true, false, "nodistance");
2024-04-15 18:31:36 +00:00
"step 2";
2024-04-15 18:10:02 +00:00
var bool = game.hasPlayer2(function (current) {
return (
current.getHistory("damage", function (evt) {
return evt.getParent("xinkuangfu") == event;
}).length > 0
);
});
2024-04-15 18:10:02 +00:00
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;
});
2024-04-15 18:10:02 +00:00
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;
}
2024-04-15 18:10:02 +00:00
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;
},
},
},
},
},
2024-04-15 18:10:02 +00:00
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年义阳今湖北枣阳三国时蜀汉将领。刘备攻伐吴国时傅肜为别督。后刘备被陆逊击败傅肜率部断后奋战至死。死前怒斥道“吴狗何有汉将军降者”<br>傅佥[qiān] ( ? ~263年义阳治今湖北省枣阳市)人,蜀汉将领傅彤之子,三国时期蜀汉名将。金长于谋略,并颇有胆勇,姜维甚爱之。傅佥官至关中都督。魏国攻伐蜀汉时,傅佥和蒋舒防守阳安关,兵败战死。",
qinlang:
"秦朗(生卒年不详),字元明,小字阿蘇(一作阿鳔),新兴(治今山西忻州)云中人。三国时期曹魏将领,官至骁骑将军、给事中,曾率兵讨伐鲜卑轲比能和步度根的叛军。",
xianglang:
"向朗约167年—247年字巨达。襄阳郡宜城县今湖北宜城三国时期蜀汉官员、藏书家、学者。向朗早年师从于司马徽并被荆州牧刘表任命为临沮县长。后随刘备入蜀历任巴西、牂牁、房陵太守并拜步兵校尉领丞相长史随丞相诸葛亮北伐。因包庇马谡被免职后为光禄勋转左将军、特进封显明亭侯。曾代理丞相册封张皇后及太子刘璿。晚年专心研究典籍诱导青年学习家中藏书丰富受到举国尊重。延熙十年247年向朗去世。《全三国文》收录有一篇《遗言戒子》",
yuantanyuanxiyuanshang:
"袁谭、袁尚的武将介绍请移步「袁谭袁尚」,此处为袁熙的介绍。<br>袁熙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年曹魏又派司马懿和高句丽国王高位宫率军攻打公孙渊围城日久公孙渊粮尽之后与儿子公孙修一起出逃后被擒获父子二人同时被斩首示众。",
},
2024-04-15 18:10:02 +00:00
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) + "】";
2024-04-19 11:36:34 +00:00
if (info && !info[0].includes(i))
2024-04-15 18:10:02 +00:00
strx = '<span style="text-decoration:line-through;">' + strx + "</span>";
str += strx;
if (i != "jiu") str += "/";
}
2024-04-15 18:10:02 +00:00
str +=
",然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌X为你的“席”数。";
return str;
},
2024-04-15 18:10:02 +00:00
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 += '<span style="text-decoration: line-through;">';
}
str += list[i];
2024-01-21 17:22:59 +00:00
}
2024-04-15 18:10:02 +00:00
if (num < 4) str += "</span>";
2024-01-21 17:22:59 +00:00
return str;
},
2024-04-15 18:10:02 +00:00
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 += '<span style="text-decoration: line-through;">';
str += list[i];
if (goon && storage.includes(choices[j])) str += "</span>";
2024-03-02 04:22:27 +00:00
}
2024-04-15 18:10:02 +00:00
return (
str +
"X为此技能于本阶段的发动次数。②出牌阶段结束时若你本阶段执行过〖渐专①〗的所有选项则你随机移除〖渐专①〗的一项。"
);
2024-03-02 04:22:27 +00:00
},
},
2024-04-15 18:10:02 +00:00
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"],
},
2024-04-15 18:10:02 +00:00
translate: {
re_panfeng: "潘凤",
xinkuangfu: "狂斧",
xinkuangfu_info:
"出牌阶段限一次你可选择1弃置装备区里的一张牌你使用无对应实体牌的普【杀】。若此【杀】造成伤害你摸两张牌。2弃置一名其他角色装备区里的一张牌你使用无对应实体牌的普【杀】。若此【杀】未造成伤害你弃置两张手牌。均无距离和次数限制",
xingdaorong: "邢道荣",
xuxie: "虚猲",
xuxie_info:
"出牌阶段开始时你可以减1点体力上限并选择所有距离1以内的角色弃置这些角色的各一张牌或令这些角色各摸一张牌。出牌阶段结束时若你的体力上限不为全场最多则你加1点体力上限然后回复1点体力或摸两张牌。",
caoxing: "曹性",
cxliushi: "流矢",
cxliushi2: "流矢",
cxliushi_info:
"出牌阶段,你可以将一张红桃牌置于牌堆顶,视为对一名角色使用一张【杀】(无距离限制且不计入使用次数)。当此【杀】造成伤害后,受到伤害的角色获得一个“流”。有“流”的角色手牌上限-XX为其“流”数。",
zhanwan: "斩腕",
zhanwan_info: "锁定技,有“流”的角色于弃牌阶段弃牌后,你摸等量的牌,然后其移去所有的“流”。",
re_chunyuqiong: "淳于琼",
recangchu: "仓储",
recangchu2: "仓储",
recangchu3: "仓储",
recangchu_info:
"锁定技。①游戏开始时你获得3个“粮”。你的手牌上限+XX为“粮”数。②每回合限一次当你于回合外得到牌后你获得一个“粮”。你的“粮”数不能超过存活角色数",
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.弃置一名其他角色装备区里的一张牌,然后你本回合可使用【杀】的次数+12.获得一名角色装备区里的一张牌,然后你本回合可使用【杀】的次数-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为你手牌中的花色数。',
2024-04-15 18:10:02 +00:00
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:
2024-04-20 14:01:05 +00:00
"当一名其他角色在其出牌阶段内使用黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力值(至多摸至五张)且本回合不能再使用手牌。",
2024-04-15 18:10:02 +00:00
xibing_info_guozhan:
2024-04-20 14:01:05 +00:00
"当一名其他角色在其出牌阶段内使用第一张黑色【杀】或黑色普通锦囊牌指定唯一角色为目标后,你可令该角色将手牌摸至当前体力(至多摸至五张)值且本回合不能再使用手牌。若你与其均明置了所有武将牌,则你可以暗置你与其各一张武将牌且本回合不能再明置此武将牌。",
2024-04-15 18:10:02 +00:00
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:
2024-04-25 22:42:13 +00:00
"出牌阶段限一次,你可以和一名其他角色进行拼点。若你赢,你获得其区域里的两张牌;若平局,则你获得你的拼点牌且令此技能于本阶段内的发动次数上限+1若你输其获得你的拼点牌。",
2024-04-15 18:10:02 +00:00
anyong: "暗涌",
anyong_info:
2024-04-25 22:42:13 +00:00
"当一名角色于其回合内第一次造成伤害后若伤害值为1则你可弃置一张牌并对受伤角色造成1点伤害。",
2024-04-15 18:10:02 +00:00
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:
2024-04-20 13:52:28 +00:00
"锁定技。当你造成伤害后若你的手牌数大于体力值你弃置四张手牌等于体力值你弃置一张牌并回复1点体力小于体力值你受到1点无来源火焰伤害并摸五张牌。",
2024-04-15 18:10:02 +00:00
dc_yanghu: "羊祜",
dcdeshao: "德劭",
dcdeshao_info:
"每回合限两次。当你成为其他角色使用的黑色牌的目标后,你可以摸一张牌,然后若其手牌数不小于你,则你弃置其一张牌。",
dcmingfa: "明伐",
dcmingfa_info:
"①出牌阶段限一次。当你使用【杀】或普通锦囊牌结算结束后若你的武将牌上没有“明伐”牌则你可以将此牌作为“明伐”牌置于武将牌上并选择一名其他角色记录该角色和此牌的名称。②一名角色的回合结束时若其是你〖明伐①〗记录的角色则你视为对其依次使用X张〖明伐①〗记录的牌然后移去“明伐”牌X为其手牌数且至少为1至多为5。③一名角色死亡时若其是你〖明伐①〗记录的角色则你移去“明伐”牌。",
dc_jiling: "纪灵",
dcshuangren: "双刃",
dcshuangren_info:
"出牌阶段开始时你可以和一名其他角色A进行拼点。若你赢你选择一名角色B或选择包含A在内的两名角色A和BB的势力需与A相同然后视为对被选择的角色使用一张【杀】不计入次数限制若你没赢则你本阶段内不能使用【杀】。",
zhangxun: "张勋",
suizheng: "随征",
suizheng_info:
"结束阶段,你可以选择一名角色A,获得如下效果直到其下回合结束:①A于下回合出牌阶段内使用【杀】的次数上限+1且无距离限制下回合的出牌阶段结束时你可以选择一名此阶段内受到过造成的伤害的角色视为对使用一张【杀】。",
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张牌不小于其此伤害+1X为其以此法弃置的牌数。",
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.下回合使用【杀】的次数上限+12.本回合手牌上限+23.摸三张牌。若你选择的项数超过了你的体力值,你弃置一张牌。",
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为你以此法变化的手牌上限且至少为1Y为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: "〖幽栖〗概率<br>",
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张【闪】抵消的【杀】且此【杀】的伤害基数+1X为你以此法弃置的牌数且至少为1。当你以此法造成伤害后该技能于本轮失效。",
peiyuanshao: "裴元绍",
2024-04-25 22:41:54 +00:00
oldmoyu: "没欲",
oldmoyu_info:
"出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌然后其可以对你使用一张无距离限制的【杀】且此【杀】伤害基数为XX为你于本回合发动此技能的次数。若此【杀】对你造成了伤害你令此技能于本回合失效。",
2024-04-15 18:10:02 +00:00
dcmoyu: "没欲",
dcmoyu_info:
2024-04-25 22:41:54 +00:00
"出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】。若此【杀】:未对你造成过伤害,你将此技能于此阶段下次获得的牌数改为两张;对你造成过伤害,你令此技能于本回合失效。",
2024-04-15 18:10:02 +00:00
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:
"锁定技。①游戏开始,你将你的手牌标记为“胡笳”。②你的“胡笳”牌不计入手牌上限。③其他角色至你的距离+XX为你的“胡笳”数且至多为5。",
dcbeifen: "悲愤",
dcbeifen_info:
"锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。",
dc_wuban: "吴班",
dcyouzhan: "诱战",
dcyouzhan_info:
"锁定技。当其他角色于你的回合内失去一张牌后你摸一张牌不计入本回合的手牌上限且其获得如下效果1.其于此回合下一次受到的伤害+12.结束阶段若其于此回合未受到过伤害其摸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: "每回合限一次,当一名角色于其回合外失去手牌后,若其没有手牌,你可令其摸两张牌。",
2024-04-15 18:10:02 +00:00
dc_liuli: "刘理",
dcfuli: "抚黎",
dcfuli_info:
"出牌阶段限一次你可以展示手牌并弃置一种类别的所有手牌然后摸X张牌X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数。若你因此弃置了伤害类卡牌则你可以选择一名角色令其攻击范围-1直到你的下个回合开始。",
dcdehua: "德化",
dcdehua_info:
"锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+YY为你〖德化①〗选择过的牌名数。",
gongsunxiu: "公孙修",
dcgangu: "干蛊",
dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后你摸两张牌然后失去1点体力。",
dckuizhen: "溃阵",
dckuizhen_info:
"出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你受到渠道为此牌的伤害你观看其手牌并获得其中所有的【杀】你使用以此法得到的牌无任何次数限制未受到渠道为此牌的伤害其失去1点体力。",
dc_jiangji: "蒋济",
dcshiju: "势举",
dcshiju_info:
"其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+XX为你装备区里的牌数。若你以此法替换了装备你与其各摸两张牌。",
dcyingshi: "应时",
dcyingshi_info:
2024-04-20 15:06:19 +00:00
"每回合每项各限一次。当你使用普通锦囊牌指定目标后你可令其中一个目标选择一项⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌⒉弃置X张牌此牌对其无效X为你装备区里的牌数。",
2024-04-15 18:10:02 +00:00
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:
"<br>当系统随机选择要删除的选项时“弃置X张牌”的选项概率固定为90%剩余选项平分剩余的的10%概率。<br>如第一次删除时删除弃牌选项概率为90%其余三个选项被删除的概率均为3.33%若删除了非弃牌选项第二次删除时删除弃牌选项的概率依旧是90%其余两个选项被删除的概率均为5%。",
dcfanshi: "返势",
dcfanshi_info:
"觉醒技结束阶段若〖渐专①〗剩余选项数小于2则你执行三次X视为1的剩余选项然后增加2点体力上限并回复2点体力失去技能〖渐专〗并获得技能〖覆斗〗。",
dcfudou: "覆斗",
dcfudou_info:
"当你使用黑色牌/红色牌指定唯一目标后,若该角色不为你,且其于本局游戏对你/未对你造成过伤害则你可以与其各失去1点体力/各摸一张牌。",
2024-04-15 18:10:02 +00:00
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: "冢虎狼顾",
},
};
});