noname/character/offline.js

8994 lines
276 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { lib, game, ui, get, ai, _status } from "../noname.js";
game.import("character", function () {
return {
name: "offline",
connect: true,
connectBanned: ["zhangliang"],
characterSort: {
offline: {
offline_star: [
"jsp_ganfuren",
"sp_xiahoushi",
"jsp_zhaoyun",
"huangjinleishi",
"sp_pangtong",
"sp_daqiao",
"sp_ganning",
"sp_xiahoudun",
"sp_lvmeng",
"sp_zhangfei",
"sp_liubei",
"old_machao",
"zhangliang",
"jsp_caoren",
],
offline_sticker: [
"sp_gongsunzan",
"sp_simazhao",
"sp_wangyuanji",
"sp_xinxianying",
"sp_liuxie",
],
offline_yijiang: ["ol_xinxianying"],
offline_luanwu: ["ns_lijue", "ns_zhangji", "ns_fanchou"],
offline_yongjian: [
"ns_chendao",
"yj_caoang",
"yj_caocao",
"yj_liru",
"yj_caohong",
"yj_zhangfei",
"yongjian_ganning",
"yj_dongzhuo",
"yj_xuyou",
"yj_jiaxu",
"yj_zhenji",
],
offline_piracyE: [
"shen_jiaxu",
"pe_wangyun",
"pe_zhonghui",
"pe_sunchen",
"pe_mengda",
"pe_wenqin",
"ns_caoanmin",
"jiangqing",
"kongrong",
"jiling",
"tianfeng",
"mateng",
],
offline_piracyS: [
"ns_jiaxu",
"longyufei",
"ps_guanyu",
"ps1059_guojia",
"ps2070_guojia",
"ps2063_zhaoyun",
"ps2067_zhaoyun",
"ps1062_zhouyu",
"ps2080_zhouyu",
"ps_caozhi",
"ps_jin_simayi",
"ps_caopi",
"ps_simayi",
"ps2068_simayi",
"ps_machao",
"ps_zhugeliang",
"ps2066_zhugeliang",
"ps_jiaxu",
"ps_lvbu",
"ps_shen_machao",
"jsp_liubei",
],
offline_piracyK: ["pk_sp_duyu"],
offline_vtuber: ["vtb_xiaosha", "vtb_xiaoshan", "vtb_xiaotao", "vtb_xiaole", "vtb_xiaojiu"],
offline_longyutao: ["drag_guanyu", "drag_caoren", "drag_lvchang"],
//offline_others:[""],
},
},
character: {
drag_guanyu: ["male", "shu", 4, ["dragchaojue", "dragjunshen"]],
drag_caoren: ["male", "wei", 4, ["draglizhong", "dragjuesui"]],
drag_lvchang: ["male", "wei", 3, ["dragjuwu", "dragshouxiang"]],
jsp_ganfuren: ["female", "shu", 3, ["shushen", "shenzhi"], ["character:gz_ganfuren"]],
ol_xinxianying: ["female", "wei", 3, ["xincaishi", "xinzhongjian"]],
zhangliang: ["male", "qun", 4, ["old_jijun", "old_fangtong"]],
jsp_caoren: ["male", "wei", 4, ["kuiwei", "yanzheng"]],
old_machao: ["male", "qun", 4, ["zhuiji", "oldcihuai"]],
vtb_xiaosha: ["female", "qun", 4, ["vtbguisha", "vtbshuli"]],
vtb_xiaoshan: ["female", "qun", 4, ["vtbshanwu", "vtbxianli"]],
vtb_xiaotao: ["female", "qun", 4, ["vtbtaoyan", "vtbyanli"]],
vtb_xiaole: ["female", "qun", 4, ["vtbleyu", "vtbyuanli"]],
vtb_xiaojiu: ["female", "qun", 4, ["vtbmeiniang", "vtbyaoli"]],
ps_shen_machao: ["male", "shen", 4, ["psshouli", "pshengwu"], ["qun"]],
mateng: ["male", "qun", 4, ["mashu", "xiongyi"]],
tianfeng: ["male", "qun", 3, ["sijian", "gzsuishi"]],
jiling: ["male", "qun", 4, ["shuangren"]],
kongrong: ["male", "qun", 3, ["zymingshi", "lirang"]],
jiangqing: ["male", "wu", 4, ["zyshangyi"]],
pk_sp_duyu: ["male", "qun", 4, ["pkwuku", "pksanchen"]],
ps_lvbu: ["male", "qun", 4, ["wushuang", "pssheji"]],
ps_jiaxu: ["male", "qun", 4, ["wansha", "psqupo", "psbaoquan"]],
ps_machao: ["male", "shu", 4, ["mashu", "tieji", "psweihou"]],
ps2066_zhugeliang: ["male", "shu", 3, ["pszhiji", "psjiefeng", "kongcheng"]],
ps_zhugeliang: ["male", "shu", 3, ["psguanxing", "pslongyin"]],
ps_simayi: ["male", "wei", 3, ["reguicai", "pshuxiao"]],
ps2068_simayi: ["male", "wei", 3, ["refankui", "reguicai", "pszhonghu"]],
ps_caopi: ["male", "wei", 3, ["psjianwei", "fangzhu", "songwei"], ["zhu"]],
ps_jin_simayi: ["male", "jin", 3, ["smyyingshi", "psquanyi"]],
ps_caozhi: ["male", "wei", 3, ["psliushang", "psqibu"]],
ps1062_zhouyu: ["male", "wu", 3, ["yingzi", "psoldshiyin"]],
ps2080_zhouyu: ["male", "wu", 3, ["psshiyin", "psquwu", "psliaozou"]],
ps2063_zhaoyun: ["male", "shu", 4, ["psqijin", "psqichu", "pslongxin"]],
ps2067_zhaoyun: ["male", "shu", 4, ["longdan", "pshuiqiang", "pshuntu"]],
ps1059_guojia: ["male", "wei", 3, ["tiandu", "psqizuo"]],
ps2070_guojia: ["male", "wei", 3, ["yiji", "psquanmou"]],
ps_guanyu: ["male", "shu", 4, ["wusheng", "pszhonghun", "nuzhan"]],
pe_wenqin: ["male", "wei", 4, ["gzjinfa"]],
pe_sunchen: ["male", "wu", 4, ["zyshilu", "zyxiongnve"]],
pe_mengda: ["male", "wei", 4, ["qiuan", "liangfan"]],
pe_zhonghui: ["male", "wei", 4, ["zyquanji", "zypaiyi"], ["clan:颍川钟氏"]],
pe_wangyun: ["male", "qun", 3, ["zylianji", "zymoucheng"], ["clan:太原王氏"]],
shen_jiaxu: ["male", "shen", 3, ["weimu", "zybishi", "zyjianbing"], ["qun"]],
yj_zhenji: ["female", "wei", 3, ["yjluoshen", "qingguo"]],
yj_jiaxu: ["male", "wei", 3, ["yjzhenlve", "yjjianshu", "yjyongdi"]],
yj_xuyou: ["male", "qun", 3, ["yjshicai", "yjchenggong", "yjzezhu"]],
yj_dongzhuo: ["male", "qun", 7, ["yjtuicheng", "yjyaoling", "yjshicha", "yjyongquan"], ["zhu"]],
yongjian_ganning: ["male", "wu", 4, ["yjjielve"]],
yj_zhangfei: ["male", "shu", 4, ["yjmangji"]],
yj_caohong: ["male", "wei", 4, ["yjlifeng"]],
yj_liru: ["male", "qun", 3, ["yjdumou", "yjweiquan", "yjrenwang"]],
yj_caocao: ["male", "qun", 4, ["yjxiandao", "yjsancai", "yjyibing"]],
longyufei: ["female", "shu", 3, ["longyi", "zhenjue"]],
sp_liubei: ["male", "shu", 4, ["zhaolie", "shichou"], ["zhu"]],
sp_zhangfei: ["male", "shu", 4, ["jie", "dahe"]],
sp_lvmeng: ["male", "wu", 3, ["tanhu", "mouduan"]],
sp_xiahoudun: ["male", "wei", 4, ["fenyong", "xuehen"], ["die_audio"]],
sp_ganning: ["male", "qun", 4, ["yinling", "junwei"]],
sp_daqiao: ["female", "wu", 3, ["yanxiao", "anxian"]],
sp_pangtong: ["male", "qun", 3, ["xinmanjuan", "zuixiang"]],
huangjinleishi: ["female", "qun", 3, ["fulu", "fuji"]],
jsp_zhaoyun: ["male", "qun", 3, ["chixin", "reyicong", "suiren"]],
sp_xiahoushi: ["female", "shu", 3, ["xinfu_yanyu", "xinfu_xiaode"]],
sp_gongsunzan: ["male", "qun", 4, ["spyicong", "sptuji"]],
sp_simazhao: ["male", "wei", 3, ["spzhaoxin", "splanggu"]],
sp_wangyuanji: ["female", "wei", 3, ["spfuluan", "spshude"]],
sp_xinxianying: ["female", "wei", 3, ["spmingjian", "spyinzhi"]],
sp_liuxie: ["male", "qun", 3, ["sphuangen", "sphantong"]],
ns_lijue: ["male", "qun", "4/6", ["nsfeixiong", "nscesuan"]],
ns_zhangji: ["male", "qun", 4, ["nslulve"]],
ns_fanchou: ["male", "qun", 4, ["nsyangwu"]],
ns_jiaxu: ["male", "qun", 3, ["nsyice", "luanwu"]],
ns_chendao: ["male", "shu", 4, ["nsjianglie"]],
yj_caoang: ["male", "wei", 4, ["yjxuepin"]],
ns_caoanmin: ["male", "wei", 4, ["nskuishe"]],
jsp_liubei: ["male", "qun", 4, ["jsprende"]],
},
characterIntro: {
lvchang:
"吕常161—221年荆州南阳博望今河南省南阳市方城县博望镇汉末至三国时期曹魏将领。吕常曾担任曹魏横海将军、章陵太守为武猛都尉厉节中郎将裨将军封关内侯。常以中勇显名州司试守雉长执戈秉戎慎守易兵不顿于敌国坠不侵于四邻拜武猛都尉厉节中郎将裨将军封关内侯。王师南征与充军从奄有江汉舍爵册勋封阴德亭侯领郡。鸠集荒散为民统纪三考有成转拜平狄将军改封卢亭侯莅国赋政十有三年。会蜀将关羽猖獗为寇常御之羽不能克。文帝加其庸转拜横海将军徙封西鄂都乡侯食邑并七百户。年六十一黄初二年正月卒。",
huangjinleishi: "黄巾军中负责施法的女祭司二人组。",
longyufei:
"《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。",
pk_sp_duyu:
"杜预222年285年字元凯京兆郡杜陵县今陕西西安中国魏晋时期军事家、经学家、律学家曹魏散骑常侍杜恕之子。杜预初仕曹魏任尚书郎后成为权臣司马昭的幕僚封丰乐亭侯。西晋建立后历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年278年接替羊祜出任镇南大将军镇守荆州。他积极备战支持晋武帝司马炎对孙吴作战并在咸宁五年279年成为晋灭吴之战的统帅之一。战后因功进封当阳县侯仍镇荆州。太康五年285年杜预被征入朝拜司隶校尉途中于邓县逝世终年六十三岁。获赠征南大将军、开府仪同三司谥号为成。杜预耽思经籍博学多通多有建树时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。",
ps_shen_machao:
"字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。",
xiaosha:
'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一该企划原定培养12位虚拟偶像然而企划由于各方面原因暴死现虚拟偶像仅存在于各武将的皮肤中。<br>设定上为三国杀新手菜鸡,误打误撞参加了三国杀组织的《三国之星》选秀大赛,没想到一路靠着颜值和风风火火的爽快性格过关斩将吸粉无数,获得了冠军,成为官方签约的形象代言人。<br>小杀现于B站还存在<style type="text/css">#slash_bilibili:link, #slash_bilibili:visited {color:white;}</style><a id="slash_bilibili" href="https://space.bilibili.com/686179867" target="_blank">对应账号</a>,但早已荒废。',
xiaoshan:
"2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一该企划原定培养12位虚拟偶像然而企划由于各方面原因暴死现虚拟偶像仅存在于各武将的皮肤中。<br>设定上为小杀同系不同班的同学,由于本身性格比较安静,所以和风风火火的小杀有些不对盘。知道小杀也玩三国杀后,外表高冷、内心傲娇的她偷偷也去玩了游戏,立志要在游戏里碾压她。<br>小闪对应B站账号已销号。",
xiaotao:
"2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一该企划原定培养12位虚拟偶像然而企划由于各方面原因暴死现虚拟偶像仅存在于各武将的皮肤中。<br>设定上为小杀的亲妹妹,陪姐姐去拍摄代言宣传照的时候,被导演看中,觉得三国美貌姐妹花是非常好的噱头,于是一并签下。正所谓“三国姐妹花,永远不分家!”。<br>小桃对应B站账号已销号。",
xiaole: "2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一该企划原定培养12位虚拟偶像然而企划由于各方面原因暴死现虚拟偶像仅存在于各武将的皮肤中。<br>设定上小乐家与小桃小杀家是世交,三人从小就认识。和小闪是同班同学,小乐很喜欢安静的小闪。和小酒是小杀介绍认识的,大家都是打三国杀的网友,在打游戏时候比较依赖小酒——躺赢人躺赢魂,躺赢都是人上人。<br>小乐对应B站账号已销号。",
xiaojiu:
"2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一该企划原定培养12位虚拟偶像然而企划由于各方面原因暴死现虚拟偶像仅存在于各武将的皮肤中。<br>设定上为非人类,是一只年龄成迷的神兽,真身是白泽。是小杀网上玩游戏认识的网友,爱好是喝酒,和小杀也有好酒友的关系。<br>小酒对应B站账号已销号。",
},
characterTitle: {
jsp_liubei: "S1019",
ns_caoanmin: "S1023",
longyufei: "S1044",
ps1059_guojia: "S1059",
ps_lvbu: "S1061",
ps1062_zhouyu: "S1062",
ps_jiaxu: "S1066",
ps_jin_simayi: "S1067",
ps_guanyu: "S2065",
ps2063_zhaoyun: "S2063",
ps2066_zhugeliang: "S2066",
ps2067_zhaoyun: "S2067",
ps2068_simayi: "S2068",
ps_machao: "S2069",
ps2070_guojia: "S2070",
ps_simayi: "S2073",
ps_zhugeliang: "S2073",
ps_caopi: "S2075",
ns_jiaxu: "S2079",
ps2080_zhouyu: "S2080",
ps_caozhi: "S2081",
ps_shen_machao: "SX015",
},
perfectPair: {},
card: {
yanxiao_card: {
type: "special_delay",
fullimage: true,
noEffect: true,
ai: {
basic: {
order: 1,
useful: 1,
value: 8,
},
result: {
target: 1,
},
},
},
},
characterFilter: {},
skill: {
//龙起襄樊
//关羽
//界界关羽
dragchaojue: {
trigger: { player: "phaseZhunbeiBegin" },
filter(event, player) {
if (!game.hasPlayer((target) => target != player)) return false;
return player.countCards(
"h",
(card) => _status.connectMode || lib.filter.cardDiscardable(card, player)
);
},
async cost(event, trigger, player) {
event.result = await player
.chooseToDiscard(get.prompt2("dragchaojue"), "h")
.set("ai", (card) => {
const player = get.event("player");
if (!game.hasPlayer((target) => get.attitude(player, target) < 0)) return 0;
return 7.5 - get.value(card);
})
.set("logSkill", "dragchaojue")
.forResult();
},
popup: false,
async content(event, trigger, player) {
const targets = game.filterPlayer((target) => target != player).sortBySeat();
if (targets.length) {
const suits = event.cards
.reduce((list, card) => list.add(get.suit(card, player)), [])
.sort((a, b) => {
return lib.suit.indexOf(a) - lib.suit.indexOf(b);
});
player.line(targets);
for (const i of targets) {
i.addTempSkill("dragchaojue_buff");
i.markAuto("dragchaojue_buff", suits);
}
for (const target of targets) {
const {
result: { bool },
} = await target
.chooseToGive(
player,
(card, player) => {
return get.event("suits").includes(get.suit(card));
},
"h",
"give"
)
.set("suits", suits)
.set("ai", (card) => {
const player = get.event("player"),
target = get.event().getParent().player;
const att = get.attitude(player, target);
if (att > 0) return 7.5 - get.value(card);
if (att == 0 && get.attitude(target, player) == 0) return 0;
if (
att < 0 &&
get.attitude(target, player) < 0 &&
player.getSkills(null, false, false).some((skill) => {
if (get.is.locked(skill, player)) return false;
const info = get.info(skill);
return (
info &&
info.ai &&
(info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend)
);
}) &&
player.getHp() > 2
)
return 0;
return 7.5 - get.value(card);
})
.set(
"prompt",
"超绝:交给" +
get.translation(player) +
"一张" +
get.translation(suits) +
"手牌,或本回合非锁定技失效"
);
if (!bool) target.addTempSkill("fengyin");
}
}
},
subSkill: {
buff: {
onremove: true,
charlotte: true,
mod: {
cardEnabled2(card, player) {
if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card)))
return false;
},
},
marktext: "绝",
intro: { content: "本回合内不能使用或打出$牌" },
},
},
},
dragjunshen: {
mod: {
targetInRange(card, player) {
if (get.suit(card) == "diamond" && card.name == "sha") return true;
},
},
locked: false,
enable: ["chooseToUse", "chooseToRespond"],
filterCard(card, player) {
return get.color(card) == "red";
},
viewAsFilter(player) {
return player.countCards("hes", { color: "red" });
},
position: "hes",
viewAs: { name: "sha" },
prompt: "将一张红色牌当作【杀】使用或打出",
check(card) {
const val = get.value(card);
if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val);
return 5 - val;
},
ai: {
order(item, player) {
if (!player || !_status.event.type || _status.event.type != "phase") {
return 0.1;
}
return get.order({ name: "sha" }, player) + 0.3;
},
respondSha: true,
skillTagFilter(player) {
if (!player.countCards("hes", { color: "red" })) return false;
},
},
group: ["dragjunshen_add", "dragjunshen_damage"],
subSkill: {
add: {
trigger: { player: "useCard2" },
filter(event, player) {
if (event.card.name != "sha" || get.suit(event.card) != "heart") return false;
return game.hasPlayer((target) => {
return (
target != player &&
!event.targets.includes(target) &&
lib.filter.targetEnabled2(event.card, player, target) &&
lib.filter.targetInRange(event.card, player, target)
);
});
},
async cost(event, trigger, player) {
event.result = await player
.chooseTarget(
get.prompt("dragjunshen_add"),
"为" + get.translation(trigger.card) + "额外指定一个目标",
(card, player, target) => {
const evt = get.event().getTrigger();
return (
target != player &&
!evt.targets.includes(target) &&
lib.filter.targetEnabled2(evt.card, player, target) &&
lib.filter.targetInRange(evt.card, player, target)
);
}
)
.set("ai", (target) =>
get.effect(target, _status.event.getTrigger().card, _status.event.player)
)
.forResult();
},
content() {
trigger.targets.addArray(event.targets);
},
},
damage: {
trigger: { source: "damageBegin1" },
filter(event, player) {
const evt = event.getParent(2);
return evt.name == "useCard" && evt.skill == "dragjunshen";
},
logTarget: "player",
prompt2(event, player) {
return "令" + get.translation(event.player) + "选择弃置装备区所有牌或令此伤害+1";
},
async content(event, trigger, player) {
const target = trigger.player;
let result;
if (!target.countDiscardableCards(target, "e")) result = { index: 1 };
else
result = await target
.chooseControl()
.set("choiceList", ["弃置装备区所有牌", "令此伤害+1"])
.set("ai", () => {
const player = get.event("player"),
trigger = get.event().getTrigger();
if (
player.getHp() <= 2 ||
player.getDiscardableCards(player, "e").reduce((sum, card) => {
return sum + get.value(card, player);
}, 0) < 7
)
return 0;
return 1;
})
.forResult();
if (result.index == 0) {
await target.discard(target.getDiscardableCards(target, "e"));
} else trigger.increase("num");
},
},
},
},
//龙曹仁
draglizhong: {
trigger: { player: "phaseJieshuBegin" },
async cost(event, trigger, player) {
let choiceList = [
"将任意张装备牌至于任意名角色的装备区",
"令你或任意名装备区里有牌的角色摸一张牌",
],
choices = ["置入装备", "团体摸牌", "cancel2"];
if (
!player.countCards("he", (card) => {
if (get.type(card) != "equip") return false;
return game.hasPlayer((target) => {
return target.canEquip(card);
});
})
) {
choices.shift();
choiceList[0] = '<span style="opacity:0.5">' + choiceList[0] + "</span>";
}
const {
result: { control },
} = await player
.chooseControl(choices)
.set("prompt", "###" + get.prompt("draglizhong") + "###选择首先执行的一项")
.set("choiceList", choiceList)
.set("ai", () => {
return get.event("controls")[0];
});
event.result = { bool: control != "cancel2", cost_data: control };
},
async content(event, trigger, player) {
let choices = ["置入装备", "团体摸牌"],
used = false;
if (event.cost_data == "团体摸牌") choices.reverse();
choices.push(event.cost_data);
for (let i = 1; i <= 3; i++) {
if (i == 3 && used) break;
switch (choices[i - 1]) {
case "置入装备":
while (
player.hasCard((card) => {
if (get.type(card) != "equip") return false;
return game.hasPlayer((target) => {
return target.canEquip(card);
});
}, "he")
) {
const {
result: { bool, cards, targets },
} = await player.chooseCardTarget({
prompt: "厉战:将一张装备牌置于一名角色的装备区",
filterCard(card) {
return get.type(card) == "equip";
},
position: "he",
filterTarget(card, player, target) {
return target.canEquip(card);
},
ai1(card) {
return 6 - get.value(card);
},
ai2(target) {
const player = get.event("player");
const att = get.attitude(player, target);
if (att <= 0 || target.countCards("e")) return 0;
return att * (target == player ? 1 : 3);
},
});
if (bool) {
if (i == 1 && !used) used = true;
const card = cards[0],
target = targets[0];
player.line(target);
if (target != player) {
player.$give(card, target, false);
}
await game.asyncDelay(0.5);
await target.equip(card);
} else break;
}
break;
case "团体摸牌":
const { result } = await player
.chooseTarget(
"厉战:令你或任意名装备区有牌的角色摸一张牌",
(card, player, target) => {
if (target != player && !target.countCards("e")) return false;
if (ui.selected.targets.length) {
const choose = ui.selected.targets[0];
if (choose == player && !player.countCards("e")) return false;
}
return true;
},
[1, Infinity]
)
.set("multitarget", true)
.set("complexTarget", true)
.set("ai", (target) => {
const player = get.event("player");
if (!player.countCards("e")) {
if (
game.countPlayer((choose) => {
return (
choose.countCards("e") &&
get.attitude(player, choose) > 0
);
}) > 1 &&
target == player
)
return 0;
}
return get.attitude(player, target);
});
if (result.bool) {
if (i == 1 && !used) used = true;
const targets = result.targets.sortBySeat();
player.line(targets);
choices.addArray(targets);
for (let j = 0; j < targets.length; j++) {
await targets[j].draw("nodelay");
}
await game.asyncDelayx();
}
break;
}
}
choices = choices.slice(3);
if (choices.length) {
choices.sortBySeat();
player.line(choices);
for (const target of choices) {
target.addTempSkill("draglizhong_effect", "roundStart");
}
await game.asyncDelayx();
}
},
subSkill: {
effect: {
charlotte: true,
mod: {
maxHandcard(player, num) {
return num + 2;
},
},
enable: "chooseToUse",
filterCard: true,
position: "e",
viewAs: { name: "wuxie" },
filter(event, player) {
return player.countCards("e") > 0;
},
viewAsFilter(player) {
return player.countCards("e") > 0;
},
prompt: "将一张装备区的牌当作【无懈可击】使用",
check(card) {
return 8 - get.equipValue(card);
},
mark: true,
marktext: "守",
intro: { content: "手牌上限+2可将装备区的牌当作【无懈可击】使用" },
},
},
},
//撅碎(难视
dragjuesui: {
trigger: { global: "dying" },
filter(event, player) {
return (
!player.getStorage("dragjuesui").includes(event.player) &&
event.player.hasEnabledSlot()
);
},
check(event, player) {
const target = event.player;
if (get.attitude(player, target) <= 0) return false;
return (
player.countCards("hs", (card) => player.canSaveCard(card, target)) +
target.countCards("hs", (card) => target.canSaveCard(card, target)) <
1 - target.hp
);
},
logTarget: "player",
async content(event, trigger, player) {
const target = trigger.player;
player.markAuto("dragjuesui", [target]);
const {
result: { bool },
} = await target.chooseBool("是否将体力值回复至1点并废除装备栏");
if (bool) {
await target.recoverTo(1);
let disables = [];
for (let i = 1; i <= 5; i++) {
for (let j = 0; j < target.countEnabledSlot(i); j++) {
disables.push(i);
}
}
if (disables.length) await target.disableEquip(disables);
target.addSkill("dragjuesui_wusheng");
} else {
target.chat("拒绝!");
}
},
init(player) {
if (player.getStorage("dragjuesui").length) {
player.markSkill("dragjuesui");
}
},
intro: { content: "已对$发动过此技能" },
subSkill: {
wusheng: {
charlotte: true,
mark: true,
marktext: "碎",
intro: { content: "殊死一搏!可将黑色非基本牌当作无次数限制的【杀】使用" },
mod: {
cardUsable(card, player, num) {
if (card.storage && card.storage.dragjuesui) return Infinity;
},
},
enable: ["chooseToUse", "chooseToRespond"],
filterCard(card, player) {
return get.color(card) == "black" && get.type(card) != "basic";
},
position: "hse",
viewAs: { name: "sha", storage: { dragjuesui: true } },
viewAsFilter(player) {
if (
!player.countCards("hes", (card) => {
return get.color(card) == "black" && get.type(card) != "basic";
})
)
return false;
},
prompt: "将一张黑色非基本牌当作无次数限制的【杀】使用或打出",
check(card) {
return 7 - get.value(card);
},
ai: {
order(item, player) {
if (!player || !_status.event.type || _status.event.type != "phase") {
return 0.1;
}
return get.order({ name: "sha" }, player) * 0.99;
},
respondSha: true,
skillTagFilter(player) {
if (
!player.countCards("hes", (card) => {
return get.color(card) == "black" && get.type(card) != "basic";
})
)
return false;
},
},
},
},
},
//吕常×SP淳于琼√
dragjuwu: {
trigger: { target: "shaBefore" },
filter(event, player) {
return (
!game.hasNature(event.card) &&
game.countPlayer((target) => event.player.inRange(target)) >= 3
);
},
forced: true,
content() {
trigger.cancel();
},
ai: {
effect: {
target(card, player, target) {
if (
card.name == "sha" &&
!game.hasNature(card) &&
game.countPlayer((targetx) => player.inRange(targetx)) >= 3
)
return "zerotarget";
},
},
},
},
dragshouxiang: {
trigger: { player: "phaseDrawBegin2" },
filter(event, player) {
if (!game.hasPlayer((target) => target.inRange(player))) return false;
return !event.numFixed;
},
check(event, player) {
if (player.skipList.includes("phaseUse")) return true;
return (
player.countCards("h") +
event.num +
Math.min(
5,
game.countPlayer((target) => {
return target.inRange(player);
})
) -
game.countPlayer((target) => {
return target != player && get.attitude(player, target) > 0;
}) <=
player.getHandcardLimit()
);
},
content() {
trigger.num += Math.min(
5,
game.countPlayer((target) => target.inRange(player))
);
player.skip("phaseUse");
player.addTempSkill("dragshouxiang_effect");
},
subSkill: {
effect: {
charlotte: true,
trigger: { player: "phaseDiscardBegin" },
filter(event, player) {
return game.hasPlayer((target) => target.inRange(player));
},
forced: true,
async content(event, trigger, player) {
const num = Math.min(
5,
game.countPlayer((target) => target.inRange(player))
);
if (num) {
if (_status.connectMode)
game.broadcastAll(() => (_status.noclearcountdown = true));
let list = [];
while (
num - list.length > 0 &&
player.hasCard((card) => {
return !list.some((list) => list[1] == card);
}, "h") &&
game.hasPlayer((target) => {
return target != player && !list.some((list) => list[0] == target);
})
) {
const {
result: { bool, targets, cards },
} = await player
.chooseCardTarget({
prompt: "守襄:你可以交给任意名角色各一张手牌",
prompt2: "(还可分配" + (num - list.length) + "张)",
position: "h",
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);
if (bool) {
list.push([targets[0], cards[0]]);
player.addGaintag(cards, "olsujian_given");
} else break;
}
if (_status.connectMode) {
game.broadcastAll(() => {
delete _status.noclearcountdown;
game.stopCountChoose();
});
}
if (list.length) {
await game
.loseAsync({
gain_list: list,
player: player,
cards: list.slice().map((list) => list[1]),
giver: player,
animate: "giveAuto",
})
.setContent("gaincardMultiple");
}
}
},
},
},
},
//天书乱斗虚拟偶像线下化
//小杀
vtbguisha: {
audio: 1,
trigger: { global: "useCard" },
direct: true,
shaRelated: true,
filter: function (event, player) {
return (
event.player != player &&
event.card.name == "sha" &&
player.countCards("he") > 0 &&
event.player.isPhaseUsing()
);
},
content: function () {
"step 0";
var go = false,
d1 = false;
if (get.attitude(player, trigger.player) > 0) {
d1 = true;
if (trigger.player.hasSkill("jueqing") || trigger.player.hasSkill("gangzhi"))
d1 = false;
for (var target of trigger.targets) {
if (
!target.mayHaveShan(
player,
"use",
target.getCards("h", (i) => {
return i.hasGaintag("sha_notshan");
})
) ||
trigger.player.hasSkillTag(
"directHit_ai",
true,
{
target: target,
card: trigger.card,
},
true
)
) {
if (!target.hasSkill("gangzhi")) d1 = false;
if (
target.hasSkillTag("filterDamage", null, {
player: trigger.player,
card: trigger.card,
}) ||
get.attitude(player, target) >= 0
)
d1 = false;
}
}
if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false;
else if (
!trigger.player.hasSkill("paoxiao") &&
!trigger.player.hasSkill("tanlin3") &&
!trigger.player.hasSkill("zhaxiang2") &&
!trigger.player.hasSkill("fengnu") &&
!trigger.player.getEquip("zhuge")
) {
var nh = trigger.player.countCards("h");
if (player == trigger.player) {
go = player.countCards("h", "sha") > 0;
} else if (nh >= 4) {
go = true;
} else if (player.countCards("h", "sha")) {
if (nh == 3) {
go = Math.random() < 0.8;
} else if (nh == 2) {
go = Math.random() < 0.5;
}
} else if (nh >= 3) {
if (nh == 3) {
go = Math.random() < 0.5;
} else if (nh == 2) {
go = Math.random() < 0.2;
}
}
}
}
go = go * Math.random() + d1 * Math.random() > 0.4;
//AI停顿
if (
go &&
!event.isMine() &&
!event.isOnline() &&
player.hasCard(function (card) {
return (
get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name)
);
}, "he")
) {
game.delayx();
}
var next = player.chooseToDiscard(
get.prompt("vtbguisha"),
"弃置一张牌,令" +
get.translation(trigger.player) +
"本次使用的【杀】不计入使用次数,且对" +
get.translation(trigger.targets) +
"造成的伤害+1",
"he"
);
next.logSkill = ["vtbguisha", trigger.player];
next.set("ai", function (card) {
if (_status.event.go) {
return 6 - get.value(card);
}
return 0;
});
next.set("go", go);
"step 1";
if (result.bool) {
if (trigger.addCount !== false) {
trigger.addCount = false;
trigger.player.getStat().card.sha--;
}
trigger.player.addTempSkill("vtbguisha_bonus");
if (!trigger.card.storage) trigger.card.storage = {};
trigger.card.storage.vtbguisha_targets = trigger.targets;
}
},
ai: {
expose: 0.2,
},
subSkill: {
bonus: {
trigger: {
source: "damageBegin1",
},
forced: true,
charlotte: true,
onremove: true,
filter: function (event, player) {
return (
event.card &&
event.card.name == "sha" &&
event.card.storage &&
event.card.storage.vtbguisha_targets &&
event.card.storage.vtbguisha_targets.includes(event.player)
);
},
content: function () {
trigger.num++;
},
},
},
},
vtbshuli: {
audio: 1,
trigger: {
global: "damageSource",
},
usable: 2,
filter: function (event, player) {
return (
event.source &&
event.source != player &&
event.card &&
event.card.name == "sha" &&
event.source.isIn()
);
},
check: function (event, player) {
return (
get.attitude(player, event.source) >= 0 ||
(get.attitude(player, event.source) >= -4 &&
get.distance(_status.currentPhase, player, "absolute") >
get.distance(_status.currentPhase, event.source, "absolute"))
);
},
content: function () {
"step 0";
var drawers = [trigger.source, player].sortBySeat(_status.currentPhase);
game.asyncDraw(drawers);
},
},
//小闪
vtbshanwu: {
audio: 1,
trigger: {
global: "useCardToTarget",
},
filter: function (event, player) {
return (
event.card.name == "sha" &&
event.target != player &&
event.isFirstTarget &&
player.hasCard((card) => {
return get.name(card) == "shan" || _status.connectMode;
})
);
},
direct: true,
content: function () {
"step 0";
player
.chooseToDiscard(
get.prompt("vtbshanwu"),
"弃置一张【闪】,取消此【杀】对" + get.translation(trigger.targets) + "的目标",
{ name: "shan" }
)
.set("logSkill", "vtbshanwu")
.set("ai", (card) => {
if (_status.event.goon) return 6 - get.value(card);
return 0;
})
.set(
"goon",
(function () {
var effect = 0;
for (var target of trigger.targets) {
var eff = get.effect(target, trigger.card, trigger.player, player);
if (
!target.mayHaveShan(
player,
"use",
target.getCards("h", (i) => {
return i.hasGaintag("sha_notshan");
})
) ||
trigger.player.hasSkillTag(
"directHit_ai",
true,
{
target: target,
card: trigger.card,
},
true
)
) {
eff *= 1.25;
}
if (target.hp <= 2) eff *= 1.1;
effect += eff;
}
return effect < 0;
})()
);
"step 1";
if (result.bool) {
game.log(player, "取消了", trigger.card, "的所有目标");
trigger.targets.length = 0;
trigger.getParent().triggeredTargets2.length = 0;
trigger.untrigger();
}
},
ai: {
expose: 0.2,
},
},
vtbxianli: {
audio: 1,
trigger: {
player: "loseAfter",
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
usable: 2,
filter: function (event, player) {
if (
!_status.currentPhase ||
!_status.currentPhase.isIn() ||
!_status.currentPhase.countGainableCards(player, "he")
)
return false;
var evt = event.getl(player);
return (
evt &&
evt.cards2 &&
evt.cards2.some((card) => {
return get.name(card, false) == "shan";
})
);
},
check: function (event, player) {
return get.effect(_status.currentPhase, { name: "shunshou_copy2" }, player, player) > 0;
},
prompt2: function (event, player) {
return "获得" + get.translation(_status.currentPhase) + "的一张牌";
},
logTarget: () => _status.currentPhase,
content: function () {
"step 0";
player.gainPlayerCard(_status.currentPhase, "he", true);
},
ai: {
expose: 0.15,
},
},
//小桃
vtbtaoyan: {
audio: 1,
trigger: {
player: "phaseBegin",
},
direct: true,
content: function () {
"step 0";
if (!_status.vtbtaoyan_count) {
_status.vtbtaoyan_count = 5;
}
player
.chooseTarget(
get.prompt("vtbtaoyan"),
"令一或两名其他角色摸一张牌并从游戏外获得一张【桃】♥6",
lib.filter.notMe,
[1, 2]
)
.set("ai", (target) => {
var player = _status.event.player;
return (
get.recoverEffect(target, player, player) / 2 + get.attitude(player, target)
);
});
"step 1";
if (result.bool) {
var targets = result.targets.slice();
targets.sortBySeat();
player.logSkill("vtbtaoyan", targets);
game.broadcastAll(function () {
if (!lib.inpile.includes("tao")) {
lib.inpile.add("tao");
}
});
player.addSkill("vtbtaoyan_remove");
for (var target of targets) {
target.draw();
if (!_status.vtbtaoyan_count) continue;
if (!_status.vtbtaoyan_cards) _status.vtbtaoyan_cards = [];
_status.vtbtaoyan_count--;
var card = game.createCard("tao", "heart", 6);
_status.vtbtaoyan_cards.push(card.cardid);
target.gain(card, "gain2");
}
}
},
ai: {
expose: 0.3,
threaten: 3.2,
},
subSkill: {
remove: {
trigger: {
global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"],
},
forced: true,
charlotte: true,
popup: false,
firstDo: true,
forceDie: true,
filter: function (event, player) {
if (typeof _status.vtbtaoyan_count != "number") return false;
var cards = event.getd();
return cards.some((card) => {
return _status.vtbtaoyan_cards.includes(card.cardid);
});
},
content: function () {
var cards = trigger.getd(),
remove = [];
for (var card of cards) {
if (_status.vtbtaoyan_cards.includes(card.cardid)) {
_status.vtbtaoyan_cards.remove(card.cardid);
remove.push(card);
}
}
if (remove.length) {
remove.forEach((i) => {
i.remove();
_status.vtbtaoyan_count++;
});
game.log(remove, "被移出了游戏");
}
},
},
},
},
vtbyanli: {
audio: 1,
trigger: {
global: "dying",
},
filter: function (event, player) {
if (player.hasSkill("vtbyanli_used")) return false;
if (_status.currentPhase == player) return false;
return event.player.hp <= 0;
},
check: function (event, player) {
return get.recoverEffect(event.player, player, player) > 0;
},
content: function () {
"step 0";
player.addTempSkill("vtbyanli_used", "roundStart");
trigger.player.recover(1 - trigger.player.hp);
trigger.player.draw();
},
subSkill: {
used: {
charlotte: true,
},
},
},
//小乐
vtbleyu: {
audio: 1,
trigger: {
global: "phaseBegin",
},
direct: true,
filter: function (event, player) {
return player.countCards("he") >= 3;
},
content: function () {
"step 0";
player
.chooseToDiscard(get.prompt2("vtbleyu", trigger.player), 3, "he")
.set("ai", (card) => {
if (ui.selected.cards.length == 2) return 10 - get.value(card);
if (_status.event.effect > 0) {
return 6 - get.value(card);
}
return 0;
})
.set(
"effect",
trigger.player.hasJudge("lebu")
? 0
: get.effect(trigger.player, { name: "lebu" }, player, player)
)
.set("logSkill", ["vtbleyu", trigger.player]);
"step 1";
if (result.bool) {
trigger.player.judge(lib.card.lebu.judge).judge2 = lib.card.lebu.judge2;
} else event.finish();
"step 2";
if (!result.bool) {
trigger.player.skip("phaseUse");
}
},
ai: {
expose: 0.3,
threaten: 2.9,
},
},
vtbyuanli: {
audio: 1,
trigger: { global: ["phaseUseSkipped", "phaseUseCancelled"] },
direct: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("vtbyuanli"), lib.filter.notMe)
.set("ai", (target) => get.attitude(_status.event.player, target) + 1);
"step 1";
if (result.bool) {
player.logSkill("vtbyuanli", result.targets[0]);
game.asyncDraw([player, result.targets[0]].sortBySeat(_status.currentPhase));
}
},
ai: {
expose: 0.1,
},
},
vtbmeiniang: {
audio: 1,
trigger: { global: "phaseUseBegin" },
filter: function (event, player) {
return event.player != player;
},
check: function (event, player) {
return get.attitude(player, event.player) > 0 && event.player.getUseValue("jiu") >= 0;
},
logTarget: "player",
content: function () {
trigger.player.chooseUseTarget("jiu", true, false);
},
},
vtbyaoli: {
audio: 1,
trigger: { global: "useCardAfter" },
filter: function (event, player) {
return event.card.name == "jiu" && event.player != player && event.player.isPhaseUsing();
},
logTarget: "player",
check: function (event, player) {
return get.attitude(player, event.player) > 0;
},
content: function () {
trigger.player.addTempSkill("vtbyaoli_effect");
trigger.player.addMark("vtbyaoli_effect", 1, false);
},
ai: {
expose: 0.15,
},
subSkill: {
effect: {
audio: "vtbyaoli",
charlotte: true,
trigger: { player: "useCard2" },
forced: true,
popup: false,
onremove: true,
nopop: true,
filter: function (event, player) {
return event.card.name == "sha" && player.countMark("vtbyaoli_effect") > 0;
},
content: function () {
"step 0";
trigger.directHit.addArray(game.filterPlayer());
var num = player.countMark("vtbyaoli_effect");
if (
!game.hasPlayer((current) => {
return (
!trigger.targets.includes(current) &&
lib.filter.targetEnabled2(trigger.card, player, current)
);
})
)
event.finish();
else
player
.chooseTarget(
"媱丽:是否为" +
get.translation(trigger.card) +
"额外指定" +
(num > 1 ? "至多" : "") +
get.cnNumber(num) +
"个目标?",
num == 1 ? 1 : [1, num],
(card, player, target) => {
return (
!_status.event.sourcex.includes(target) &&
player.canUse(_status.event.card, target)
);
}
)
.set("sourcex", trigger.targets)
.set("ai", (target) => {
var player = _status.event.player;
return get.effect(target, _status.event.card, player, player);
})
.set("card", trigger.card);
"step 1";
if (result.bool) {
if (!event.isMine() && !event.isOnline()) game.delayx();
event.targets = result.targets;
} else {
event.finish();
}
"step 2";
player.logSkill("vtbyaoli_effect", event.targets);
trigger.targets.addArray(event.targets);
player.removeSkill("vtbyaoli_effect");
},
marktext: "媱",
intro: {
content: "下一张【杀】不可被响应且可以额外指定&个目标",
},
ai: {
directHit_ai: true,
skillTagFilter: function (player, tag, arg) {
return arg.card.name == "sha";
},
},
},
},
},
//官盗S特015神马超
psshouli: {
audio: "shouli",
enable: ["chooseToUse", "chooseToRespond"],
hiddenCard: function (player, name) {
if (player != _status.currentPhase && (name == "sha" || name == "shan")) return true;
},
filter: function (event, player) {
if (event.responded || event.psshouli || event.type == "wuxie") return false;
if (
game.hasPlayer(function (current) {
return current.getEquips(4).length > 0;
}) &&
event.filterCard(
get.autoViewAs(
{
name: "sha",
storage: { psshouli: true },
},
"unsure"
),
player,
event
)
)
return true;
if (
game.hasPlayer(function (current) {
return current.getEquips(3).length > 0;
}) &&
event.filterCard(
get.autoViewAs(
{
name: "shan",
storage: { psshouli: true },
},
"unsure"
),
player,
event
)
)
return true;
return false;
},
delay: false,
locked: true,
filterTarget: function (card, player, target) {
var event = _status.event,
evt = event;
if (event._backup) evt = event._backup;
var equip3 = target.getCards("e", (card) => get.is.defendingMount(card, false));
var equip4 = target.getCards("e", (card) => get.is.attackingMount(card, false));
if (
equip3.length &&
equip3.some((card) =>
evt.filterCard(
get.autoViewAs(
{
name: "shan",
storage: { psshouli: true },
},
[card]
),
player,
event
)
)
)
return true;
return equip4.some((card) => {
var sha = get.autoViewAs(
{
name: "sha",
storage: { psshouli: true },
},
[card]
);
if (evt.filterCard(sha, player, event)) {
if (!evt.filterTarget) return true;
return game.hasPlayer(function (current) {
return evt.filterTarget(sha, player, current);
});
}
});
},
prompt: "将场上的一张坐骑牌当做【杀】或【闪】使用或打出",
content: function () {
"step 0";
var evt = event.getParent(2);
evt.set("psshouli", true);
var list = [];
var equip3 = target.getCards("e", (card) => get.is.defendingMount(card, false));
var equip4 = target.getCards("e", (card) => get.is.attackingMount(card, false));
var backupx = _status.event;
_status.event = evt;
try {
if (
equip3.length &&
equip3.some((card) => {
var shan = get.autoViewAs(
{
name: "shan",
storage: { psshouli: true },
},
[card]
);
if (evt.filterCard(shan, player, event)) return true;
return false;
})
) {
list.push("shan");
}
if (
equip4.length &&
equip4.some((card) => {
var sha = get.autoViewAs(
{
name: "sha",
storage: { psshouli: true },
},
[card]
);
if (
evt.filterCard(sha, player, evt) &&
(!evt.filterTarget ||
game.hasPlayer(function (current) {
return evt.filterTarget(sha, player, current);
}))
)
return true;
return false;
})
) {
list.push("sha");
}
} catch (e) {
game.print(e);
}
_status.event = backupx;
if (list.length == 1) {
event.cardName = list[0];
var cards = list[0] == "shan" ? equip3 : equip4;
if (cards.length == 1)
event._result = {
bool: true,
links: [cards[0]],
};
else
player
.choosePlayerCard(true, target, "e")
.set("filterButton", function (button) {
return _status.event.cards.includes(button.link);
})
.set("cards", cards);
} else
player.choosePlayerCard(true, target, "e").set("filterButton", function (button) {
var card = button.link;
return get.is.attackingMount(card) || get.is.defendingMount(card);
});
"step 1";
var evt = event.getParent(2);
if (result.bool && result.links && result.links.length) {
var name =
event.cardName || (get.is.attackingMount(result.links[0]) ? "sha" : "shan");
if (evt.name == "chooseToUse") {
game.broadcastAll(
function (result, name) {
lib.skill.psshouli_backup.viewAs = {
name: name,
cards: [result],
storage: { psshouli: true },
};
lib.skill.psshouli_backup.prompt =
"选择" +
get.translation(name) +
"" +
get.translation(result) +
")的目标";
},
result.links[0],
name
);
evt.set("_backupevent", "psshouli_backup");
evt.backup("psshouli_backup");
evt.set(
"openskilldialog",
"选择" +
get.translation(name) +
"" +
get.translation(result.links[0]) +
")的目标"
);
evt.set("norestore", true);
evt.set("custom", {
add: {},
replace: { window: function () {} },
});
} else {
delete evt.result.skill;
delete evt.result.used;
evt.result.card = get.autoViewAs(
{
name: name,
cards: [result.links[0]],
storage: { psshouli: true },
},
result.links
);
evt.result.cards = [result.links[0]];
target.$give(result.links[0], player, false);
if (player != target) target.addTempSkill("fengyin");
target.addTempSkill("psshouli_thunder");
player.addTempSkill("psshouli_thunder");
evt.redo();
return;
}
}
evt.goto(0);
},
ai: {
respondSha: true,
respondShan: true,
skillTagFilter: function (player, tag) {
var func = get.is[tag == "respondSha" ? "attackingMount" : "defendingMount"];
return game.hasPlayer(function (current) {
return current.hasCard((card) => func(card, false), "e");
});
},
order: 2,
result: {
player: function (player, target) {
var att = Math.max(8, get.attitude(player, target));
if (_status.event.type != "phase") return 9 - att;
if (!player.hasValueTarget({ name: "sha" })) return 0;
return 9 - att;
},
},
},
group: "psshouli_init",
subSkill: {
thunder: {
charlotte: true,
trigger: { player: "damageBegin1" },
forced: true,
mark: true,
content: function () {
trigger.num++;
game.setNature(trigger, "thunder");
},
marktext: "",
intro: {
content: "受到的伤害+1且改为雷属性",
},
ai: {
effect: {
target: (card, player, target) => {
if (!get.tag(card, "damage")) return;
if (target.hasSkillTag("nodamage") || target.hasSkillTag("nothunder"))
return "zeroplayertarget";
if (
target.hasSkillTag("filterDamage", null, {
player: player,
card: new lib.element.VCard(
{
name: card.name,
nature: "thunder",
},
[card]
),
})
)
return;
return 2;
},
},
},
},
init: {
audio: "psshouli",
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
logTarget: () => game.filterPlayer(),
equips: [
["heart", 5, "chitu"],
["diamond", 13, "zixin"],
["spade", 5, "jueying"],
["diamond", 13, "hualiu"],
["club", 5, "dilu"],
["spade", 13, "dawan"],
["heart", 13, "zhuahuang"],
["heart", 3, "jingfanma"],
],
content: function () {
"step 0";
event.targets = game
.filterPlayer()
.sortBySeat(
_status.firstAct2 || game.zhong || game.zhu || _status.firstAct || player
);
event.target = event.targets.shift();
game.delayx();
"step 1";
player.line(target, "green");
target
.chooseToUse(
"狩骊使用一张坐骑牌并摸一张牌或使用一张坐骑牌指示物",
function (card, player, event) {
if (
get.subtype(card) != "equip3" &&
get.subtype(card) != "equip4" &&
get.subtype(card) != "equip6"
)
return false;
return lib.filter.filterCard.apply(this, arguments);
}
)
.set("ai", () => 1);
"step 2";
if (result.bool) target.draw();
else {
var cardx = lib.skill.psshouli_init.equips.randomRemove();
if (!cardx) return;
cardx = {
suit: cardx[0],
number: cardx[1],
name: cardx[2],
};
var card = game.createCard(cardx);
if (!_status.psshouli_equips) _status.psshouli_equips = [];
_status.psshouli_equips.push(card.cardid);
if (card) {
target.chooseUseTarget(card, true, "nopopup", "noanimate");
player.addSkill("psshouli_remove");
}
}
"step 3";
event.target = event.targets.shift();
if (event.target) {
event.goto(1);
}
},
},
remove: {
trigger: {
global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"],
},
forced: true,
charlotte: true,
popup: false,
firstDo: true,
forceDie: true,
filter: function (event, player) {
if (!_status.psshouli_equips || !_status.psshouli_equips.length) return false;
var cards = event.getd();
return cards.filter((i) => _status.psshouli_equips.includes(i.cardid)).length;
},
content: function () {
var cards = trigger.getd(),
remove = [];
for (var card of cards) {
if (_status.psshouli_equips.includes(card.cardid)) {
_status.psshouli_equips.remove(card.cardid);
remove.push(card);
}
}
if (remove.length) {
game.cardsGotoSpecial(remove);
lib.skill.psshouli_init.equips.addArray(
remove.map((i) => [i.suit, i.number, i.name])
);
game.log("坐骑指示物", remove, "被移出了游戏");
}
},
},
},
},
psshouli_backup: {
sourceSkill: "psshouli",
precontent: function () {
"step 0";
delete event.result.skill;
event.result._apply_args = { throw: false };
var cards = event.result.card.cards;
event.result.cards = cards;
var owner = get.owner(cards[0]);
event.target = owner;
owner.$throw(cards[0]);
player.popup(event.result.card.name, "metal");
game.delayx();
event.getParent().addCount = false;
"step 1";
if (player != target) target.addTempSkill("fengyin");
target.addTempSkill("psshouli_thunder");
player.addTempSkill("psshouli_thunder");
},
filterCard: function () {
return false;
},
prompt: "请选择的目标",
selectCard: -1,
},
pshengwu: {
audio: "hengwu",
mod: {
aiOrder: (player, card, num) => {
if (
num > 0 &&
get.tag(card, "draw") &&
ui.cardPile.childNodes.length + ui.discardPile.childNodes.length < 20
)
return 0;
},
aiValue: (player, card, num) => {
if (num > 0 && card.name === "zhuge") return 20;
},
aiUseful: (player, card, num) => {
if (num > 0 && card.name === "zhuge") return 10;
},
},
trigger: { player: ["useCard", "respond"] },
direct: true,
locked: false,
filter: function (event, player) {
return game.hasPlayer((i) =>
i.countCards(
"ej",
(cardx) => get.type(cardx) == "equip" && get.suit(event.card) == get.suit(cardx)
)
);
},
content: function () {
"step 0";
var suit = get.suit(trigger.card),
extra = game
.filterPlayer()
.map((i) =>
i.countCards("ej", (cardx) => {
return (
get.type(cardx) == "equip" &&
get.suit(trigger.card) == get.suit(cardx)
);
})
)
.reduce((p, c) => p + c);
var prompt2 =
"弃置任意张" +
get.translation(suit) +
"手牌然后摸X张牌X为你弃置的牌数+" +
extra +
"";
player
.chooseToDiscard("h", [1, player.countCards("h", { suit: suit })], { suit: suit })
.set("prompt", get.prompt("pshengwu"))
.set("prompt2", prompt2)
.set("ai", (card) => {
if (_status.event.tie) return 0;
let player = _status.event.player;
if (_status.event.goon) return 12 - get.value(card);
if (player == _status.currentPhase) {
if (["shan", "caochuan", "tao", "wuxie"].includes(card.name))
return 8 - get.value(card);
return 6 - get.value(card);
}
return 5.5 - get.value(card);
})
.set("goon", player.countCards("h", { suit: suit }) == 1)
.set("tie", extra > ui.cardPile.childNodes.length + ui.discardPile.childNodes.length)
.set("logSkill", "pshengwu");
"step 1";
if (result.bool) {
var num = result.cards.length;
player.draw(
num +
game
.filterPlayer()
.map((i) =>
i.countCards(
"ej",
(cardx) =>
get.type(cardx) == "equip" &&
get.suit(trigger.card) == get.suit(cardx)
)
)
.reduce((p, c) => p + c)
);
}
},
ai: {
threaten: 100,
reverseEquip: true,
effect: {
player: (card, player, target) => {
if (typeof card !== "object") return;
let suit = get.suit(card);
if (
!lib.suit.includes(suit) ||
player.hasCard(function (i) {
return get.suit(i, player) == suit;
}, "h")
)
return;
return [
1,
game.countPlayer((current) => {
return current.countCards("e", (card) => {
return get.suit(card, current) == suit;
});
}),
];
},
target: (card, player, target) => {
if (
card.name === "sha" &&
!player.hasSkillTag(
"directHit_ai",
true,
{
target: target,
card: card,
},
true
) &&
game.hasPlayer((current) => {
return current.hasCard((cardx) => {
return get.subtype(cardx) === "equip3";
}, "e");
})
)
return [0, -0.5];
},
},
},
},
//战役篇田丰
gzsuishi: {
audio: "suishi",
preHidden: ["gzsuishi2"],
trigger: { global: "dying" },
forced: true,
//priority:6.5,
check: function () {
return false;
},
filter: function (event, player) {
return (
event.player != player &&
event.parent.name == "damage" &&
event.parent.source &&
event.parent.source.isFriendOf(player)
);
},
content: function () {
player.draw();
},
group: "gzsuishi2",
},
gzsuishi2: {
audio: "suishi",
trigger: { global: "dieAfter" },
forced: true,
check: function () {
return false;
},
filter: function (event, player) {
return event.player.isFriendOf(player);
},
content: function () {
player.loseHp();
},
},
//战役篇孔融
zymingshi: {
audio: "mingshi",
forced: true,
trigger: { target: "useCardToBefore" },
priority: 15,
filter: function (event, player) {
if (!player.hasEmptySlot(2)) return false;
if (event.card.name != "sha") return false;
return game.hasNature(event.card);
},
content: function () {
trigger.cancel();
},
ai: {
effect: {
target: function (card, player, target) {
if (card.name === "sha" && game.hasNature(card) && target.hasEmptySlot(2))
return "zeroplayertarget";
if (get.subtype(card) == "equip2" && target.isEmpty(2)) return [0.6, -0.8];
},
},
},
},
//战役篇蒋钦
zyshangyi: {
audio: "shangyi",
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return player != target;
},
content: function () {
"step 0";
target.viewHandcards(player);
"step 1";
if (!target.countCards("h")) event.finish();
else player.chooseCardButton(target, target.getCards("h"));
"step 2";
if (result.bool) {
target.discard(result.links[0]);
}
},
ai: {
order: 11,
result: {
target: function (player, target) {
return -target.countCards("h");
},
},
threaten: 1.1,
},
},
//官盗K系列杜预
pkwuku: {
audio: "spwuku",
trigger: { global: "useCard" },
forced: true,
preHidden: true,
filter: function (event, player) {
if (get.type(event.card) != "equip") return false;
return player.countMark("pkwuku") < 3;
},
content: function () {
player.addMark("pkwuku", 1);
},
marktext: "",
intro: {
content: "mark",
},
ai: {
combo: "pksanchen",
threaten: 3.6,
},
},
pksanchen: {
audio: "spsanchen",
trigger: { player: "phaseJieshuBegin" },
forced: true,
juexingji: true,
skillAnimation: true,
animationColor: "gray",
filter: function (event, player) {
return player.countMark("pkwuku") > 2;
},
content: function () {
player.awakenSkill("pksanchen");
player.gainMaxHp();
player.recover();
player.addSkills("pkmiewu");
},
ai: {
combo: "pkwuku",
},
derivation: "pkmiewu",
},
pkmiewu: {
audio: "spmiewu",
enable: ["chooseToUse", "chooseToRespond"],
filter: function (event, player) {
if (!player.countMark("pkwuku") || player.hasSkill("pkmiewu2")) return false;
for (var i of lib.inpile) {
var type = get.type(i);
if (
(type == "basic" || type == "trick") &&
event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)
)
return true;
}
return false;
},
chooseButton: {
dialog: function (event, player) {
var list = [];
for (var i = 0; i < lib.inpile.length; i++) {
var name = lib.inpile[i];
if (name == "sha") {
if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event))
list.push(["基本", "", "sha"]);
for (var nature of lib.inpile_nature) {
if (
event.filterCard(
get.autoViewAs({ name, nature }, "unsure"),
player,
event
)
)
list.push(["基本", "", "sha", nature]);
}
} else if (
get.type(name) == "trick" &&
event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)
)
list.push(["锦囊", "", name]);
else if (
get.type(name) == "basic" &&
event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)
)
list.push(["基本", "", name]);
}
return ui.create.dialog("灭吴", [list, "vcard"]);
},
//これ 要らない(そよりん声线)
//filter:function(button,player){
// return _status.event.getParent().filterCard({name:button.link[2]},player,_status.event.getParent());
//},
check: function (button) {
if (_status.event.getParent().type != "phase") return 1;
var player = _status.event.player;
if (
[
"wugu",
"zhulu_card",
"yiyi",
"lulitongxin",
"lianjunshengyan",
"diaohulishan",
].includes(button.link[2])
)
return 0;
return player.getUseValue({
name: button.link[2],
nature: button.link[3],
});
},
backup: function (links, player) {
return {
audio: "spmiewu",
filterCard: () => false,
selectCard: -1,
popname: true,
viewAs: { name: links[0][2], nature: links[0][3] },
precontent: function () {
player.addTempSkill("pkmiewu2");
player.removeMark("pkwuku", 1);
},
};
},
prompt: function (links, player) {
return (
"视为使用" +
(get.translation(links[0][3]) || "") +
get.translation(links[0][2]) +
"并摸一张牌"
);
},
},
hiddenCard: function (player, name) {
if (!lib.inpile.includes(name)) return false;
var type = get.type(name);
return (
(type == "basic" || type == "trick") &&
player.countMark("pkwuku") > 0 &&
!player.hasSkill("pkmiewu2")
);
},
ai: {
combo: "pkwuku",
fireAttack: true,
respondSha: true,
respondShan: true,
skillTagFilter: function (player) {
if (!player.countMark("pkwuku") || player.hasSkill("pkmiewu2")) return false;
},
order: 1,
result: {
player: function (player) {
if (_status.event.dying) return get.attitude(player, _status.event.dying);
return 1;
},
},
},
},
pkmiewu2: {
trigger: { player: ["useCardAfter", "respondAfter"] },
forced: true,
charlotte: true,
popup: false,
filter: function (event, player) {
return event.skill == "pkmiewu_backup";
},
content: function () {
player.draw();
},
},
pkmiewu_backup: { audio: "pkmiewu" },
//官盗S系列关羽
pszhonghun: {
audio: "zhongyi",
trigger: { player: ["useCard", "respond"] },
filter: function (event, player) {
return get.color(event.card) == "red";
},
frequent: true,
content: function () {
"step 0";
var card = game.cardsGotoOrdering(get.cards()).cards[0];
event.card = card;
game.updateRoundNumber();
player.showCards(card, get.translation(player) + "发动了忠魂");
"step 1";
if (get.color(card) == "red") player.gain(card, "gain2");
},
},
//官盗S系列郭嘉·一版
psqizuo: {
audio: 2,
trigger: { global: ["damageBegin1", "damageBegin3"] },
filter: function (event, player, name) {
return (
(name == "damageBegin1" &&
event.source &&
event.source.isIn() &&
player.inRange(event.source)) ||
(name == "damageBegin3" &&
event.player &&
event.player.isIn() &&
player.inRange(event.player))
);
},
direct: true,
content: function () {
"step 0";
var name = event.triggername;
var source = get.translation(trigger.source),
target = get.translation(trigger.player),
num = trigger.num;
var targetx = trigger[name == "damageBegin1" ? "source" : "player"];
var str =
name == "damageBegin1"
? source + "即将对" + target + "造成" + num + "点伤害"
: target + "即将受到" + source + "造成的" + num + "点伤害";
player
.chooseToDiscard(
get.prompt("psqizuo", targetx),
str + "是否弃置一张牌并判定若结果颜色与此牌相同你可以令此伤害+1-1",
"he"
)
.set("ai", (card) => {
if (_status.event.goon)
return (
5.25 -
get.value(card) +
(get.color(card) == get.color(_status.pileTop) ? 0.75 : 0)
);
return 0;
})
.set(
"goon",
(function () {
var eff = get.damageEffect(trigger.player, trigger.source, player);
if (
eff > 5 &&
!trigger.player.hasSkillTag("filterDamage", null, {
player: player,
card: trigger.card,
})
)
return true;
if (eff < -5) return true;
return false;
})()
)
.set("logSkill", ["psqizuo", targetx]);
"step 1";
if (result.bool) {
event.color = get.color(result.cards[0], player);
player.judge(function (card) {
if (get.color(card) == _status.event.getParent("psqizuo").color) return 1;
return 0;
});
} else event.finish();
"step 2";
if (result.bool) {
player
.chooseControl("+1", "-1", "cancel2")
.set("prompt", "是否令此伤害+1-1")
.set("ai", () => {
if (_status.event.eff < 0) return 1;
return 0;
})
.set("eff", get.damageEffect(trigger.player, trigger.source, player));
} else event.finish();
"step 3";
if (result.index == 0) {
trigger.num++;
player.popup(" +1 ", "fire");
game.log(player, "令此伤害+1");
}
if (result.index == 1) {
trigger.num--;
player.popup(" -1 ", "water");
game.log(player, "令此伤害-1");
}
},
ai: {
threaten: 0.8,
},
},
//官盗S系列郭嘉·二版
psquanmou: {
audio: 2,
trigger: {
global: "useCardAfter",
},
direct: true,
filter: function (event, player) {
return (
get.type2(event.card) == "trick" &&
event.player != player &&
event.targets &&
event.targets.includes(player) &&
event.cards.filterInD("odj").length &&
player.countCards("h")
);
},
content: function () {
"step 0";
player
.chooseToDiscard(
get.prompt("psquanmou"),
"弃置一张" +
get.translation(get.color(trigger.card)) +
"手牌获得" +
get.translation(trigger.cards),
"h",
(card, player) => {
return get.color(card) == _status.event.color;
}
)
.set("ai", (card) => {
return _status.event.value - get.value(card);
})
.set("logSkill", "psquanmou")
.set("value", get.value(trigger.cards, player))
.set("color", get.color(trigger.card));
"step 1";
if (result.bool) {
var cards = trigger.cards.filterInD("odj");
if (cards.filterInD("od").length) player.gain(cards.filterInD("od"), "gain2");
if (cards.filterInD("j").length)
player.gain(cards.filterInD("j"), get.owner(cards.filterInD("j")[0]), "give");
}
},
},
//官盗S赵云·一版
pshuiqiang: {
audio: 2,
trigger: { player: ["shaMiss", "eventNeutralized"] },
direct: true,
filter: function (event, player) {
if (!event.card || event.card.name != "sha") return false;
return (
event.target.isIn() &&
player.canUse("sha", event.target, false) &&
(player.hasSha() || (_status.connectMode && player.countCards("h")))
);
},
content: function () {
"step 0";
player
.chooseToUse(
get.prompt2("pshuiqiang", trigger.target),
function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
},
trigger.target,
-1
)
.set("addCount", false).logSkill = "pshuiqiang";
},
},
pshuntu: {
audio: 2,
trigger: { source: "damageSource" },
usable: 1,
filter: function (event, player) {
return (
event.card &&
event.card.name == "sha" &&
event.getParent(2).player == player &&
event.notLink() &&
player.isPhaseUsing()
);
},
direct: true,
content: function () {
"step 0";
player
.chooseToUse(
get.prompt2("pshuntu", trigger.player),
function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
},
trigger.player,
-1
)
.set("addCount", false).logSkill = "pshuntu";
"step 1";
if (!result.bool) player.storage.counttrigger.pshuntu--;
},
},
//官盗S赵云·二版
psqijin: {
audio: 2,
trigger: { player: "phaseDrawBegin1" },
filter: function (event, player) {
return !event.numFixed;
},
content: function () {
"step 0";
trigger.changeToZero();
event.cards = get.cards(7);
game.cardsGotoOrdering(event.cards);
event.videoId = lib.status.videoId++;
game.broadcastAll(
function (player, id, cards) {
var str = "七进";
if (player == game.me && !_status.auto) str += "获得一种颜色的所有牌";
var dialog = ui.create.dialog(str, cards);
dialog.videoId = id;
},
player,
event.videoId,
event.cards
);
event.time = get.utc();
game.addVideo("showCards", player, ["七进", get.cardsInfo(event.cards)]);
game.addVideo("delay", null, 2);
"step 1";
var list = [];
for (var i of cards) list.add(get.color(i, false));
list.sort();
var next = player.chooseControl(list);
next.set("ai", function () {
return _status.event.choice;
}).set(
"choice",
(function () {
if (list.length == 0) return list[0];
var color = list[0];
var cards1 = cards.filter((i) => get.color(i) == color),
cards2 = cards.filter((i) => get.color(i) == list[1]);
if (get.value(cards1) * cards1.length > get.value(cards2) * cards2.length)
return list[0];
return list[1];
})()
);
"step 2";
event.color = result.control;
var time = 1000 - (get.utc() - event.time);
if (time > 0) game.delay(0, time);
"step 3";
game.broadcastAll("closeDialog", event.videoId);
player.gain(
cards.filter((i) => get.color(i, false) == event.color),
"gain2"
);
},
ai: {
threaten: 1.5,
},
},
psqichu: {
audio: 2,
enable: ["chooseToUse", "chooseToRespond"],
hiddenCard: function (player, name) {
if (
player != _status.currentPhase &&
!player.hasSkill("psqichu_used") &&
get.type(name) == "basic" &&
lib.inpile.includes(name)
)
return true;
},
filter: function (event, player) {
if (event.responded || player == _status.currentPhase || player.hasSkill("psqichu_used"))
return false;
for (var i of lib.inpile) {
if (get.type(i) == "basic" && event.filterCard({ name: i }, player, event))
return true;
}
return false;
},
delay: false,
content: function () {
"step 0";
player.addTempSkill("psqichu_used");
var evt = event.getParent(2);
var cards = get.cards(2);
for (var i = cards.length - 1; i >= 0; i--) {
ui.cardPile.insertBefore(cards[i].fix(), ui.cardPile.firstChild);
}
var aozhan = player.hasSkill("aozhan");
player
.chooseButton([
"七出选择要" + (evt.name == "chooseToUse" ? "使用" : "打出") + "的牌",
cards,
])
.set("filterButton", function (button) {
return _status.event.cards.includes(button.link);
})
.set(
"cards",
cards.filter(function (card) {
if (get.type(card) != "basic") return false;
if (aozhan && card.name == "tao") {
return (
evt.filterCard(
{
name: "sha",
isCard: true,
cards: [card],
},
evt.player,
evt
) ||
evt.filterCard(
{
name: "shan",
isCard: true,
cards: [card],
},
evt.player,
evt
)
);
}
return evt.filterCard(card, evt.player, evt);
})
)
.set("ai", function (button) {
var evt = _status.event.getParent(3);
if (evt && evt.ai) {
var tmp = _status.event;
_status.event = evt;
var result = (evt.ai || event.ai1)(button.link, _status.event.player, evt);
_status.event = tmp;
return result;
}
return 1;
});
"step 1";
var evt = event.getParent(2);
if (result.bool && result.links && result.links.length) {
var name = result.links[0].name,
aozhan = player.hasSkill("aozhan") && name == "tao";
if (aozhan) {
name = evt.filterCard(
{
name: "sha",
isCard: true,
cards: [card],
},
evt.player,
evt
)
? "sha"
: "shan";
}
if (evt.name == "chooseToUse") {
game.broadcastAll(
function (result, name) {
lib.skill.psqichu_backup.viewAs = {
name: name,
cards: [result],
isCard: true,
};
lib.skill.psqichu_backup.prompt =
"选择" + get.translation(result) + "的目标";
},
result.links[0],
name
);
evt.set("_backupevent", "psqichu_backup");
evt.backup("psqichu_backup");
} else {
delete evt.result.skill;
delete evt.result.used;
evt.result.card = get.autoViewAs(result.links[0]);
if (aozhan) evt.result.card.name = name;
evt.result.cards = [result.links[0]];
evt.redo();
return;
}
}
evt.goto(0);
},
ai: {
effect: {
target: function (card, player, target, effect) {
if (target.hasSkill("psqichu_used")) return;
if (get.tag(card, "respondShan")) return 0.7;
if (get.tag(card, "respondSha")) return 0.7;
},
},
order: 11,
respondShan: true,
respondSha: true,
result: {
player: function (player) {
if (_status.event.dying) return get.attitude(player, _status.event.dying);
return 1;
},
},
},
subSkill: {
backup: {
precontent: function () {
delete event.result.skill;
var name = event.result.card.name;
event.result.cards = event.result.card.cards;
event.result.card = get.autoViewAs(event.result.cards[0]);
event.result.card.name = name;
},
filterCard: function () {
return false;
},
selectCard: -1,
},
used: { charlotte: true },
},
},
pslongxin: {
audio: 2,
trigger: { player: "phaseJudgeBegin" },
direct: true,
filter: function (event, player) {
return player.countCards("j") && player.countCards("h");
},
content: function () {
"step 0";
player
.chooseToDiscard(get.prompt2("pslongxin"), { type: "equip" }, "he")
.set("logSkill", "pslongxin")
.set("ai", (card) => {
if (_status.event.goon) return 15 - get.value(card);
return 0;
})
.set(
"goon",
player.hasCard((card) => {
var cardj = card.viewAs ? { name: card.viewAs } : card;
return get.effect(player, cardj, player, player) < 0;
}, "j")
);
"step 1";
if (result.bool) {
player.discardPlayerCard(player, "j", true);
}
},
},
//官盗S周瑜·一版
psoldshiyin: {
audio: 2,
trigger: {
player: "gainAfter",
global: "loseAsyncAfter",
},
frequent: true,
filter: function (event, player) {
if (player != _status.currentPhase) return false;
return event.getg(player).filter((i) => get.owner(i) == player).length > 0;
},
content: function () {
"step 0";
player.showCards(
trigger.getg(player).filter((i) => get.owner(i) == player),
get.translation(player) + "发动了识音"
);
"step 1";
var suits = [],
cards = trigger.getg(player).filter((i) => get.owner(i) == player);
for (var card of cards) suits.add(get.suit(card, player));
player.addTempSkill("psoldshiyin_effect");
if (!player.storage.psoldshiyin_effect) player.storage.psoldshiyin_effect = 0;
player.storage.psoldshiyin_effect = Math.max(
player.storage.psoldshiyin_effect,
suits.length
);
if (suits.length >= 2) player.addMark("psoldshiyin_damage", 1, false);
},
subSkill: {
effect: {
trigger: { player: "useCard" },
charlotte: true,
forced: true,
onremove: ["psoldshiyin_effect", "psoldshiyin_damage"],
content: function () {
var num = player.countMark("psoldshiyin_effect");
if (num >= 1) trigger.directHit.addArray(game.players);
if (num >= 2 && get.tag(trigger.card, "damage"))
trigger.baseDamage += player.countMark("psoldshiyin_damage");
if (num >= 3) player.draw();
player.removeSkill("psoldshiyin_effect");
},
mod: {
aiOrder: function (player, card, num) {
var numx = player.countMark("psoldshiyin_effect");
if (numx >= 2 && get.tag(card, "damage")) return num + 10;
},
},
},
},
},
//官盗S周瑜·二版
psshiyin: {
audio: 2,
trigger: {
global: "phaseBefore",
player: "enterGame",
},
forced: true,
locked: false,
direct: true,
group: "psshiyin_change",
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0;
},
content: function () {
"step 0";
player
.chooseCard(get.prompt("psshiyin"), "将一张手牌置于武将牌上称为杂音")
.set("ai", (card) => 20 - get.value(card));
"step 1";
if (result.bool) {
player.logSkill("psshiyin");
player.addToExpansion(result.cards, player, "give").gaintag.add("psshiyin");
}
},
marktext: "",
intro: {
name: "杂音",
name2: "杂音",
content: "expansion",
markcount: "expansion",
},
subSkill: {
change: {
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return player.getExpansions("psshiyin").length && player.countCards("h");
},
content: function () {
"step 0";
var card = player.getExpansions("psshiyin")[0];
player
.chooseCard(
get.prompt("psshiyin"),
"用一张手牌替换杂音" + get.translation(card) + ""
)
.set("ai", (card) => {
if (_status.event.suit && get.suit(card) == _status.event.suit)
return 8 - get.value(card);
return 0;
})
.set(
"suit",
(function () {
var suits = lib.suit
.slice()
.map((i) => [
i,
(get.suit(card) == i ? 1 : 0) +
player.countCards("h", { suit: i }),
])
.filter((i) => i[1] > 0);
suits.sort((a, b) => a[1] - b[1]);
if (suits.length > 0) return suits[0][0];
return null;
})()
);
"step 1";
if (result.bool) {
player.logSkill("psshiyin");
player
.addToExpansion(result.cards[0], "give", player)
.gaintag.add("psshiyin");
var card = player.getExpansions("psshiyin")[0];
if (card) player.gain(card, "gain2");
}
},
},
},
},
psquwu: {
audio: 2,
forced: true,
trigger: { target: "useCardToBefore" },
filter: function (event, player) {
return (
player.getExpansions("psshiyin").length &&
get.suit(player.getExpansions("psshiyin")[0]) == get.suit(event.card)
);
},
content: function () {
trigger.cancel();
},
ai: {
threaten: 1.1,
combo: "psshiyin",
effect: {
target: function (card, player, target, current) {
var list = target.getExpansions("psshiyin");
for (var cardx of list) {
if (get.suit(cardx) == get.suit(card)) return "zeroplayertarget";
}
},
},
},
mod: {
cardEnabled2: function (card, player) {
var list = player.getExpansions("psshiyin");
for (var cardx of list) {
if (get.suit(cardx) == get.suit(card)) return false;
}
},
cardRespondable: function (card, player) {
var list = player.getExpansions("psshiyin");
for (var cardx of list) {
if (get.suit(cardx) == get.suit(card)) return false;
}
},
cardSavable: function (card, player) {
var list = player.getExpansions("psshiyin");
for (var cardx of list) {
if (get.suit(cardx) == get.suit(card)) return false;
}
},
},
},
psliaozou: {
audio: 2,
enable: "phaseUse",
locked: false,
filter: function (event, player) {
return (
!player.hasSkill("psliaozou_blocker", null, null, false) &&
player.getExpansions("psshiyin").length > 0
);
},
content: function () {
"step 0";
player.showHandcards(get.translation(player) + "发动了聊奏");
"step 1";
var cards = player.getExpansions("psshiyin"),
bool = true;
for (var card of cards) {
var suit = get.suit(card);
if (player.hasCard((cardx) => get.suit(cardx) == suit)) {
bool = false;
break;
}
}
if (bool) player.draw();
else
player.addTempSkill("psliaozou_blocker", {
player: ["useCard1", "useSkillBegin", "phaseUseEnd"],
});
},
subSkill: {
blocker: { charlotte: true },
},
mod: {
aiValue: function (player, card, num) {
var suit = get.suit(card);
if (
player.isPhaseUsing() &&
player.getExpansions("psshiyin").some((i) => get.suit(i) == suit)
)
return num / 5;
},
aiUseful: function () {
return lib.skill.psliaozou.mod.aiValue.apply(this, arguments);
},
},
ai: {
combo: "psshiyin",
order: 9.9,
result: {
player: function (player) {
var cards = player.getExpansions("psshiyin"),
bool = true;
for (var card of cards) {
var suit = get.suit(card);
if (player.hasCard((cardx) => get.suit(cardx) == suit)) return 0;
}
return 1;
},
},
},
},
//官盗S武将传晋司马
psquanyi: {
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return player.canCompare(target);
},
group: "psquanyi_tianbian",
content: function () {
"step 0";
player.chooseToCompare(target, function (card) {
if (typeof card == "string" && lib.skill[card]) {
var ais =
lib.skill[card].check ||
function () {
return 0;
};
return ais();
}
var player = get.owner(card);
var getn = function (card) {
if (player.hasSkill("tianbian") && get.suit(card) == "heart") return 13;
return get.number(card);
};
var event = _status.event.getParent();
var to = player == event.player ? event.target : event.player;
var addi = get.value(card) >= 8 && get.type(card) != "equip" ? -6 : 0;
if (card.name == "du") addi -= 5;
if (get.color(card) == "black") addi -= 6;
if (player == event.player) {
if (event.small) {
return -getn(card) - get.value(card) / 2 + addi;
}
return getn(card) - get.value(card) / 2 + addi;
} else {
if (get.attitude(player, to) <= 0 == Boolean(event.small)) {
return -getn(card) - get.value(card) / 2 + addi;
}
return getn(card) - get.value(card) / 2 + addi;
}
});
"step 1";
if (result.tie) event.finish();
else {
var targets = [player, target];
if (!result.bool) targets.reverse();
var suits = [result.player, result.target].map((i) => get.suit(i, false));
event.targets = targets;
event.suits = suits;
}
"step 2";
if (event.suits.includes("heart")) {
if (targets[1].countGainableCards("hej", targets[0]) > 0) {
targets[0].gainPlayerCard(targets[1], "hej", true);
}
}
"step 3";
if (event.suits.includes("diamond")) {
targets[1].damage(targets[0]);
}
"step 4";
if (event.suits.includes("spade")) {
targets[0].loseHp();
}
"step 5";
if (event.suits.includes("club")) {
if (targets[0].countDiscardableCards(targets[0], "he")) {
targets[0].chooseToDiscard(2, true, "he");
}
}
},
ai: {
order: 6,
result: {
target: -1,
},
},
subSkill: {
tianbian: {
audio: "psquanyi",
enable: "chooseCard",
check: function (event) {
var player = _status.event.player;
if (player.hasSkill("smyyingshi")) {
var card = ui.cardPile.childNodes[0];
if (
(get.color(card) == "black" && get.number(card) <= 4) ||
(get.color(card) == "red" && get.number(card) >= 11)
)
return 20;
}
return !player.hasCard(function (card) {
var val = get.value(card);
return (
val < 0 ||
(get.color(card) == "black" && val <= 4) ||
(get.color(card) == "red" && get.number(card) >= 11)
);
}, "h")
? 20
: 0;
},
filter: function (event) {
return event.type == "compare" && !event.directresult;
},
onCompare: function (player) {
return game.cardsGotoOrdering(get.cards()).cards;
},
},
},
},
//官盗S曹植
psliushang: {
audio: 2,
trigger: { player: "phaseDrawBegin1" },
forced: true,
filter: function (event, player) {
return !event.numFixed;
},
group: "psliushang_give",
content: function () {
"step 0";
trigger.changeToZero();
player.draw(1 + Math.max(3, game.countPlayer()));
event.targets = game.filterPlayer((i) => i != player);
"step 1";
var current = targets.shift();
if (!player.countCards("h")) event.finish();
else
player.chooseCardTarget({
prompt: "流殇将一张牌置于" + get.translation(current) + "武将牌上",
current: current,
filterCard: true,
forced: true,
filterTarget: function (card, player, target) {
return target == _status.event.current;
},
selectTarget: -1,
ai1: function (card) {
var current = _status.event.current;
return get.value(card, current) * get.attitude(_status.event.player, current);
},
ai2: () => 1,
});
"step 2";
if (result.bool) {
result.targets[0]
.addToExpansion(result.cards, player, "give")
.gaintag.add("psliushang");
}
if (targets.length) event.goto(1);
},
marktext: "",
intro: {
content: "expansion",
markcount: "expansion",
},
subSkill: {
give: {
trigger: { global: "phaseZhunbeiBegin" },
filter: function (event, player) {
return event.player != player && event.player.getExpansions("psliushang").length;
},
forced: true,
logTarget: "player",
content: function () {
"step 0";
var cards = trigger.player.getExpansions("psliushang"),
name = get.translation(cards);
event.cards = cards;
trigger.player
.chooseControl()
.set("choiceList", [
"获得" + name + "且于本回合防止对" + get.translation(player) + "的伤害",
"" + name + "置入弃牌堆",
])
.set("ai", () => {
return _status.event.choice;
})
.set(
"choice",
(function () {
if (get.damageEffect(player, trigger.player, trigger.player) <= 0)
return 0;
if (get.value(cards, trigger.player) < 0) return 1;
if (
trigger.player.hasCard((card) => {
return (
get.tag(card, "damage") &&
trigger.player.canUse(card, player) &&
get.effect(player, card, trigger.player, trigger.player) >
0
);
}, "hs")
)
return 1;
return 0;
})()
);
"step 1";
if (result.index == 0) {
trigger.player.gain(cards, "gain2");
trigger.player.addTempSkill("psliushang_prevent");
trigger.player.markAuto("psliushang_prevent", [player]);
} else {
trigger.player.loseToDiscardpile(cards);
}
"step 2";
game.delayx();
},
},
prevent: {
trigger: { source: "damageBegin2" },
filter: function (event, player) {
return player.getStorage("psliushang_prevent").includes(event.player);
},
forced: true,
onremove: true,
charlotte: true,
logTarget: "player",
content: function () {
trigger.cancel();
},
ai: {
effect: {
target: function (card, player, target, current) {
if (
player.getStorage("psliushang_prevent").includes(target) &&
get.tag(card, "damage")
) {
return "zeroplayertarget";
}
},
},
},
},
},
},
psqibu: {
trigger: { player: "dying" },
filter: function (event, player) {
return player.hp <= 0;
},
limited: true,
skillAnimation: true,
animationColor: "water",
content: function () {
"step 0";
player.awakenSkill("psqibu");
var cards = game.cardsGotoOrdering(get.cards(7)).cards;
game.updateRoundNumber();
event.cards = cards;
player.showCards(cards, get.translation(player) + "发动了流殇");
"step 1";
var num = cards.filter((i) => get.suit(i) == "heart").length;
var gains = cards.filter((i) => get.suit(i) == "club");
if (num > 0) player.recover(num);
if (gains.length) player.gain(gains, "gain2");
},
},
//官盗S曹丕
psjianwei: {
audio: 2,
trigger: { player: "phaseBegin" },
skillAnimation: true,
animationColor: "water",
limited: true,
direct: true,
filter: function (event, player) {
return player.hp >= 1;
},
content: function () {
"step 0";
player.chooseTarget(get.prompt2("psjianwei"), lib.filter.notMe).set("ai", (target) => {
var player = _status.event.player;
if (player.hp == 1 && !player.canSave(player)) return 0;
var sgn = get.sgnAttitude(player, target);
var valMine = [0, 0],
valHis = [0, 0];
player.getCards("hej", (card) => {
if (get.position(card) == "j") {
valMine[0] += get.effect(player, card, player);
valMine[1] += get.effect(target, card, player);
} else {
valMine[0] += get.value(card, player);
valMine[1] += get.value(card, target) * sgn;
}
});
target.getCards("hej", (card) => {
if (get.position(card) == "j") {
valHis[0] += get.effect(player, card, player);
valHis[1] += get.effect(target, card, player);
} else {
valHis[0] += get.value(card, player);
valHis[1] += get.value(card, target) * sgn;
}
});
return valMine[1] - valMine[0] + valHis[0] - valHis[1] >= 60;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("psjianwei", target);
player.awakenSkill("psjianwei");
player.loseHp();
} else event.finish();
"step 2";
if (player.isIn() && target.isIn()) {
var next = game.createEvent("psjianwei_swap");
next.player = player;
next.target = target;
next.set("cards1", player.getCards("hej"));
next.set("cards2", target.getCards("hej"));
next.setContent(lib.skill.psjianwei.swapRegioncards);
}
},
swapRegioncards: function () {
"step 0";
player.$giveAuto(event.cards1, target);
target.$giveAuto(event.cards2, player);
"step 1";
event.h1 = event.cards1.filter((i) => get.position(i) == "h");
event.e1 = event.cards1.filter((i) => get.position(i) == "e");
event.j1 = event.cards1.filter((i) => get.position(i) == "j");
event.h2 = event.cards2.filter((i) => get.position(i) == "h");
event.e2 = event.cards2.filter((i) => get.position(i) == "e");
event.j2 = event.cards2.filter((i) => get.position(i) == "j");
game.loseAsync({
lose_list: [
[player, event.cards1],
[target, event.cards2],
],
}).setContent("chooseToCompareLose");
"step 2";
var todis = [];
for (var i = 0; i < event.j1.length; i++) {
if (
target.isDisabledJudge() ||
target.hasJudge(event.j1[i].viewAs || event.j1[i].name)
)
todis.push(event.j1[i]);
}
for (var i = 0; i < event.j2.length; i++) {
if (
player.isDisabledJudge() ||
player.hasJudge(event.j2[i].viewAs || event.j2[i].name)
)
todis.push(event.j2[i]);
}
if (todis.length) game.cardsDiscard(todis);
"step 3";
game.loseAsync({
gain_list: [
[player, event.h2.filter((i) => get.position(i, true) == "o")],
[target, event.h1.filter((i) => get.position(i, true) == "o")],
],
}).setContent("gaincardMultiple");
for (var i = 0; i < event.e2.length; i++) {
if (get.position(event.e2[i], true) == "o") player.equip(event.e2[i]);
}
for (var i = 0; i < event.e1.length; i++) {
if (get.position(event.e1[i], true) == "o") target.equip(event.e1[i]);
}
for (var i = 0; i < event.j2.length; i++) {
if (get.position(event.j2[i], true) == "o") player.addJudge(event.j2[i]);
}
for (var i = 0; i < event.j1.length; i++) {
if (get.position(event.j1[i], true) == "o") target.addJudge(event.j1[i]);
}
"step 4";
game.delayx();
},
},
//官盗S司马懿
pszhonghu: {
audio: 2,
trigger: { global: "dieAfter" },
global: "pszhonghu_skip",
filter: function (event, player) {
return player != _status.currentPhase;
},
content: function () {
"step 0";
var evt = trigger.getParent("phaseUse");
if (evt && evt.name == "phaseUse") {
evt.skipped = true;
}
var evt = trigger.getParent("phase");
if (evt && evt.name == "phase") {
game.log(evt.player, "结束了回合");
evt.finish();
evt.untrigger(true);
}
_status._pszhonghu = player;
},
subSkill: {
skip: {
trigger: { player: "phaseBeforeStart" },
forced: true,
priority: Infinity,
popup: false,
firstDo: true,
filter: function (event, player) {
if (
(_status._pszhonghu && !_status._pszhonghu.isIn()) ||
event.player == _status._pszhonghu
)
delete _status._pszhonghu;
return _status._pszhonghu && event.player != _status._pszhonghu;
},
content: function () {
trigger.cancel(null, null, "notrigger");
},
},
},
},
//官盗S虎啸龙吟司马懿&诸葛亮
pshuxiao: {
audio: 2,
trigger: { player: "phaseBegin" },
frequent: true,
content: function () {
"step 0";
player.judge(function (card) {
if (get.type(card) == "basic" || get.type(card) == "trick") return 3;
return -1;
});
"step 1";
if (result.bool) {
player.addTempSkill("pshuxiao_use");
player.storage.pshuxiao_use = {
card: { name: result.name, nature: result.card.nature },
number: result.number,
suit: result.suit,
};
}
},
subSkill: {
use: {
charlotte: true,
onremove: true,
enable: "chooseToUse",
popname: true,
position: "hs",
hiddenCard: function (player, name) {
return player.storage.pshuxiao_use.card.name == name;
},
filter: function (event, player) {
if (!player.storage.pshuxiao_use) return false;
if (!player.countCards("h")) return false;
return event.filterCard(player.storage.pshuxiao_use.card, player, event);
},
viewAs: function (cards, player) {
return player.storage.pshuxiao_use.card;
},
filterCard: function (card, player) {
return (
get.number(card) == player.storage.pshuxiao_use.number ||
get.suit(card) == player.storage.pshuxiao_use.suit
);
},
prompt: function (event) {
var player = _status.event.player;
return (
"将一张" +
get.translation(player.storage.pshuxiao_use.suit) +
"牌或点数为" +
get.strNumber(player.storage.pshuxiao_use.number) +
"的牌当作" +
get.translation(player.storage.pshuxiao_use.card) +
"使用"
);
},
},
},
},
psguanxing: {
audio: "guanxing",
trigger: { player: "phaseZhunbeiBegin" },
frequent: true,
preHidden: true,
content: function () {
"step 0";
var num = 5;
var cards = get.cards(num);
game.cardsGotoOrdering(cards);
var next = player.chooseToMove();
next.set("list", [["牌堆顶", cards], ["牌堆底"]]);
next.set("prompt", "观星点击将牌移动到牌堆顶或牌堆底");
next.processAI = function (list) {
var cards = list[0][1],
player = _status.event.player;
var top = [];
var judges = player.getCards("j");
var stopped = false;
if (!player.hasWuxie()) {
for (var i = 0; i < judges.length; i++) {
var judge = get.judge(judges[i]);
cards.sort(function (a, b) {
return judge(b) - judge(a);
});
if (judge(cards[0]) < 0) {
stopped = true;
break;
} else {
top.unshift(cards.shift());
}
}
}
var bottom;
if (!stopped) {
cards.sort(function (a, b) {
return get.value(b, player) - get.value(a, player);
});
while (cards.length) {
if (get.value(cards[0], player) <= 5) break;
top.unshift(cards.shift());
}
}
bottom = cards;
return [top, bottom];
};
"step 1";
var top = result.moved[0];
var bottom = result.moved[1];
top.reverse();
for (var i = 0; i < top.length; i++) {
ui.cardPile.insertBefore(top[i], ui.cardPile.firstChild);
}
for (i = 0; i < bottom.length; i++) {
ui.cardPile.appendChild(bottom[i]);
}
player.popup(get.cnNumber(top.length) + "" + get.cnNumber(bottom.length) + "");
game.log(player, "" + get.cnNumber(top.length) + "张牌置于牌堆顶");
game.updateRoundNumber();
game.delayx();
},
ai: {
threaten: 1.2,
},
},
pslongyin: {
audio: 2,
enable: ["chooseToUse", "chooseToRespond"],
filter: function (event, player) {
if (!player.countCards("hse") || player.hasSkill("pslongyin_used")) return false;
for (var i of lib.inpile) {
var type = get.type(i);
if (
(type == "basic" || type == "trick") &&
event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)
)
return true;
}
return false;
},
chooseButton: {
dialog: function (event, player) {
var list = [];
for (var i = 0; i < lib.inpile.length; i++) {
var name = lib.inpile[i];
if (name == "sha") {
if (event.filterCard({ name: name }, player, event))
list.push(["基本", "", "sha"]);
for (var j of lib.inpile_nature) {
if (event.filterCard({ name: name, nature: j }, player, event))
list.push(["基本", "", "sha", j]);
}
} else if (
get.type(name) == "trick" &&
event.filterCard({ name: name }, player, event)
)
list.push(["锦囊", "", name]);
else if (
get.type(name) == "basic" &&
event.filterCard({ name: name }, player, event)
)
list.push(["基本", "", name]);
}
return ui.create.dialog("虎啸", [list, "vcard"]);
},
filter: function (button, player) {
return _status.event
.getParent()
.filterCard(
{ name: button.link[2], nature: button.link[3] },
player,
_status.event.getParent()
);
},
check: function (button) {
if (_status.event.getParent().type != "phase") return 1;
var player = _status.event.player;
if (
[
"wugu",
"zhulu_card",
"yiyi",
"lulitongxin",
"lianjunshengyan",
"diaohulishan",
].includes(button.link[2])
)
return 0;
return player.getUseValue({
name: button.link[2],
nature: button.link[3],
});
},
backup: function (links, player) {
return {
filterCard: function (card, player) {
var num = 0;
for (var i = 0; i < ui.selected.cards.length; i++) {
num += get.number(ui.selected.cards[i]);
}
return get.number(card) + num <= 13;
},
selectCard: [1, Infinity],
filterOk: function () {
var num = 0;
for (var i = 0; i < ui.selected.cards.length; i++) {
num += get.number(ui.selected.cards[i]);
}
return num == 13;
},
audio: "pslongyin",
popname: true,
complexCard: true,
check: function (card) {
var num = 0;
for (var i = 0; i < ui.selected.cards.length; i++) {
num += get.number(ui.selected.cards[i]);
}
if (num + get.number(card) == 13) return 5.5 - get.value(card);
if (ui.selected.cards.length == 0) {
var cards = _status.event.player.getCards("h");
for (var i = 0; i < cards.length; i++) {
for (var j = i + 1; j < cards.length; j++) {
if (get.number(cards[i]) + get.number(cards[j]) == 13) {
if (cards[i] == card || cards[j] == card)
return 6 - get.value(card);
}
}
}
}
return 0;
},
position: "hes",
viewAs: { name: links[0][2], nature: links[0][3] },
precontent: function () {
player.addTempSkill("pslongyin_used");
},
};
},
prompt: function (links, player) {
return (
"将任意张点数和为13牌当做" +
(get.translation(links[0][3]) || "") +
get.translation(links[0][2]) +
"使用"
);
},
},
hiddenCard: function (player, name) {
if (!lib.inpile.includes(name)) return false;
var type = get.type(name);
return (
(type == "basic" || type == "trick") &&
player.countCards("she") > 0 &&
!player.hasSkill("pslongyin_used")
);
},
ai: {
fireAttack: true,
respondSha: true,
respondShan: true,
skillTagFilter: function (player) {
if (!player.countCards("hse") || player.hasSkill("pslongyin_used")) return false;
},
order: 1,
result: {
player: function (player) {
if (_status.event.dying) return get.attitude(player, _status.event.dying);
return 1;
},
},
},
subSkill: {
used: { charlotte: true },
},
},
//官盗S武将传诸葛亮
pszhiji: {
audio: 2,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
if (!ui.selected.targets.length) return true;
return target.group != ui.selected.targets[0].group;
},
selectTarget: 2,
complexTarget: true,
multitarget: true,
multiline: true,
filterCard: true,
selectCard: 2,
check: function (card) {
return 6 - get.value(card);
},
content: function () {
"step 0";
targets.sortBySeat();
if (targets[0].canUse("sha", targets[1], false))
targets[0].useCard({ name: "sha", isCard: true }, targets[1], false, "noai");
"step 1";
if (targets[1].canUse("sha", targets[0], false))
targets[1].useCard({ name: "sha", isCard: true }, targets[0], false, "noai");
},
ai: {
order: 2.5,
result: {
player: 1,
target: function (player, target) {
if (ui.selected.targets.length) {
var targetx = ui.selected.targets[0];
if (
get.effect(targetx, { name: "sha" }, target, player) +
get.effect(target, { name: "sha" }, targetx, player) <
0
)
return 0;
return -1;
}
return -1;
},
},
},
},
psjiefeng: {
audio: 2,
enable: "phaseUse",
filterCard: true,
selectCard: 2,
check: function (card) {
return 6 - get.value(card);
},
content: function () {
"step 0";
var cards = game.cardsGotoOrdering(get.cards(5)).cards;
event.cards = cards;
player.showCards(cards, get.translation(player) + "发动了借风");
"step 1";
if (cards.filter((i) => get.color(i) == "red").length >= 2) {
player.chooseUseTarget("wanjian", true);
}
},
ai: {
order: 9,
result: {
player: function (player) {
if (player.getUseValue({ name: "wanjian" }) < 0) return 0;
return 1;
},
},
},
},
//官盗S马超
psweihou: {
trigger: { player: "judgeBegin" },
filter: function (event, player) {
return !event.directresult;
},
content: function () {
"step 0";
var cards = get.cards(2);
for (var i = cards.length - 1; i >= 0; i--) {
ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild);
}
game.updateRoundNumber();
event.cards = cards;
event.videoId = lib.status.videoId++;
game.broadcastAll(
function (player, id, cards) {
var str;
if (player == game.me && !_status.auto) str = "威侯选择一张作为本次判定结果";
else str = get.translation(player) + "发动了威侯";
var dialog = ui.create.dialog(str, cards);
dialog.videoId = id;
},
player,
event.videoId,
event.cards
);
game.addVideo("showCards", player, ["威侯", get.cardsInfo(event.cards)]);
if (!event.isMine() && !event.isOnline()) game.delayx();
"step 1";
player
.chooseButton(["威侯选择一张作为本次判定结果", cards], true)
.set("ai", (button) => {
return _status.event.getTrigger().judge(button.link);
})
.set("dialog", event.videoId);
"step 2";
game.broadcastAll("closeDialog", event.videoId);
if (result.bool) {
trigger.directresult = result.links[0];
game.cardsDiscard(
cards.removeArray(result.links).filter((i) => get.position(i) == "c")
);
}
"step 3";
game.updateRoundNumber();
},
},
//官盗S1066★贾诩
psqupo: {
audio: 2,
trigger: { global: "phaseBegin" },
filter: function (event, player) {
return player.countCards("he");
},
direct: true,
content: function () {
"step 0";
var cards = player.getCards("he");
var current = trigger.player;
var ai1 = function (card) {
var player = _status.event.player,
current = _status.event.current;
var card = get.color(card);
if (color == "black") {
if (!current.hasSha() || !current.hasUseTarget({ name: "sha" })) return 0;
if (targets.length) return 5.5 - get.value(card);
} else if (color == "red") {
if (get.attitude(player, current) <= 0) return 0;
if (
current.hasCard((card) => {
if (!get.tag(card, "damage")) return false;
var targetsx = game.filterPlayer((currentx) => {
if (currentx == current || current == player) return false;
return (
current.canUse(card, currentx) &&
get.effect(currentx, card, current, player) > 0
);
});
targets2.addArray(targetsx);
return targetsx.length;
}, "hs")
)
return 5.5 - get.value(card);
}
return 0;
};
var targets = game.filterPlayer((currentx) => {
if (currentx == current || current == player) return false;
return (
!current.canUse("sha", currentx) ||
(get.effect(currentx, { name: "sha" }, current, player) > 0 &&
get.attitude(player, currentx) > -3)
);
});
targets.sort((a, b) => get.attitude(player, b) - get.attitude(player, a));
var targets2 = [];
var cardx = cards.sort((a, b) => ai1(b) - ai1(a))[0];
targets2.sort((a, b) => get.threaten(b, current) - get.threaten(a, current));
var next = player.chooseCardTarget({
filterCard: true,
prompt: get.prompt2("psqupo"),
current: trigger.player,
filterTarget: function (card, player, target) {
return player != target && target != _status.event.current;
},
ai1: function (card) {
return card == _status.event.cardx ? 1 : 0;
},
ai2: function (target) {
return target == _status.event.targetx ? 1 : 0;
},
});
if (ai1(cardx) > 0) {
next.cardx = cardx;
if (get.color(cardx) == "black") {
if (targets.length) next.targetx = targets[0];
} else {
if (targets2.length) next.targetx = targets2[0];
}
}
"step 1";
if (result.bool) {
var target = result.targets[0],
cards = result.cards;
player.logSkill("psqupo", target);
player.give(cards, target);
var color = get.color(cards[0]);
if (color == "black") {
_status.currentPhase.addTempSkill("psqupo_black");
_status.currentPhase.markAuto("psqupo_black", [target]);
} else if (color == "red") {
target.addTempSkill("psqupo_red");
target.addMark("psqupo_red", 1, false);
}
}
},
subSkill: {
black: {
trigger: { player: "useCardToTarget" },
forced: true,
charlotte: true,
onremove: true,
filter: function (event, player) {
if (event.card.name != "sha") return false;
var targets = player.getStorage("psqupo_black").slice();
targets.remove(event.target);
return targets.length;
},
content: function () {
var targets = player.getStorage("psqupo_black").slice();
targets.remove(trigger.target);
player.loseHp(targets.length);
},
},
red: {
trigger: { player: "damageBegin3" },
charlotte: true,
forced: true,
onremove: true,
content: function () {
player.loseHp(player.countMark("psqupo_red"));
player.removeSkill("psqupo_red");
},
},
},
},
psbaoquan: {
audio: 2,
trigger: { player: "damageBegin4" },
filter: function (event, player) {
return player.countCards("h", { type: ["trick", "delay"] }) || _status.connectMode;
},
direct: true,
content: function () {
"step 0";
player
.chooseToDiscard(get.prompt2("psbaoquan"), { type: ["trick", "delay"] })
.set("logSkill", "psbaoquan")
.set("ai", (card) => {
if (_status.event.goon) return 7 - get.value(card);
return 0;
})
.set("goon", get.damageEffect(player, trigger.source, player) < -5);
"step 1";
if (result.bool) {
trigger.cancel();
}
},
},
//官盗S吕布
pssheji: {
audio: 2,
enable: "phaseUse",
filterCard: true,
selectCard: -1,
position: "h",
locked: false,
filter: function (event, player) {
if (player.hasSkill("pssheji_used")) return false;
var hs = player.getCards("h");
if (!hs.length) return false;
for (var card of hs) {
var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
if (mod2 === false) return false;
}
return event.filterCard(get.autoViewAs({ name: "sha" }, hs));
},
viewAs: {
name: "sha",
storage: { pssheji: true },
},
onuse: function (links, player) {
player.addTempSkill("pssheji_used", "phaseUseAfter");
},
ai: {
order: 1,
threaten: 1.1,
},
mod: {
targetInRange: function (card, player, target) {
if (card.storage && card.storage.pssheji) return true;
},
},
subSkill: {
used: {
audio: "pssheji",
trigger: { source: "damageSource" },
charlotte: true,
forced: true,
popup: false,
logTarget: "player",
filter: function (event, player) {
return (
event.card.storage &&
event.card.storage.pssheji &&
event.player.hasCard((card) => {
if (!lib.filter.canBeGained(card, player, event.player)) return false;
return ["equip1", "equip3", "equip4", "equip6"].includes(
get.subtype(card)
);
}, "e")
);
},
content: function () {
var cards = trigger.player.getCards("e", (card) => {
if (!lib.filter.canBeGained(card, player, trigger.player)) return false;
return ["equip1", "equip3", "equip4", "equip6"].includes(get.subtype(card));
});
if (cards.length) player.gain(cards, "giveAuto", trigger.player);
},
},
},
},
//战役篇国战将转身份
//钟会
zyquanji: {
audio: "gzquanji",
trigger: {
player: "damageEnd",
source: "damageSource",
},
frequent: true,
filter: function (event, player, name) {
if (name == "damageEnd") return true;
var evt = event.getParent();
if (evt.player != player) return false;
return evt.card && evt.type == "card" && evt.targets.length == 1;
},
content: function () {
"step 0";
player.draw();
"step 1";
var hs = player.getCards("he");
if (hs.length > 0) {
if (hs.length == 1) event._result = { bool: true, cards: hs };
else player.chooseCard("he", true, "选择一张牌作为");
} else event.finish();
"step 2";
if (result.bool) {
var cs = result.cards;
player.addToExpansion(cs, player, "give").gaintag.add("zyquanji");
}
},
intro: {
content: "expansion",
markcount: "expansion",
},
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
locked: false,
mod: {
maxHandcard: function (player, num) {
return num + player.getExpansions("zyquanji").length;
},
},
},
zypaiyi: {
audio: "gzpaiyi",
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.getExpansions("zyquanji").length > 0;
},
chooseButton: {
dialog: function (event, player) {
return ui.create.dialog("排异", player.getExpansions("zyquanji"), "hidden");
},
backup: function (links, player) {
return {
audio: "gzpaiyi",
filterTarget: true,
filterCard: function () {
return false;
},
selectCard: -1,
card: links[0],
delay: false,
content: lib.skill.zypaiyi.contentx,
ai: {
order: 10,
result: {
target: function (player, target) {
if (target != player) return 0;
if (
player.getExpansions("zyquanji").length <= 1 ||
(player.needsToDiscard() &&
!player.getEquip("zhuge") &&
!player.hasSkill("new_paoxiao"))
)
return 0;
return 1;
},
},
},
};
},
prompt: function () {
return "请选择排异的目标";
},
},
contentx: function () {
"step 0";
var card = lib.skill.zypaiyi_backup.card;
player.loseToDiscardpile(card);
"step 1";
var num = player.getExpansions("zyquanji").length;
if (num > 0) target.draw(Math.min(7, num));
"step 2";
if (target.countCards("h") > player.countCards("h")) {
target.damage();
}
},
ai: {
order: function (item, player) {
var num = player.getExpansions("zyquanji").length;
if (num == 1) return 8;
return 1;
},
result: {
player: 1,
},
combo: "zyquanji"
},
},
//孙綝
zyshilu: {
audio: "gzshilu",
preHidden: true,
trigger: { global: "dieAfter" },
prompt2: function (event, player) {
return (
"将其的所有武将牌" +
(player == event.source ? "及武将牌库里的一张随机武将牌" : "") +
"置于武将牌上作为"
);
},
logTarget: "player",
content: function () {
var list = [],
target = trigger.player;
if (
target.name1 &&
!target.isUnseen(0) &&
target.name1.indexOf("gz_shibing") != 0 &&
_status.characterlist.includes(target.name1)
)
list.push(target.name1);
if (
target.name2 &&
!target.isUnseen(1) &&
target.name2.indexOf("gz_shibing") != 0 &&
_status.characterlist.includes(target.name1)
)
list.push(target.name2);
_status.characterlist.removeArray(list);
if (player == trigger.source) list.addArray(_status.characterlist.randomRemove(1));
if (list.length) {
player.markAuto("zyshilu", list);
game.log(player, "", "#g" + get.translation(list), "置于武将牌上作为", "#y");
game.broadcastAll(
function (player, list) {
var cards = [];
for (var i = 0; i < list.length; i++) {
var cardname = "huashen_card_" + list[i];
lib.card[cardname] = {
fullimage: true,
image: "character:" + list[i],
};
lib.translate[cardname] = get.rawName2(list[i]);
cards.push(game.createCard(cardname, "", ""));
}
player.$draw(cards, "nobroadcast");
},
player,
list
);
}
},
marktext: "",
intro: {
content: "character",
onunmark: function (storage, player) {
if (storage && storage.length) {
_status.characterlist.addArray(storage);
storage.length = 0;
}
},
mark: function (dialog, storage, player) {
if (storage && storage.length) {
dialog.addSmall([storage, "character"]);
} else {
return "没有";
}
},
// content:function(storage,player){
// return '共有'+get.cnNumber(storage.length)+'张“戮”';
// },
},
group: "zyshilu_zhiheng",
subSkill: {
zhiheng: {
audio: "zyshilu",
trigger: { player: "phaseZhunbeiBegin" },
filter: function (event, player) {
return player.getStorage("zyshilu").length > 0 && player.countCards("he") > 0;
},
direct: true,
content: function () {
"step 0";
var num = Math.min(player.getStorage("zyshilu").length, player.countCards("he"));
player.chooseToDiscard(
"he",
get.prompt("zyshilu"),
"弃置至多" + get.cnNumber(num) + "张牌并摸等量的牌",
[1, num]
).logSkill = "zyshilu_zhiheng";
"step 1";
if (result.bool && result.cards && result.cards.length)
player.draw(result.cards.length);
},
},
},
},
zyxiongnve: {
audio: "gzxiongnve",
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return player.getStorage("zyshilu").length > 0;
},
content: function () {
"step 0";
player
.chooseButton([get.prompt("zyxiongnve"), [player.storage.zyshilu, "character"]])
.set("ai", function (button) {
if (!_status.event.goon) return 0;
return 1;
})
.set(
"goon",
player.countCards("hs", function (card) {
return get.tag(card, "damage") && player.hasValueTarget(card);
}) > 1
);
"step 1";
if (result.bool) {
player.logSkill("zyxiongnve");
lib.skill.zyxiongnve.throwCharacter(player, result.links);
game.delayx();
player
.chooseControl()
.set("prompt", "选择获得一项效果")
.set("choiceList", [
"本回合造成的伤害+1",
"本回合造成伤害时获得其一张牌",
"本回合使用牌没有次数限制",
])
.set("ai", function () {
var player = _status.event.player;
if (
player.countCards("hs", function (card) {
return get.name(card) == "sha" && player.hasValueTarget(card);
}) > player.getCardUsable("sha")
)
return 0;
return get.rand(1, 2);
});
} else event.finish();
"step 2";
var skill = "zyxiongnve_effect" + result.index;
player.addTempSkill(skill);
game.log(player, "本回合", "#g" + lib.skill[skill].promptx);
},
group: "zyxiongnve_end",
throwCharacter: function (player, list) {
player.unmarkAuto("zyshilu", list);
_status.characterlist.addArray(list);
game.log(player, "", "#y", "中移去了", "#g" + get.translation(list));
game.broadcastAll(
function (player, list) {
var cards = [];
for (var i = 0; i < list.length; i++) {
var cardname = "huashen_card_" + list[i];
lib.card[cardname] = {
fullimage: true,
image: "character:" + list[i],
};
lib.translate[cardname] = get.rawName2(list[i]);
cards.push(game.createCard(cardname, "", ""));
}
player.$throw(cards, 1000, "nobroadcast");
},
player,
list
);
},
subSkill: {
effect0: {
promptx: "造成的伤害+1",
charlotte: true,
onremove: true,
audio: "zyxiongnve",
intro: {
content: "当你造成伤害时此伤害+1",
},
trigger: { source: "damageBegin1" },
forced: true,
logTarget: "player",
content: function () {
trigger.num++;
},
},
effect1: {
promptx: "造成伤害后获得其一张牌",
charlotte: true,
onremove: true,
audio: "zyxiongnve",
intro: {
content: "对其他角色造成伤害时获得其一张牌",
},
trigger: { source: "damageBegin1" },
forced: true,
filter: function (event, player) {
return (
player != event.player && event.player.countGainableCards(player, "he") > 0
);
},
logTarget: "player",
content: function () {
player.gainPlayerCard(trigger.player, true, "he");
},
},
effect2: {
promptx: "使用牌没有次数限制",
charlotte: true,
onremove: true,
intro: {
content: "使用牌没有次数限制",
},
mod: {
cardUsable: () => Infinity,
},
},
effect3: {
charlotte: true,
audio: "zyxiongnve",
mark: true,
intro: {
content: "受到的伤害-1",
},
trigger: { player: "damageBegin4" },
forced: true,
filter: function (event, player) {
return event.source != player && event.source && event.source.isIn();
},
content: function () {
trigger.num--;
},
ai: {
effect: {
target: function (card, player, target) {
if (player.hasSkillTag("jueqing", false, target)) return;
var num = get.tag(card, "damage");
if (num) {
if (num > 1) return 0.5;
return 0;
}
},
},
},
},
end: {
trigger: { player: "phaseUseEnd" },
direct: true,
filter: function (event, player) {
return player.getStorage("zyshilu").length > 1;
},
content: function () {
"step 0";
player
.chooseButton(
[
"凶虐是否移去两张获得减伤",
[player.storage.zyshilu, "character"],
],
2
)
.set("ai", function (button) {
var player = _status.event.player;
if (game.countPlayer() * 1.5 + player.storage.zyshilu.length / 2 > 8)
return 1;
if (player.hp <= 2) return 1;
return 0;
});
"step 1";
if (result.bool) {
player.logSkill("zyxiongnve");
lib.skill.zyxiongnve.throwCharacter(player, result.links);
player.addTempSkill("zyxiongnve_effect3", { player: "phaseBegin" });
game.delayx();
}
},
},
},
ai: {
combo: "zyshilu",
},
},
//孟达
qiuan: {
audio: 2,
trigger: { player: "damageBegin4" },
filter: function (event, player) {
return (
event.cards &&
event.cards.filterInD().length > 0 &&
!player.getExpansions("qiuan").length
);
},
check: function (event, player) {
if (get.damageEffect(player, event.source || player, player, event.nature) >= 0)
return false;
return true;
},
preHidden: true,
content: function () {
var cards = trigger.cards.filterInD();
player.addToExpansion("gain2", cards).gaintag.add("qiuan");
trigger.cancel();
},
ai: {
combo: "liangfan",
},
intro: {
content: "expansion",
markcount: "expansion",
},
marktext: "",
},
liangfan: {
audio: 2,
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
filter: function (event, player) {
return player.getExpansions("qiuan").length > 0;
},
content: function () {
"step 0";
var cards = player.getExpansions("qiuan");
player.gain(cards, "gain2").gaintag.add("liangfan");
player.addTempSkill("liangfan2");
"step 1";
player.loseHp();
},
ai: {
combo: "qiuan",
},
},
liangfan2: {
audio: "liangfan",
mark: true,
mod: {
aiOrder: function (player, card, num) {
if (get.itemtype(card) == "card" && card.hasGaintag("liangfan")) return num + 0.1;
},
},
intro: { content: "使用量反牌造成伤害后可获得目标角色的一张牌" },
trigger: { source: "damageEnd" },
logTarget: "player",
charlotte: true,
onremove: function (player) {
player.removeGaintag("liangfan");
},
prompt: (event) => "量反是否获得" + get.translation(event.player) + "的一张牌",
filter: function (event, player) {
var evt = event.getParent(2);
if (evt.name != "useCard" || evt.card != event.card) return false;
if (!event.player.countGainableCards(player, "he")) return false;
return (
player.getHistory("lose", function (evt2) {
if (evt2.getParent() != evt) return false;
for (var i in evt2.gaintag_map) {
if (evt2.gaintag_map[i].includes("liangfan")) return true;
}
return false;
}).length > 0
);
},
marktext: "",
content: function () {
player.gainPlayerCard(trigger.player, true, "he");
},
},
//文钦
gzjinfa: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return (
player.countCards("he") > 0 &&
game.hasPlayer(function (current) {
return current != player && current.countCards("he") > 0;
})
);
},
filterCard: true,
position: "he",
filterTarget: function (card, player, target) {
return target != player && target.countCards("he") > 0;
},
check: function (card) {
return 6 - get.value(card);
},
content: function () {
"step 0";
target
.chooseCard(
"he",
"交给" + get.translation(player) + "一张装备牌或令其获得你的一张牌",
{ type: "equip" }
)
.set("ai", function (card) {
if (_status.event.goon && get.suit(card) == "spade") return 8 - get.value(card);
return 5 - get.value(card);
})
.set(
"goon",
target.canUse("sha", player, false) &&
get.effect(player, { name: "sha" }, target, target) > 0
);
"step 1";
if (!result.bool) {
player.gainPlayerCard(target, "he", true);
event.finish();
} else target.give(result.cards, player);
"step 2";
if (
result.bool &&
result.cards &&
result.cards.length &&
target.isIn() &&
player.isIn() &&
get.suit(result.cards[0], target) == "spade" &&
target.canUse("sha", player, false)
)
target.useCard({ name: "sha", isCard: true }, false, player);
},
ai: {
order: 6,
result: {
player: function (player, target) {
if (
target.countCards("e", function (card) {
return get.suit(card) == "spade" && get.value(card) < 8;
}) &&
target.canUse("sha", player, false)
)
return get.effect(player, { name: "sha" }, target, player);
return 0;
},
target: function (player, target) {
var es = target.getCards("e").sort(function (a, b) {
return get.value(b, target) - get.value(a, target);
});
if (es.length) return -Math.min(2, get.value(es[0]));
return -2;
},
},
},
},
//一战成名·群雄逐鹿·长安之战专属神贾诩
zybishi: {
audio: 2,
trigger: { target: "useCardToTargeted" },
filter: function (event, player) {
return event.card.name == "sha" && event.player != player;
},
check: function (event, player) {
var effect = 0;
if (event.targets && event.targets.length) {
for (var i = 0; i < event.targets.length; i++) {
effect += get.effect(event.targets[i], event.card, event.player, player);
}
}
if (effect < 0) {
var target = event.targets[0];
if (target == player) {
return !player.countCards("h", "shan");
} else {
return target.hp == 1 || (target.countCards("h") <= 2 && target.hp <= 2);
}
}
return false;
},
content: function () {
player.line(trigger.player, "green");
trigger.player.draw();
var evt = trigger.getParent();
evt.targets.length = 0;
evt.all_excluded = true;
game.log(evt.card, "被无效了");
},
},
zyjianbing: {
audio: 2,
trigger: { global: "damageBegin3" },
logTarget: "player",
filter: function (event, player) {
return (
event.player != player &&
event.player.isIn() &&
event.card &&
event.card.name == "sha" &&
event.player.countGainableCards(player, "he") > 0
);
},
content: function () {
"step 0";
player.gainPlayerCard(trigger.player, true, "he");
"step 1";
if (result.bool && result.cards && result.cards.length) {
var card = result.cards[0];
if (get.suit(card, trigger.player) == "heart") {
trigger.player.recover();
}
}
},
},
//战役篇改王允
zylianji: {
audio: "wylianji",
trigger: { player: "phaseUseEnd" },
filter: function (event, player) {
return player.hasHistory("useCard", (evt) => evt.getParent("phaseUse") == event);
},
direct: true,
content: function () {
"step 0";
var types = [];
player.getHistory("useCard", (evt) => {
if (evt.getParent("phaseUse") != trigger) return false;
types.add(get.type2(evt.card));
});
event.num = types.length;
event.logged = false;
player.chooseTarget(get.prompt("zylianji"), "令一名角色摸一张牌").set("ai", (target) => {
var player = _status.event.player;
if (target == player && player.needsToDiscard(1)) return 1;
return get.effect(target, { name: "draw" }, player, player);
});
"step 1";
if (result.bool) {
var target = result.targets[0];
if (!event.logged) {
event.logged = true;
player.logSkill("zylianji", target);
}
target.draw();
}
if (event.num <= 1) event.finish();
"step 2";
if (player.isHealthy()) event._result = { bool: false };
else player.chooseBool(get.prompt("zylianji"), "回复1点体力").set("ai", () => true);
"step 3";
if (result.bool) {
if (!event.logged) {
event.logged = true;
player.logSkill("zylianji");
}
player.recover();
}
if (event.num <= 2) event.finish();
"step 4";
player
.chooseTarget(
get.prompt("zylianji"),
"跳过本回合的剩余阶段然后令一名其他角色执行这些阶段",
lib.filter.notMe
)
.set("ai", (target) => {
var att = get.attitude(_status.event.player, target),
num = target.needsToDiscard(),
numx = player.needsToDiscard();
if (att < 0 && num > 0) return (-att * Math.sqrt(num)) / 3 + numx;
var skills = target.getSkills();
var val = 0;
for (var skill of skills) {
var info = get.info(skill);
if (
info.trigger &&
info.trigger.player &&
(info.trigger.player.indexOf("phaseJieshu") == 0 ||
(Array.isArray(info.trigger.player) &&
info.trigger.player.some((i) => i.indexOf("phaseJieshu") == 0)))
) {
var threaten = info.ai && info.ai.threaten ? info.ai.threaten : 1;
if (info.ai && info.ai.neg) val -= 3 * threaten;
else if (info.ai && info.ai.halfneg) val -= 1.5 * threaten;
else val += threaten;
}
}
return (att * val) / 2 + numx;
});
"step 5";
if (result.bool) {
var target = result.targets[0];
if (!event.logged) {
event.logged = true;
player.logSkill("zylianji", target);
} else player.line(target);
player.addTempSkill("zylianji_skip");
player.storage.zylianji_insert = target;
}
},
subSkill: {
skip: {
trigger: {
player: [
"phaseZhunbeiBefore",
"phaseJudgeBefore",
"phaseDrawBefore",
"phaseUseBefore",
"phaseDiscardBefore",
"phaseJieshuBefore",
],
},
init: function (player) {
if (!player.storage.zylianji_skip) player.storage.zylianji_skip = [];
},
forced: true,
charlotte: true,
group: "zylianji_insert",
onremove: true,
content: function () {
trigger.cancel();
player.storage.zylianji_skip.push(trigger.name);
},
},
insert: {
trigger: { player: "phaseEnd" },
filter: function (event, player) {
return (
player.storage.zylianji_skip &&
player.storage.zylianji_skip.length &&
player.storage.zylianji_insert &&
player.storage.zylianji_insert.isIn()
);
},
forced: true,
charlotte: true,
onremove: true,
getStr: function (str) {
switch (str) {
case "phaseDraw":
return "player.phaseDraw();if(!player.noPhaseDelay){if(player==game.me){game.delay()}else{game.delayx()}}";
case "phaseDiscard":
return "game.broadcastAll(function(){if(ui.tempnowuxie){ui.tempnowuxie.close();delete ui.tempnowuxie;}});player.phaseDiscard();if(!player.noPhaseDelay){game.delayx()};delete player._noSkill;";
default:
return "player." + str + "();";
}
},
content: function () {
"step 0";
var func = "";
for (var i = 0; i < player.storage.zylianji_skip.length; i++) {
var phase = player.storage.zylianji_skip[i];
func += "\n'step" + " " + i + "'\n";
func += lib.skill.zylianji_insert.getStr(phase);
}
player.line(player.storage.zylianji_insert);
player.storage.zylianji_insert
.insertPhase()
.setContent(new Function(func))._noTurnOver = true;
},
},
},
},
zymoucheng: {
enable: "phaseUse",
usable: 1,
viewAs: { name: "jiedao" },
filterCard: { color: "black" },
position: "he",
check: function (card) {
return 4.5 - get.value(card);
},
},
//用间篇豪华版盒子甄姬
yjluoshen: {
audio: "luoshen",
trigger: { player: "phaseZhunbeiBegin" },
frequent: true,
content: function () {
"step 0";
event.cards = [];
"step 1";
var next = player.judge(function (card) {
var color = get.color(card);
var evt = _status.event.getParent("yjluoshen");
if (evt) {
if (!evt.color) evt.color = color;
else if (evt.color != color) return -1;
}
return 1;
});
next.judge2 = function (result) {
return result.bool;
};
if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge"))
next.set("callback", function () {
if (get.position(card, true) == "o") player.gain(card, "gain2");
});
else
next.set("callback", function () {
event.getParent().orderingCards.remove(card);
});
"step 2";
if (result.judge > 0) {
event.cards.push(result.card);
player.chooseBool("是否再次发动洛神").set("frequentSkill", "yjluoshen");
} else {
for (var i = 0; i < event.cards.length; i++) {
if (get.position(event.cards[i], true) != "o") {
event.cards.splice(i, 1);
i--;
}
}
if (event.cards.length) {
player.gain(event.cards, "gain2");
}
event.finish();
}
"step 3";
if (result.bool) {
event.goto(1);
} else {
if (event.cards.length) {
player.gain(event.cards, "gain2");
}
}
},
},
//用间篇豪华版盒子贾诩
yjzhenlve: {
audio: "zhenlue",
inherit: "zhenlue",
content: function () {
trigger.directHit.addArray(game.players);
},
},
yjjianshu: {
audio: "jianshu",
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.countCards("h") > 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;
},
filterCard: true,
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,
targetprompt: ["发起者", "拼点对象"],
multitarget: true,
content: function () {
"step 0";
player.give(cards, targets[0], "give");
"step 1";
targets[0].chooseToCompare(targets[1]);
"step 2";
if (result.bool) {
targets[1].loseHp();
} else if (result.tie) {
targets[0].loseHp();
targets[1].loseHp();
} else {
targets[0].loseHp();
}
},
ai: {
expose: 0.4,
order: 4,
result: {
target: function (player, target) {
if (ui.selected.targets.length) return -1;
return -0.5;
},
},
},
},
yjyongdi: {
audio: "yongdi",
unique: true,
limited: true,
trigger: { player: "phaseZhunbeiBegin" },
animationColor: "thunder",
skillAnimation: "legend",
mark: true,
intro: {
content: "limited",
},
direct: true,
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("yjyongdi"), function (card, player, target) {
return target.hasSex("male") || target.name == "key_yuri";
})
.set("ai", function (target) {
if (!_status.event.goon) return 0;
var player = _status.event.player;
var att = get.attitude(player, target);
if (att <= 1) return 0;
var mode = get.mode();
if (mode == "identity" || (mode == "versus" && _status.mode == "four")) {
if (target.name && lib.character[target.name]) {
for (var i = 0; i < lib.character[target.name][3].length; i++) {
if (lib.skill[lib.character[target.name][3][i]].zhuSkill) {
return att * 2;
}
}
}
}
return att;
})
.set("goon", !player.hasUnknown());
"step 1";
if (result.bool) {
player.awakenSkill("yjyongdi");
player.logSkill("yjyongdi", result.targets);
var target = result.targets[0];
target.gainMaxHp(true);
target.recover();
var mode = get.mode();
if (
mode == "identity" ||
(mode == "versus" && _status.mode == "four") ||
mode == "doudizhu"
) {
if (target.name && lib.character[target.name]) {
var skills = lib.character[target.name][3];
target.storage.zhuSkill_yjyongdi = [];
for (var i = 0; i < skills.length; i++) {
var info = lib.skill[skills[i]];
if (info.zhuSkill) {
target.storage.zhuSkill_yjyongdi.push(skills[i]);
if (info.init) {
info.init(target);
}
if (info.init2) {
info.init2(target);
}
}
}
}
}
}
},
ai: {
expose: 0.2,
},
},
//用间篇豪华版盒子许攸
yjshicai: {
audio: "spshicai",
enable: "phaseUse",
usable: 1,
filterCard: true,
position: "he",
prompt: function () {
var str = "弃置一张牌然后获得";
if (get.itemtype(_status.pileTop) == "card") str += get.translation(_status.pileTop);
else str += "牌堆顶的一张牌";
return str;
},
check: function (card) {
var player = _status.event.player;
var cardx = _status.pileTop;
if (get.itemtype(cardx) != "card") return 0;
var val = player.getUseValue(cardx, null, true);
if (!val) return 0;
var val2 = player.getUseValue(card, null, true);
return (val - val2) / Math.max(0.1, get.value(card));
},
group: ["yjshicai_mark"],
content: function () {
var card = get.cards()[0];
player.gain(card, "gain2").gaintag.add("yjshicai_clear");
player.addTempSkill("yjshicai_clear", "phaseUseAfter");
},
ai: {
order: 3,
result: { player: 1 },
},
subSkill: {
mark: {
trigger: { player: "phaseBegin" },
silent: true,
firstDo: true,
content: function () {
player.addTempSkill("spshicai2");
},
},
clear: {
trigger: {
player: "loseAfter",
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
onremove: function (player, skill) {
player.removeGaintag(skill);
},
forced: true,
charlotte: true,
popup: false,
filter: function (event, player) {
if (event.name == "lose") {
for (var i in event.gaintag_map) {
if (event.gaintag_map[i].includes("yjshicai_clear")) return true;
}
return false;
}
return player.hasHistory("lose", function (evt) {
if (evt.getParent() != event) return false;
for (var i in evt.gaintag_map) {
if (evt.gaintag_map[i].includes("yjshicai_clear")) return true;
}
});
},
content: function () {
delete player.getStat("skill").yjshicai;
},
},
},
},
yjchenggong: {
audio: "chenggong",
trigger: {
global: "useCardToPlayered",
},
filter: function (event, player) {
return event.isFirstTarget && event.targets.length > 1 && event.player.isIn();
},
check: function (event, player) {
return get.attitude(player, event.player) > 0;
},
logTarget: "player",
content: function () {
trigger.player.draw();
},
ai: { expose: 0.2 },
},
yjzezhu: {
audio: "zezhu",
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
var zhu =
get.mode() == "identity"
? get.zhu(player)
: game.filterPlayer((i) => i.getSeatNum() == 1)[0];
if (!zhu) return false;
return zhu.countGainableCards(player, zhu == player ? "ej" : "hej");
},
filterTarget: function (card, player, target) {
var zhu =
get.mode() == "identity"
? get.zhu(player)
: game.filterPlayer((i) => i.getSeatNum() == 1)[0];
return target == zhu;
},
selectTarget: 1,
content: function () {
"step 0";
player.gainPlayerCard(target, player == target ? "ej" : "hej", true);
"step 1";
if (!player.countCards("he") || player == target) event.finish();
else player.chooseCard("择主交给" + get.translation(target) + "一张牌", "he", true);
"step 2";
player.give(result.cards, target);
},
ai: {
order: 2.9,
result: { player: 1 },
},
},
//用间beta董卓
yjtuicheng: {
audio: 2,
enable: "phaseUse",
viewAs: { name: "tuixinzhifu", isCard: true },
filterCard: () => false,
selectCard: -1,
log: false,
precontent: function () {
player.logSkill("yjtuicheng");
player.loseHp();
},
ai: {
effect: {
player: function (card, player) {
if (get.name(card) != "tuixinzhifu" || _status.event.skill != "yjtuicheng")
return;
if (player.hp < 3) return "zeroplayertarget";
if (
player.hasSkill("yjshicha") &&
!player.hasHistory("useSkill", (evt) => evt.skill == "yjtuicheng")
)
return [1, 2];
return "zeroplayertarget";
},
},
},
},
yjyaoling: {
audio: 2,
trigger: {
player: "phaseUseEnd",
},
direct: true,
content: function () {
"step 0";
player
.chooseTarget(
get.prompt("yjyaoling"),
"减1点体力上限选择一名其他角色A和一名角色B令A选择对B使用杀或被你弃牌",
2,
(card, player, target) => {
if (!ui.selected.targets.length) return target != player;
return ui.selected.targets[0].canUse("sha", target, false);
}
)
.set("targetprompt", ["打人", "被打"])
.set("complexSelect", true)
.set("ai", (target) => {
var player = _status.event.player;
if (!ui.selected.targets.length)
return get.effect(target, { name: "guohe_copy2" }, player, player);
var targetx = ui.selected.targets[0];
return get.effect(target, { name: "sha" }, targetx, player) + 5;
});
"step 1";
if (result.bool) {
var targets = result.targets;
event.targets = targets;
player.logSkill("yjyaoling", targets, false);
player.line2(targets);
player.loseMaxHp();
targets[0]
.chooseToUse(function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
}, "耀令" +
get.translation(targets[1]) +
"使用一张杀或令" +
get.translation(player) +
"弃置你的一张牌")
.set("targetRequired", true)
.set("filterTarget", function (card, player, target) {
if (
target != _status.event.sourcex &&
!ui.selected.targets.includes(_status.event.sourcex)
)
return false;
return lib.filter.filterTarget.apply(this, arguments);
})
.set("sourcex", targets[1]);
} else event.finish();
"step 2";
if (!result.bool && targets[0].countDiscardableCards(player, "he")) {
player.discardPlayerCard(targets[0], "he", true);
}
},
},
yjshicha: {
audio: 2,
trigger: { player: "phaseDiscardBegin" },
forced: true,
filter: function (event, player) {
var tuicheng = false,
yaoling = false;
player.getHistory("useSkill", (evt) => {
if (evt.skill == "yjtuicheng") tuicheng = true;
if (evt.skill == "yjyaoling") yaoling = true;
});
return !(tuicheng && yaoling);
},
content: function () {
player.addTempSkill("yjshicha_limit");
},
subSkill: {
limit: {
charlotte: true,
mark: true,
intro: { content: "本回合手牌上限为1" },
mod: {
maxHandcard: () => 1,
},
},
},
ai: {
neg: true,
},
},
yjyongquan: {
audio: 2,
trigger: { player: "phaseJieshuBegin" },
zhuSkill: true,
filter: function (event, player) {
return (
player.hasZhuSkill("yjyongquan") &&
game.hasPlayer((current) => {
return current != player && player.hasZhuSkill(current) && current.group == "qun";
})
);
},
logTarget: function (event, player) {
return game.filterPlayer((current) => {
return current != player && player.hasZhuSkill(current) && current.group == "qun";
});
},
content: function () {
"step 0";
var targets = lib.skill.yjyongquan.logTarget(trigger, player);
event.targets = targets;
"step 1";
var target = targets.shift();
event.target = target;
target
.chooseCard("拥权是否交给" + get.translation(player) + "一张牌", "he")
.set("ai", (card) => {
if (_status.event.goon) return 4.5 - get.value(card);
return 0;
})
.set("goon", get.attitude(target, player) > 3);
"step 2";
if (result.bool) {
target.line(player);
target.give(result.cards, player);
}
"step 3";
if (targets.length) event.goto(1);
},
},
//用间beta甘宁的新版
yjjielve: {
audio: 2,
enable: "phaseUse",
filter: function (event, player) {
return !player.hasSkill("yjjielve_ban");
},
viewAs: { name: "chenghuodajie" },
filterCard: function (card, player) {
if (ui.selected.cards.length) return get.color(card) == get.color(ui.selected.cards[0]);
var cards = player.getCards("hes");
for (var cardx of cards) {
if (card != cardx && get.color(card) == get.color(cardx)) return true;
}
return false;
},
position: "hes",
selectCard: 2,
complexCard: true,
check: function (card) {
return 5 - get.value(card);
},
onuse: function (links, player) {
player.addTempSkill("yjjielve_check");
},
subSkill: {
check: {
trigger: { source: "damageSource" },
forced: true,
charlotte: true,
popup: false,
filter: function (event, player) {
return (
event.card &&
event.card.name == "chenghuodajie" &&
event.getParent().skill == "yjjielve"
);
},
content: function () {
player.addTempSkill("yjjielve_ban");
},
},
ban: { charlotte: true },
},
},
//用间beta张飞
yjmangji: {
audio: 2,
forced: true,
trigger: {
player: ["loseAfter", "damageEnd", "loseHpEnd", "recoverEnd"],
global: [
"equipAfter",
"addJudgeAfter",
"gainAfter",
"loseAsyncAfter",
"addToExpansionAfter",
],
},
direct: true,
filter: function (event, player) {
if (player.hp < 1 || !player.countDiscardableCards(player, "h")) return false;
if (["damage", "loseHp", "recover"].includes(event.name)) return true;
var evt = event.getl(player);
if (event.name == "equip" && event.player == player) return !evt || evt.cards.length != 1;
if (!evt || !evt.es.length) return false;
return game.hasPlayer((current) => player.canUse("sha", current, false));
},
content: function () {
"step 0";
player.chooseCardTarget({
prompt: "莽击弃置一张手牌视为对一名其他角色使用一张",
forced: true,
filterCard: lib.filter.cardDiscardable,
filterTarget: function (card, player, target) {
return player.canUse("sha", target, false);
},
ai2: function (target) {
return get.effect(target, { name: "sha" }, _status.event.player);
},
});
"step 1";
if (result.bool) {
var target = result.targets[0],
cards = result.cards;
player.logSkill("yjmangji", target);
player.discard(cards);
if (player.canUse("sha", target, false))
player.useCard({ name: "sha", isCard: true }, target, false);
}
},
},
//用间beta曹洪
yjlifeng: {
audio: 2,
enable: "phaseUse",
usable: 1,
locked: false,
filter: function (event, player) {
for (var card of ui.discardPile.childNodes) {
if (get.type(card) == "equip") return true;
}
return false;
},
content: function () {
"step 0";
var cards = Array.from(ui.discardPile.childNodes).filter((i) => get.type(i) == "equip");
player
.chooseButton(["厉锋获得一张装备牌", cards], cards.length > 0)
.set("ai", get.buttonValue);
"step 1";
if (result.bool) {
var card = result.links[0];
player.gain(card, "gain2");
}
},
ai: {
order: 10,
result: { player: 1 },
effect: {
target: function (card, player, target) {
if (card && get.type(card) == "equip" && _status.event.skill == "_gifting")
return 0;
},
},
},
mod: {
cardGiftable: function (card, player) {
return get.type(card) == "equip";
},
},
},
//用间篇李儒
yjdumou: {
audio: 2,
forced: true,
mod: {
cardname: function (card, player, name) {
if (player == _status.currentPhase && card.name == "du") return "guohe";
},
aiValue: function (player, card, num) {
if (card.name == "du") return get.value({ name: "guohe" });
},
},
init: () => {
game.addGlobalSkill("yjdumou_du");
},
onremove: () => {
if (!game.hasPlayer((i) => i.hasSkill("yjdumou"), true))
game.removeGlobalSkill("yjdumou_du");
},
subSkill: {
du: {
mod: {
cardname: function (card, player, name) {
if (
_status.currentPhase &&
player != _status.currentPhase &&
_status.currentPhase.hasSkill("yjdumou") &&
get.color(card) == "black"
)
return "du";
},
aiValue: function (player, card, num) {
if (get.name(card) == "du" && card.name != "du")
return get.value({ name: card.name });
},
},
trigger: { player: "dieAfter" },
filter: () => {
return !game.hasPlayer((i) => i.hasSkill("yjdumou"), true);
},
silent: true,
forceDie: true,
content: () => {
game.removeGlobalSkill("yjdumou_du");
},
},
},
ai: { threaten: 2.1 },
},
yjweiquan: {
audio: 2,
enable: "phaseUse",
skillAnimation: true,
animationColor: "soil",
filterTarget: true,
limited: true,
selectTarget: () => [1, game.roundNumber],
contentBefore: function () {
"step 0";
player.awakenSkill("yjweiquan");
player.chooseTarget("威权选择获得牌的角色", true).set("ai", (target) => {
var att = get.attitude(_status.event.player, target),
num = target.needsToDiscard(
targets.filter((i) => i != target && i.countCards("h")).length
);
if (att > 0 && num <= 2) return 0;
if (att < 0 && target.needsToDiscard(-5)) return -att - Math.sqrt(num);
return att - Math.sqrt(num);
});
"step 1";
event.getParent()._yjweiquan = result.targets[0];
},
content: function () {
"step 0";
var targetx = event.getParent()._yjweiquan;
if (target == targetx || !target.countCards("h")) event.finish();
else target.chooseCard("威权将一张手牌交给" + get.translation(targetx), true);
"step 1";
if (result.bool) {
var targetx = event.getParent()._yjweiquan;
target.give(result.cards, targetx);
}
},
contentAfter: function () {
var targetx = event.getParent()._yjweiquan;
if (targetx.countCards("h") > targetx.hp) {
var next = targetx.phase();
event.next.remove(next);
event.getParent().after.push(next);
next.player = targetx;
next._noTurnOver = true;
next._triggered = null;
next.setContent(function () {
game.broadcastAll(function () {
if (ui.tempnowuxie) {
ui.tempnowuxie.close();
delete ui.tempnowuxie;
}
});
player.phaseDiscard();
if (!player.noPhaseDelay) game.delayx();
delete player._noSkill;
});
}
},
ai: {
order: 6,
result: {
player: function (player) {
var num = game.countPlayer(
(current) => get.attitude(player, current) < 0 && current.countCards("h")
);
if (
(game.roundNumber < num && player.hp > 2) ||
!game.hasPlayer((current) => {
return (
(get.attitude(player, current) > 0 &&
current.needsToDiscard(num) < 2) ||
(get.attitude(player, current) < 0 && current.needsToDiscard(-5))
);
})
)
return -10;
return 1;
},
target: -1,
},
},
},
yjrenwang: {
audio: 2,
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
for (var card of ui.discardPile.childNodes) {
if (get.color(card) == "black" && get.type(card) == "basic") return true;
}
return false;
},
content: function () {
"step 0";
var cards = Array.from(ui.discardPile.childNodes).filter(
(i) => get.color(i) == "black" && get.type(i) == "basic"
);
player
.chooseButton(["人望选择一张黑色基本牌", cards], cards.length > 0)
.set("ai", get.buttonValue);
"step 1";
if (result.bool) {
var card = result.links[0];
event.card = card;
player
.chooseTarget("选择一名角色获得" + get.translation(card), true)
.set("ai", (target) => get.attitude(_status.event.player, target));
} else event.finish();
"step 2";
if (result.bool) {
var target = result.targets[0];
player.line(target);
target.gain(card, "gain2");
}
},
ai: {
order: 10,
result: { player: 1 },
},
},
//群曹操
yjxiandao: {
trigger: { player: "giftAccepted" },
usable: 1,
forced: true,
locked: false,
filter: (event, player) => event.target != player && event.target.isIn(),
logTarget: "target",
content: function () {
"step 0";
event.target = trigger.target;
event.card = trigger.card;
event.target.markAuto("yjxiandao_block", [get.suit(event.card, false)]);
event.target.addTempSkill("yjxiandao_block");
"step 1";
var type = get.type(card, false);
if (type == "trick") player.draw(2);
if (type == "equip") {
if (
target.countGainableCards(player, "he", function (cardx) {
return cardx != card;
}) > 0
)
player
.gainPlayerCard(target, "he", true)
.set("card", card)
.set("filterButton", function (button) {
return button.link != _status.event.card;
});
if (get.subtype(card, false) == "equip1") target.damage();
}
},
subSkill: {
block: {
charlotte: true,
onremove: true,
mod: {
cardEnabled: function (card, player) {
if (player.getStorage("yjxiandao_block").includes(get.suit(card)))
return false;
},
cardRespondable: function (card, player) {
if (player.getStorage("yjxiandao_block").includes(get.suit(card)))
return false;
},
cardSavable: function (card, player) {
if (player.getStorage("yjxiandao_block").includes(get.suit(card)))
return false;
},
},
mark: true,
intro: { content: "不能使用或打出$牌" },
},
},
},
yjsancai: {
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return player.countCards("h") > 0;
},
content: function () {
"step 0";
player.showHandcards();
var hs = player.getCards("h");
if (hs.length > 1) {
var type = get.type2(hs[0], player);
for (var i = 1; i < hs.length; i++) {
if (get.type(hs[i]) != type) {
event.finish();
return;
}
}
}
"step 1";
player.chooseCardTarget({
prompt: "是否赠予一张手牌",
filterCard: true,
filterTarget: lib.filter.notMe,
});
"step 2";
if (result.bool) {
var target = result.targets[0];
player.line(target, "green");
player.gift(result.cards, target);
}
},
},
yjyibing: {
trigger: {
player: "gainAfter",
global: "loseAsyncAfter",
},
direct: true,
filter: function (event, player) {
if (event.getParent().name == "gift") return false;
if (event.getParent("yjyibing").player == player) return false;
var evt = event.getParent("phaseDraw"),
hs = player.getCards("h"),
cards = event.getg(player);
return (
cards.length > 0 &&
(!evt || evt.player != player) &&
cards.filter(function (card) {
return (
hs.includes(card) &&
game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false
);
}).length == cards.length &&
player.hasUseTarget(
{
name: "sha",
cards: event.cards,
},
false
)
);
},
content: function () {
var cards = trigger.getg(player);
player.chooseUseTarget(
get.prompt("yjyibing"),
"" + get.translation(cards) + "当做使用",
"sha",
cards,
false,
"nodistance"
).logSkill = "yjyibing";
},
},
//龙羽飞
longyi: {
enable: ["chooseToUse", "chooseToRespond"],
filter: function (event, player) {
if (event.type == "wuxie") return false;
var hs = player.getCards("h");
if (!hs.length) return false;
for (var i of hs) {
if (game.checkMod(i, player, "unchanged", "cardEnabled2", player) === false)
return false;
}
for (var i of lib.inpile) {
if (
i != "du" &&
get.type(i) == "basic" &&
event.filterCard({ name: i, cards: hs }, player, event)
)
return true;
if (i == "sha") {
var list = ["fire", "thunder", "ice"];
for (var j of list) {
if (event.filterCard({ name: i, nature: j, cards: hs }, player, event))
return true;
}
}
}
return false;
},
chooseButton: {
dialog: function (event, player) {
var vcards = [],
hs = player.getCards("h");
for (var i of lib.inpile) {
if (
i != "du" &&
get.type(i) == "basic" &&
event.filterCard({ name: i, cards: hs }, player, event)
)
vcards.push(["基本", "", i]);
if (i == "sha") {
for (var j of lib.inpile_nature) {
if (event.filterCard({ name: i, nature: j, cards: hs }, player, event))
vcards.push(["基本", "", i, j]);
}
}
}
return ui.create.dialog("龙裔", [vcards, "vcard"]);
},
check: function (button, player) {
if (_status.event.getParent().type != "phase") return 1;
return _status.event.player.getUseValue({
name: button.link[2],
nature: button.link[3],
});
},
backup: function (links, player) {
return {
audio: "longyi",
popname: true,
viewAs: { name: links[0][2], nature: links[0][3] },
filterCard: true,
selectCard: -1,
position: "h",
};
},
prompt: function (links, player) {
return (
"将所有手牌当做" +
(get.translation(links[0][3]) || "") +
get.translation(links[0][2]) +
"使用或打出"
);
},
},
hiddenCard: function (player, name) {
return name != "du" && get.type(name) == "basic" && player.countCards("h") > 0;
},
ai: {
respondSha: true,
respondShan: true,
skillTagFilter: function (player) {
return player.countCards("h") > 0;
},
order: 0.5,
result: {
player: function (player) {
if (_status.event.dying) {
return get.attitude(player, _status.event.dying);
}
if (_status.event.type == "respondShan") return 1;
var val = 0,
hs = player.getCards("h"),
max = 0;
for (var i of hs) {
val += get.value(i, player);
if (get.type(i, player) == "trick") max += 5;
}
if (player.hasSkill("zhenjue")) max += 7;
return val <= max ? 1 : 0;
},
},
},
group: "longyi_effect",
subSkill: {
effect: {
trigger: { player: ["useCard", "respond"] },
forced: true,
charlotte: true,
popup: false,
filter: function (event, player) {
if (event.skill != "longyi_backup") return false;
for (var i of event.cards) {
var type = get.type2(i, player);
if (type == "equip" || type == "trick") return true;
}
return false;
},
content: function () {
var map = {};
for (var i of trigger.cards) {
map[get.type2(i, player)] = true;
}
if (map.trick) player.draw();
if (map.equip && trigger.directHit) trigger.directHit.addArray(game.players);
},
},
backup: {},
},
},
zhenjue: {
trigger: { global: "phaseJieshuBegin" },
filter: function (event, player) {
return player.countCards("h") == 0;
},
logTarget: "player",
content: function () {
"step 0";
trigger.player
.chooseToDiscard("he", "弃置一张牌或令" + get.translation(player) + "摸一张牌")
.set("ai", function (card) {
if (_status.event.goon) return 7 - get.value(card);
return -get.value(card);
})
.set("goon", get.attitude(trigger.player, player) < 0);
"step 1";
if (!result.bool) player.draw();
},
},
//群刘备
jsprende: {
audio: "rerende",
enable: "phaseUse",
filterCard: true,
selectCard: [1, Infinity],
discard: false,
lose: false,
delay: false,
filterTarget: function (card, player, target) {
return player != target;
},
onremove: true,
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(2, player.countCards("h") - player.hp)) return 0;
if (
player.hp == player.maxHp ||
player.storage.jsprende < 0 ||
player.countCards("h") <= 1
) {
var players = game.filterPlayer();
for (var i = 0; i < players.length; i++) {
if (
players[i].hasSkill("haoshi") &&
!players[i].isTurnedOver() &&
!players[i].hasJudge("lebu") &&
get.attitude(player, players[i]) >= 3 &&
get.attitude(players[i], player) >= 3
) {
return 11 - get.value(card);
}
}
if (player.countCards("h") > player.hp) return 10 - get.value(card);
if (player.countCards("h") > 2) return 6 - get.value(card);
return -1;
}
return 10 - get.value(card);
},
content: function () {
"step 0";
var evt = _status.event.getParent("phaseUse");
if (evt && evt.name == "phaseUse" && !evt.jsprende) {
var next = game.createEvent("jsprende_clear");
_status.event.next.remove(next);
evt.after.push(next);
evt.jsprende = true;
next.player = player;
next.setContent(function () {
delete player.storage.jsprende;
});
}
player.give(cards, target);
if (typeof player.storage.jsprende != "number") {
player.storage.jsprende = 0;
}
if (player.storage.jsprende >= 0) {
player.storage.jsprende += cards.length;
if (player.storage.jsprende >= 2) {
var list = [];
if (
lib.filter.cardUsable(
{ name: "sha", isCard: true },
player,
event.getParent("chooseToUse")
) &&
game.hasPlayer(function (current) {
return player.canUse("sha", current);
})
) {
list.push(["基本", "", "sha"]);
}
for (var i of lib.inpile_nature) {
if (
lib.filter.cardUsable(
{ name: "sha", nature: i, isCard: true },
player,
event.getParent("chooseToUse")
) &&
game.hasPlayer(function (current) {
return player.canUse(
{ name: "sha", nature: i, isCard: true },
current
);
})
) {
list.push(["基本", "", "sha", i]);
}
}
if (
lib.filter.cardUsable(
{ name: "tao", isCard: true },
player,
event.getParent("chooseToUse")
) &&
game.hasPlayer(function (current) {
return player.canUse("tao", current);
})
) {
list.push(["基本", "", "tao"]);
}
if (
lib.filter.cardUsable(
{ name: "jiu", isCard: true },
player,
event.getParent("chooseToUse")
) &&
game.hasPlayer(function (current) {
return player.canUse("jiu", current);
})
) {
list.push(["基本", "", "jiu"]);
}
if (list.length) {
player
.chooseButton(["是否视为使用一张基本牌", [list, "vcard"]])
.set("ai", function (button) {
var player = _status.event.player;
var card = {
name: button.link[2],
nature: button.link[3],
isCard: true,
};
if (card.name == "tao") {
if (
player.hp == 1 ||
(player.hp == 2 && !player.hasShan()) ||
player.needsToDiscard()
) {
return 5;
}
return 1;
}
if (card.name == "sha") {
if (
game.hasPlayer(function (current) {
return (
player.canUse(card, current) &&
get.effect(current, card, player, player) > 0
);
})
) {
if (card.nature == "fire") return 2.95;
if (card.nature == "thunder" || card.nature == "ice")
return 2.92;
return 2.9;
}
return 0;
}
if (card.name == "jiu") {
return 0.5;
}
return 0;
});
} else {
event.finish();
}
player.storage.jsprende = -1;
} else {
event.finish();
}
} else {
event.finish();
}
"step 1";
if (result && result.bool && result.links[0]) {
var card = { name: result.links[0][2], nature: result.links[0][3], isCard: true };
player.chooseUseTarget(card, true);
}
},
ai: {
fireAttack: true,
order: function (skill, player) {
if (
player.hp < player.maxHp &&
player.storage.jsprende < 2 &&
player.countCards("h") > 1
) {
return 10;
}
return 4;
},
result: {
target: function (player, target) {
if (target.hasSkillTag("nogain")) return 0;
if (ui.selected.cards.length && ui.selected.cards[0].name == "du") {
if (target.hasSkillTag("nodu")) return 0;
return -10;
}
if (target.hasJudge("lebu")) return 0;
var nh = target.countCards("h");
var np = player.countCards("h");
if (
player.hp == player.maxHp ||
player.storage.jsprende < 0 ||
player.countCards("h") <= 1
) {
if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0;
}
return Math.max(1, 5 - nh);
},
},
effect: {
target: function (card, player, target) {
if (player == target && get.type(card) == "equip") {
if (player.countCards("e", { subtype: get.subtype(card) })) {
if (
game.hasPlayer(function (current) {
return current != player && get.attitude(player, current) > 0;
})
) {
return 0;
}
}
}
},
},
threaten: 0.8,
},
},
//曹安民
nskuishe: {
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return target != player && target.countCards("he") > 0;
},
content: function () {
"step 0";
player.choosePlayerCard(target, "he", true).set("ai", get.buttonValue);
"step 1";
if (result.bool) {
var card = result.cards[0];
event.card = card;
player
.chooseTarget(
"" +
get.translation(target) +
"" +
(get.position(card) == "h" &&
!player.hasSkillTag("viewHandcard", null, target, true)
? "手牌"
: get.translation(card)) +
"交给一名角色",
true,
function (target) {
return target != _status.event.getParent().target;
}
)
.set("ai", function (target) {
var att = get.attitude(_status.event.player, target);
if (_status.event.du) {
if (target.hasSkillTag("nodu")) return 0;
return -att;
}
if (target.hasSkillTag("nogain")) return 0.1;
if (att > 0) {
return att + Math.max(0, 5 - target.countCards("h"));
}
return att;
})
.set("du", event.card.name == "du");
} else event.finish();
"step 2";
if (result.bool) {
var target2 = result.targets[0];
target.line(target2, "green");
target2.gain(target, card, "giveAuto").giver = player;
} else event.finish();
"step 3";
target
.chooseToUse(function (card, player, event) {
if (get.name(card) != "sha") return false;
return lib.filter.filterCard.apply(this, arguments);
}, "是否对" + get.translation(player) + "使用一张杀")
.set("targetRequired", true)
.set("complexSelect", true)
.set("filterTarget", function (card, player, target) {
if (
target != _status.event.sourcex &&
!ui.selected.targets.includes(_status.event.sourcex)
)
return false;
return lib.filter.filterTarget.apply(this, arguments);
})
.set("sourcex", player);
},
ai: {
order: 6,
expose: 0.2,
result: {
target: -1.5,
player: function (player, target) {
if (!target.canUse("sha", player)) return 0;
if (target.countCards("h") == 1) return 0.1;
if (player.hasShan()) return -0.5;
if (player.hp <= 1) return -2;
if (player.hp <= 2) return -1;
return 0;
},
},
},
},
//文和乱武
nsyangwu: {
enable: "phaseUse",
usable: 1,
filterCard: { suit: "heart" },
filterTarget: function (card, player, target) {
return target != player && target.countCards("h") > player.countCards("h");
},
filter: function (event, player) {
var info = lib.skill.nsyangwu;
return (
player.countCards("h", info.filterCard) &&
game.hasPlayer(function (target) {
return info.filterTarget(null, player, target);
})
);
},
check: function (card) {
var num = 0;
var player = _status.event.player;
game.countPlayer(function (current) {
if (current != player && get.attitude(player, current) < 0)
num = Math.max(num, current.countCards("h") - player.countCards("h"));
});
return Math.ceil((num + 1) / 2) * 2 + 4 - get.value(card);
},
content: function () {
var num = Math.ceil((target.countCards("h") - player.countCards("h")) / 2);
if (num) player.gainPlayerCard(target, true, "h", num, "visible");
},
ai: {
order: 4,
result: {
target: function (player, target) {
return player.countCards("h") - target.countCards("h");
},
},
},
},
nslulve: {
enable: "phaseUse",
usable: 1,
filter: function (event, player) {
return game.hasPlayer(function (current) {
return (
current.countCards("e") > 0 && current.countCards("e") <= player.countCards("he")
);
});
},
filterCard: function () {
if (ui.selected.targets.length) return false;
return true;
},
position: "he",
selectCard: [1, Infinity],
complexSelect: true,
complexCard: true,
filterTarget: function (card, player, target) {
return (
target != player &&
target.countCards("e") > 0 &&
ui.selected.cards.length == target.countCards("e")
);
},
check: function (card) {
var player = _status.event.player;
if (
game.hasPlayer(function (current) {
return (
current != player &&
current.countCards("e") > 0 &&
ui.selected.cards.length == current.countCards("e") &&
get.damageEffect(current, player, player) > 0
);
})
)
return 0;
switch (ui.selected.cards.length) {
case 0:
return 8 - get.value(card);
case 1:
return 6 - get.value(card);
case 2:
return 3 - get.value(card);
default:
return 0;
}
},
content: function () {
target.damage("nocard");
},
ai: {
damage: true,
order: 2,
result: {
target: function (player, target) {
return get.damageEffect(target, player);
},
},
expose: 0.3,
},
},
nsfeixiong: {
trigger: { player: "phaseUseBegin" },
direct: true,
filter: function (event, player) {
return (
player.countCards("h") > 0 &&
game.hasPlayer(function (current) {
return current != player && player.canCompare(current);
})
);
},
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("nsfeixiong"), function (card, player, target) {
return player != target && player.canCompare(target);
})
.set("ai", function (target) {
var player = _status.event.player;
var hs = player.getCards("h").sort(function (a, b) {
return b.number - a.number;
});
var ts = target.getCards("h").sort(function (a, b) {
return b.number - a.number;
});
if (!hs.length || !ts.length) return 0;
if (hs[0].number > ts[0].number) return get.damageEffect(target, player, player);
return 0;
});
"step 1";
if (result.bool) {
var target = result.targets[0];
event.target = target;
player.logSkill("nsfeixiong", target);
if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2);
player.chooseToCompare(target);
} else event.finish();
"step 2";
if (!result.tie) {
var targets = [player, target];
if (result.bool) targets.reverse();
targets[0].damage(targets[1]);
}
},
},
nscesuan: {
trigger: { player: "damageBegin3" },
forced: true,
content: function () {
"step 0";
trigger.cancel();
event.lose = player.loseMaxHp();
"step 1";
if (event.lose && event.lose.loseHp) player.draw();
},
ai: {
halfneg: true,
filterDamage: true,
skillTagFilter: function (player, tag, arg) {
if (tag === "filterDamage" && arg && arg.player) {
if (arg.player.hasSkillTag("jueqing", false, player)) return false;
}
},
},
},
//S贾诩
nsyice: {
trigger: {
player: "loseAfter",
global: ["cardsDiscardAfter", "loseAsyncAfter"],
},
filter: function (event, player) {
if (event.name != "cardsDiscard") {
if (event.type != "discard") return false;
var evt = event.getl(player);
return evt.cards2 && evt.cards2.filterInD("d").length > 0;
} else {
var evt = event.getParent();
if (
evt.name != "orderingDiscard" ||
!evt.relatedEvent ||
evt.relatedEvent.player != player ||
!["useCard", "respond"].includes(evt.relatedEvent.name)
)
return false;
return event.cards.filterInD("d").length > 0;
}
},
forced: true,
content: function () {
"step 0";
var evt = trigger.getParent().relatedEvent;
if ((trigger.name == "discard" && !trigger.delay) || (evt && evt.name == "respond"))
game.delayx();
"step 1";
var cards;
if (trigger.getl) cards = trigger.getl(player).cards2.filterInD("d");
else cards = trigger.cards.filterInD("d");
if (cards.length == 1) event._result = { bool: true, links: cards };
else {
var dialog = [
"遗策选择要放置的卡牌",
'<div class="text center">(从左到右为从旧到新,后选择的后置入)</div>',
cards,
];
var cards2 = player.getExpansions("nsyice");
cards2.reverse();
if (cards2.length) {
dialog.push('<div class="text center">原有“策”</div>');
dialog.push(cards2);
}
player
.chooseButton(dialog, true, cards.length)
.set("filterButton", function (button) {
return _status.event.cards.includes(button.link);
})
.set("cards", cards);
}
"step 2";
player.addToExpansion(result.links, "gain2").gaintag.add("nsyice");
"step 3";
var storage = player.getExpansions("nsyice");
var bool = false;
for (var i = 0; i < storage.length; i++) {
for (var j = storage.length - 1; j > i; j--) {
if (get.number(storage[i]) == get.number(storage[j])) {
bool = true;
break;
}
}
if (bool) break;
}
if (bool) {
event.cards = storage.splice(i, j - i + 1);
} else event.finish();
"step 4";
var cardsx = [];
cardsx.push(cards.shift());
cardsx.push(cards.pop());
if (cards.length) player.gain(cards, "gain2");
event.cards = cardsx;
"step 5";
player.chooseButton(["将一张牌置于牌堆顶将另一张牌置于牌堆底", cards], true);
"step 6";
player.lose(event.cards, ui.cardPile).set("topper", result.links[0]).insert_index =
function (event, card) {
if (card == event.topper) return ui.cardPile.firstChild;
return null;
};
if (_status.dying.length) event.finish();
"step 7";
player.chooseTarget("对一名角色造成1点伤害", true).set("ai", function (target) {
var player = _status.event.player;
return get.damageEffect(target, player, player);
});
"step 8";
if (result.bool) {
var target = result.targets[0];
player.line(target);
target.damage("nocard");
}
},
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
marktext: "",
intro: {
content: "expansion",
markcount: "expansion",
},
},
//用间篇
yjxuepin: {
enable: "phaseUse",
usable: 1,
filterTarget: function (event, player, target) {
return player.inRange(target) && target.countDiscardableCards(player, "he") > 0;
},
content: function () {
"step 0";
player.loseHp();
"step 1";
if (target.countDiscardableCards(player, "he") > 0)
player.discardPlayerCard(target, 2, "he", true);
else event.finish();
"step 2";
if (
result.bool &&
result.cards.length == 2 &&
get.type2(result.cards[0], result.cards[0].original == "h" ? target : false) ==
get.type2(result.cards[1], result.cards[1].original == "h" ? target : false)
)
player.recover();
},
ai: {
order: 4,
result: {
player: function (player, target) {
if (player.hp == 1) return -8;
if (target.countCards("e") > 1) return 0;
if (player.hp > 2 || target.countCards("h") > 1) return -0.5;
return -2;
},
target: function (player, target) {
if (target.countDiscardableCards(player, "he") < 2) return 0;
return -2;
},
},
},
},
nsjianglie: {
trigger: { player: "useCardToPlayered" },
filter: function (event, player) {
return event.card.name == "sha" && event.target.countCards("h") > 0;
},
check: function (event, player) {
return get.attitude(player, event.target) < 0;
},
logTarget: "target",
content: function () {
"step 0";
trigger.target.showHandcards();
"step 1";
var cards = trigger.target.getCards("h");
var list = [];
for (var i = 0; i < cards.length; i++) {
list.add(get.color(cards[i]));
}
if (list.length == 1) event._result = { control: list[0] };
else {
list.sort();
trigger.target
.chooseControl(list)
.set("prompt", "选择弃置一种颜色的所有手牌")
.set("ai", function () {
var player = _status.event.player;
if (
get.value(player.getCards("h", { color: "red" })) >=
get.value(player.getCards("h", { color: "black" }))
)
return "black";
return "red";
});
}
"step 2";
trigger.target.discard(trigger.target.getCards("h", { color: result.control }));
},
},
//桌游志贴纸
spyinzhi: {
trigger: { player: "damageEnd" },
frequent: true,
content: function () {
"step 0";
event.count = trigger.num;
"step 1";
event.count--;
var cards = game.cardsGotoOrdering(get.cards(2)).cards;
player.showCards(cards);
event.count2 = 0;
for (var i = 0; i < cards.length; i++) {
if (get.suit(cards[i]) == "spade") {
event.count2++;
cards.splice(i--, 1);
}
}
event.cards = cards;
if (!event.count2 || !trigger.source) event.goto(4);
"step 2";
event.count2--;
if (trigger.source.countCards("h") > 0) {
player
.chooseTarget(
"令一名角色获得" + get.translation(trigger.source) + "的一张手牌",
function (card, player, target) {
var source = _status.event.source;
return target != source && source.countGainableCards(target, "h") > 0;
}
)
.set("source", trigger.source);
} else event.goto(4);
"step 3";
if (result.bool) {
var target = result.targets[0];
player.line([trigger.source, target], "green");
target.gainPlayerCard(trigger.source, "h", true);
if (event.count2) event.goto(2);
}
"step 4";
if (cards.length) player.gain(cards, "gain2", "log");
"step 5";
if (
event.count > 0 &&
player.hasSkill(event.name) &&
!get.is.blocked(event.name, player)
) {
player.chooseBool(get.prompt2("spyinzhi")).set("frequentSkill", event.name);
} else event.finish();
"step 6";
if (result.bool) {
player.logSkill("spyinzhi");
event.goto(1);
}
},
},
spmingjian: {
trigger: { global: "phaseBegin" },
direct: true,
filter: function (event, player) {
return player.countCards("he") > 0;
},
content: function () {
"step 0";
var next = player.chooseCard(get.prompt2("spmingjian", trigger.player), "he");
next.set("ai", function (card) {
var target = _status.event.getTrigger().player;
var player = _status.event.player;
if (get.attitude(player, target) > 0 && target.countCards("j") > 0)
return 5 - get.value(card);
return -1;
});
next.set("filterCard", function (card, player) {
if (get.position(card) == "e")
return lib.filter.cardDiscardable.apply(this, arguments);
return true;
});
//next.set('logSkill',['spmingjian',trigger.player]);
"step 1";
if (result.bool) {
player.logSkill("spmingjian", trigger.player);
var card = result.cards[0];
event.card = card;
if (get.position(card) == "e") event._result = { index: 0 };
else if (!lib.filter.cardDiscardable(card, player, event))
event._result = { index: 1 };
else {
var name = get.translation(trigger.player);
player
.chooseControl()
.set("choiceList", [
"" + name + "跳过本回合的判定阶段",
"" + name + "于本回合的判定中不触发判定结果生效前的时机",
])
.set("ai", function () {
return 0;
});
}
} else event.finish();
"step 2";
if (result.index == 0) {
player.discard(card);
trigger.player.skip("phaseJudge");
} else {
trigger.player
.addToExpansion(card, player, "giveAuto")
.gaintag.add("spmingjian_charlotte");
trigger.player.addSkill("spmingjian_charlotte");
}
},
ai: {
expose: 0.25,
},
},
spmingjian_charlotte: {
trigger: { player: ["judgeBefore", "phaseAfter"] },
forced: true,
firstDo: true,
silent: true,
popup: false,
charlotte: true,
content: function () {
if (trigger.name == "phase") player.removeSkill(event.name);
else trigger.noJudgeTrigger = true;
},
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
marktext: "",
intro: {
name: "明鉴",
content: "expansion",
markcount: "expansion",
},
},
spshude: {
trigger: { player: "phaseJieshuBegin" },
frequent: true,
filter: function (event, player) {
return player.countCards("h") < player.maxHp;
},
content: function () {
player.drawTo(player.maxHp);
},
},
spfuluan: {
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return player.inRange(target);
},
selectCard: 3,
position: "he",
check: function (card) {
return 5 - get.value(card);
},
complexCard: true,
filterCard: function (card, player) {
if (!ui.selected.cards.length)
return player.countCards("he", { suit: get.suit(card) }) > 2;
return get.suit(card) == get.suit(ui.selected.cards[0]);
},
content: function () {
target.turnOver();
player.addTempSkill("spfuluan2");
},
ai: {
order: 1,
result: {
target: function (player, target) {
if (target.isTurnedOver()) return 2;
return -1;
},
},
},
},
spfuluan2: {
mod: {
cardEnabled: function (card) {
if (card.name == "sha") return false;
},
},
},
spzhaoxin: {
trigger: { player: "phaseDrawEnd" },
check: function (event, player) {
return player.getUseValue({ name: "sha", isCard: true }) > 0;
},
filter: function (event, player) {
return player.countCards("h") > 0;
},
content: function () {
"step 0";
player.showHandcards();
"step 1";
player.chooseUseTarget("sha", false);
},
},
splanggu: {
trigger: { player: "damageEnd" },
filter: function (event, player) {
return get.itemtype(event.source) == "player";
},
logTarget: "source",
content: function () {
"step 0";
player.judge();
"step 1";
if (trigger.source.countCards("h") > 0) {
var next = player.discardPlayerCard(trigger.source, "h", [1, Infinity]);
next.set("suit", result.suit);
next.set("filterButton", function (button) {
return get.suit(button.link) == _status.event.suit;
});
next.set("visible", true);
}
},
group: "splanggu_rewrite",
},
splanggu_rewrite: {
trigger: { player: "judge" },
filter: function (event, player) {
return player.countCards("hs") > 0 && event.getParent().name == "splanggu";
},
direct: true,
content: function () {
"step 0";
player
.chooseCard(
"狼顾的判定结果为" +
get.translation(trigger.player.judging[0]) +
"是否打出一张手牌进行代替",
"hs",
function (card) {
var player = _status.event.player;
var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
if (mod2 != "unchanged") return mod2;
var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player);
if (mod != "unchanged") return mod;
return true;
}
)
.set("ai", function (card) {
return -1;
});
"step 1";
if (result.bool) {
player.respond(result.cards, "highlight", "splanggu", "noOrdering");
} else {
event.finish();
}
"step 2";
if (result.bool) {
if (trigger.player.judging[0].clone) {
trigger.player.judging[0].clone.classList.remove("thrownhighlight");
game.broadcast(function (card) {
if (card.clone) {
card.clone.classList.remove("thrownhighlight");
}
}, trigger.player.judging[0]);
game.addVideo(
"deletenode",
player,
get.cardsInfo([trigger.player.judging[0].clone])
);
}
game.cardsDiscard(trigger.player.judging[0]);
trigger.player.judging[0] = result.cards[0];
trigger.orderingCards.addArray(result.cards);
game.log(trigger.player, "的判定牌改为", result.cards[0]);
game.delay(2);
}
},
},
sphantong: {
trigger: {
player: "loseEnd",
},
frequent: true,
filter: function (event, player) {
return (
event.type == "discard" &&
event.getParent(3).name == "phaseDiscard" &&
event.cards.filterInD("d").length > 0
);
},
content: function () {
if (!player.storage.sphantong) player.storage.sphantong = [];
var cards = trigger.cards.filterInD("d");
player.storage.sphantong.addArray(cards);
player.$gain2(cards);
game.log(player, "", cards, "置于武将牌上");
player.markSkill("sphantong");
},
group: ["sphantong_gain"],
derivation: ["hujia", "jijiang", "jiuyuan", "xueyi"],
marktext: "",
intro: {
content: "cards",
onunmark: "throw",
},
},
sphantong_gain: {
trigger: { global: "phaseBegin" },
direct: true,
filter: function (event, player) {
return player.storage.sphantong && player.storage.sphantong.length > 0;
},
content: function () {
"step 0";
player.chooseButton(
[get.prompt("sphantong"), player.storage.sphantong],
function (button) {
var player = _status.event.player;
if (_status.currentPhase == player) {
//血裔
if (
(player.hasJudge("lebu") || player.skipList.includes("phaseUse")) &&
game.hasPlayer(function (current) {
return current != player && current.group == "qun";
})
)
return 1;
//激将
if (
!player.hasJudge("lebu") &&
!player.skipList.includes("phaseUse") &&
game.hasPlayer(function (current) {
return (
current != player &&
current.group == "shu" &&
current.hasSha() &&
get.attitude(player, current) > 0 &&
get.attitude(current, player) > 0
);
}) &&
game.hasPlayer(function (target) {
return (
player.canUse({ name: "sha" }, target) &&
get.effect(target, { name: "sha" }, player, player) > 0
);
})
)
return 1;
}
//护驾
else if (
!player.hasShan() &&
game.hasPlayer(function (current) {
return (
current != player &&
current.group == "wei" &&
current.mayHaveShan(player, "respond") &&
get.attitude(player, current) > 0 &&
get.attitude(current, player) > 0
);
})
)
return 1;
return -1;
}
);
"step 1";
if (result.bool) {
player.logSkill("sphantong");
var card = result.links[0];
player.$throw(card);
game.log(player, "", card, "置入了弃牌堆");
player.storage.sphantong.remove(card);
player[player.storage.sphantong.length > 0 ? "markSkill" : "unmarkSkill"](
"sphantong"
);
game.cardsDiscard(card);
var list = ["hujia", "jijiang", "jiuyuan", "xueyi"];
for (var i = 0; i < list.length; i++) {
if (player.hasSkill(list[i])) list.splice(i--, 1);
}
if (list.length) {
player
.chooseControl(list)
.set("prompt", "选择获得以下技能中的一个")
.set("ai", function () {
var player = _status.event.player;
if (_status.currentPhase == player) {
//血裔
if (
(player.hasJudge("lebu") ||
player.skipList.includes("phaseUse")) &&
game.hasPlayer(function (current) {
return current != player && current.group == "qun";
})
)
return "xueyi";
//激将
if (
!player.hasJudge("lebu") &&
!player.skipList.includes("phaseUse") &&
game.hasPlayer(function (current) {
return (
current != player &&
current.group == "shu" &&
current.hasSha() &&
get.attitude(player, current) > 0 &&
get.attitude(current, player) > 0
);
}) &&
game.hasPlayer(function (target) {
return (
player.canUse({ name: "sha" }, target) &&
get.effect(target, { name: "sha" }, player, player) > 0
);
})
)
return "jijiang";
}
//护驾
else if (
!player.hasShan() &&
game.hasPlayer(function (current) {
return (
current != player &&
current.group == "wei" &&
current.mayHaveShan(player, "respond") &&
get.attitude(player, current) > 0 &&
get.attitude(current, player) > 0
);
})
)
return "hujia";
});
} else event.finish();
} else event.finish();
"step 2";
var skill = result.control;
player.addTempSkills(skill);
// player.popup(skill,'wood');
// game.log(player,'获得了技能','#g【'+get.translation(skill)+'】');
},
},
sphuangen: {
trigger: { global: "useCardToPlayered" },
filter: function (event, player) {
if (!event.isFirstTarget) return false;
if (get.type(event.card) != "trick") return false;
if (get.info(event.card).multitarget) return false;
if (event.targets.length < 2) return false;
return player.hp > 0;
},
direct: true,
content: function () {
"step 0";
player
.chooseTarget(
get.prompt("sphuangen"),
[1, Math.min(player.hp, trigger.targets.length)],
function (card, player, target) {
return _status.event.targets.includes(target);
}
)
.set("ai", function (target) {
return -get.effect(target, trigger.card, trigger.player, _status.event.player);
})
.set("targets", trigger.targets);
"step 1";
if (result.bool) {
player.logSkill("sphuangen", result.targets);
trigger.excluded.addArray(result.targets);
player.draw();
}
},
},
spyicong: {
trigger: { player: "phaseDiscardEnd" },
direct: true,
locked: false,
filter: function (event, player) {
return player.countCards("he") > 0;
},
content: function () {
"step 0";
player
.chooseCard("he", [1, player.countCards("he")], get.prompt2("spyicong"))
.set("ai", function (card) {
if (card.name == "du") return 10;
if (ui.selected.cards.length) return -1;
return 4 - get.value(card);
});
"step 1";
if (result.bool) {
player.logSkill("spyicong");
player.addToExpansion(result.cards, player, "give").gaintag.add("spyicong");
}
},
mod: {
globalTo: function (from, to, num) {
return num + to.getExpansions("spyicong").length;
},
},
marktext: "",
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
intro: {
name: "义从",
content: function (storage, player) {
return "共有" + get.cnNumber(player.getExpansions("spyicong").length) + "";
},
markcount: "expansion",
},
},
sptuji: {
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
locked: false,
filter: function (event, player) {
return player.getExpansions("spyicong").length > 0;
},
content: function () {
var cards = player.getExpansions("spyicong");
var num = cards.length;
player.addMark("sptuji2", num, false);
player.addTempSkill("sptuji2");
player.loseToDiscardpile(cards);
if (num <= 1) player.draw();
},
ai: {
combo: "spyicong"
},
},
sptuji2: {
onremove: true,
charlotte: true,
mod: {
globalFrom: function (from, to, num) {
return num - from.countMark("sptuji2");
},
},
marktext: "",
intro: {
name: "突骑",
content: "至其他角色的距离-#",
},
},
xinfu_yanyu: {
trigger: {
global: "phaseUseBegin",
},
direct: true,
filter: function (event, player) {
return player.countCards("he") > 0;
},
content: function () {
"step 0";
var next = player
.chooseToDiscard(get.prompt("xinfu_yanyu"), get.translation("xinfu_yanyu_info"), "he")
.set("logSkill", "xinfu_yanyu");
if (player == trigger.player) {
next.set(
"goon",
(function () {
var map = {
basic: 0,
trick: 0.1,
};
var hs = trigger.player.getCards("h");
var sha = false;
var jiu = false;
for (var i = 0; i < hs.length; i++) {
if (trigger.player.hasValueTarget(hs[i])) {
if (hs[i].name == "sha" && !sha) {
sha = true;
map.basic += 2;
}
if (hs[i].name == "tao") map.basic += 6;
if (hs[i].name == "jiu") {
jiu = true;
map.basic += 2.5;
}
if (get.type(hs[i]) == "trick")
map.trick += get.value(hs[i], player, "raw");
}
}
return map;
})()
);
next.set("ai", function (card) {
var map = _status.event.goon;
var type = get.type(card, "trick");
if (!map[type]) return -1;
return map[type] - get.value(card);
});
} else {
next.set("ai", function (cardx) {
var map = {
basic: 0,
trick: 0,
};
var hs = trigger.player.getCards("h");
var sha = false;
var jiu = false;
for (var i = 0; i < hs.length; i++) {
if (hs[i] != cardx && trigger.player.hasValueTarget(hs[i])) {
if (hs[i].name == "sha" && !sha) {
sha = true;
map.basic += 2;
}
if (hs[i].name == "tao") map.basic += 6;
if (hs[i].name == "jiu") {
jiu = true;
map.basic += 3;
}
if (get.type(hs[i]) == "trick") map.trick += player.getUseValue(hs[i]);
}
}
var type = get.type(cardx, "trick");
if (!map[type]) return -get.value(cardx);
return map[type] - get.value(cardx);
});
}
"step 1";
if (result.bool) {
player.storage.xinfu_yanyu = get.type(result.cards[0], "trick");
player.addTempSkill("xinfu_yanyu2", "phaseUseAfter");
}
},
},
xinfu_yanyu2: {
init: function (player, skill) {
player.storage[skill] = 0;
},
onremove: function (player, skill) {
delete player.storage.xinfu_yanyu;
delete player.storage.xinfu_yanyu2;
},
trigger: {
global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"],
},
direct: true,
filter: function (event, player) {
if (player.storage.xinfu_yanyu2 >= 3) return false;
var type = player.storage.xinfu_yanyu,
cards = event.getd();
for (var i = 0; i < cards.length; i++) {
if (get.type(cards[i], "trick") == type && get.position(cards[i], true) == "d")
return true;
}
return false;
},
content: function () {
"step 0";
event.logged = false;
event.cards = [];
var type = player.storage.xinfu_yanyu;
var cards = trigger.getd();
for (var i = 0; i < cards.length; i++) {
if (get.type(cards[i], "trick") == type && get.position(cards[i], true) == "d")
event.cards.push(cards[i]);
}
"step 1";
if (player.storage.xinfu_yanyu2 >= 3) event.finish();
else
player.chooseCardButton(
event.cards,
"燕语是否将其中的一张牌交给一名角色"
).ai = function (card) {
if (card.name == "du") return 10;
return get.value(card);
};
"step 2";
if (result.bool) {
player.storage.xinfu_yanyu2++;
if (!event.logged) {
player.logSkill("xinfu_yanyu");
player.addExpose(0.25);
event.logged = true;
}
event.togain = result.links[0];
event.cards.remove(event.togain);
player
.chooseTarget(true, "请选择要获得" + get.translation(event.togain) + "的角色")
.set("ai", function (target) {
var att = get.attitude(_status.event.player, target);
var card = _status.event.card;
var val = get.value(card);
if (
player.storage.xinfu_yanyu2 < 3 &&
target == _status.currentPhase &&
target.hasValueTarget(card, null, true)
)
att = att * 5;
else if (
target == player &&
!player.hasJudge("lebu") &&
get.type(card) == "trick"
)
att = att * 3;
if (target.hasSkillTag("nogain")) att /= 10;
return att * val;
})
.set("card", event.togain);
} else event.finish();
"step 3";
var target = result.targets[0];
player.line(target, "green");
target.gain(event.togain, "gain2");
if (event.cards.length) event.goto(1);
},
},
xinfu_xiaode: {
subSkill: {
remove: {
unique: true,
charlotte: true,
trigger: {
player: "phaseAfter",
},
forced: true,
popup: false,
content: function () {
player.removeAdditionalSkill("xinfu_xiaode");
player.removeSkill("xinfu_xiaode_remove");
},
},
},
trigger: {
global: "dieAfter",
},
direct: true,
filter: function (skill, event) {
return !event.hasSkill("xinfu_xiaode_remove");
},
content: function () {
"step 0";
var list = [];
var listm = [];
var listv = [];
if (trigger.player.name1 != undefined) listm = lib.character[trigger.player.name1][3];
else listm = lib.character[trigger.player.name][3];
if (trigger.player.name2 != undefined) listv = lib.character[trigger.player.name2][3];
listm = listm.concat(listv);
var func = function (skill) {
var info = get.info(skill);
if (
info.charlotte ||
info.zhuSkill ||
(info.unique && !info.limited) ||
info.juexingji ||
info.dutySkill ||
info.hiddenSkill
)
return false;
return true;
};
for (var i = 0; i < listm.length; i++) {
if (func(listm[i])) list.add(listm[i]);
}
if (list.length) {
player
.chooseControl(list, "cancel2")
.set("prompt", get.prompt("xinfu_xiaode"))
.set("prompt2", get.translation("xinfu_xiaode_info"))
.set("ai", function () {
return list.randomGet();
});
} else event.finish();
"step 1";
if (result.control && result.control != "cancel2") {
player.logSkill("xinfu_xiaode");
player.popup(result.control, "thunder");
game.log(player, "获得了技能", "#g" + get.translation(result.control) + "");
player.addAdditionalSkill("xinfu_xiaode", [result.control]);
player.addSkill("xinfu_xiaode_remove");
}
},
},
chixin: {
group: ["chixin1", "chixin2"],
mod: {
cardUsableTarget: function (card, player, target) {
if (card.name == "sha" && !target.hasSkill("chixin3") && player.inRange(target))
return true;
},
},
trigger: { player: "useCardToPlayered" },
silent: true,
firstDo: true,
locked: false,
content: function () {
trigger.target.addTempSkill("chixin3");
},
},
chixin1: {
enable: ["chooseToRespond", "chooseToUse"],
filterCard: { suit: "diamond" },
position: "hes",
viewAs: { name: "sha" },
prompt: "将一张牌当杀使用或打出",
check: function (card) {
return 5 - get.value(card);
},
ai: {
respondSha: true,
},
},
chixin2: {
enable: ["chooseToUse", "chooseToRespond"],
filterCard: { suit: "diamond" },
viewAs: { name: "shan" },
position: "hes",
prompt: "将一张牌当闪使用或打出",
check: function (card) {
return 5 - get.value(card);
},
ai: {
respondShan: true,
effect: {
target: function (card, player, target, current) {
if (get.tag(card, "respondShan") && current < 0) return 0.8;
},
},
},
},
chixin3: { charlotte: true },
suiren: {
trigger: { player: "phaseZhunbeiBegin" },
skillAnimation: true,
animationColor: "gray",
filter: function (event, player) {
return !player.storage.suiren;
},
intro: {
content: "limited",
},
mark: true,
direct: true,
unique: true,
limited: true,
content: function () {
"step 0";
var check = player.hp == 1 || (player.hp == 2 && player.countCards("h") <= 1);
player
.chooseTarget(get.prompt2("suiren"))
.set("ai", function (target) {
if (!_status.event.check) return 0;
return get.attitude(_status.event.player, target);
})
.set("check", check);
"step 1";
if (result.bool) {
player.storage.suiren = true;
player.awakenSkill("suiren");
player.logSkill("suiren", result.targets);
player.removeSkills("reyicong");
player.gainMaxHp();
player.recover();
result.targets[0].draw(3);
}
},
},
xinmanjuan: {
audio: "manjuan",
forced: true,
trigger: {
player: "gainAfter",
global: "loseAsyncAfter",
},
filter: function (event, player) {
var hs = player.getCards("h");
return (
event.type != "xinmanjuan" &&
event.getg(player).filter(function (card) {
return hs.includes(card);
}).length > 0
);
},
content: function () {
"step 0";
var hs = player.getCards("h"),
cards = trigger.getg(player).filter(function (card) {
return hs.includes(card);
});
event.cards = cards;
event.rawCards = cards.slice(0);
player.loseToDiscardpile(cards);
if (_status.currentPhase != player) event.finish();
"step 1";
event.card = event.cards.shift();
event.togain = [];
var number = get.number(event.card);
for (var i = 0; i < ui.discardPile.childNodes.length; i++) {
var current = ui.discardPile.childNodes[i];
if (!event.rawCards.includes(current) && get.number(current) == number)
event.togain.push(current);
}
if (!event.togain.length) event.goto(4);
"step 2";
player.chooseButton(["是否获得其中的一张牌", event.togain]).ai = function (button) {
return get.value(button.link);
};
"step 3";
if (result.bool) {
player.gain(result.links[0], "gain2").type = "xinmanjuan";
}
"step 4";
if (event.cards.length) event.goto(1);
},
ai: {
threaten: 4.2,
nogain: 1,
skillTagFilter: function (player) {
return player != _status.currentPhase;
},
},
},
manjuan: {
audio: true,
trigger: { global: "loseAfter" },
filter: function (event, player) {
if (event.type != "discard") return false;
if (event.player == player) return false;
if (!player.countCards("he")) return false;
for (var i = 0; i < event.cards2.length; i++) {
if (get.position(event.cards2[i], true) == "d") {
return true;
}
}
return false;
},
direct: true,
unique: true,
gainable: true,
content: function () {
"step 0";
if (trigger.delay == false) game.delay();
"step 1";
var cards = [];
var suits = ["club", "spade", "heart", "diamond"];
for (var i = 0; i < trigger.cards2.length; i++) {
if (get.position(trigger.cards2[i], true) == "d") {
cards.push(trigger.cards2[i]);
suits.remove(get.suit(trigger.cards2[i]));
}
}
if (cards.length) {
var maxval = 0;
for (var i = 0; i < cards.length; i++) {
var tempval = get.value(cards[i]);
if (tempval > maxval) {
maxval = tempval;
}
}
maxval += cards.length - 1;
var next = player.chooseToDiscard("he", { suit: suits });
next.set("ai", function (card) {
return _status.event.maxval - get.value(card);
});
next.set("maxval", maxval);
next.set("dialog", [get.prompt(event.name), "hidden", cards]);
next.logSkill = event.name;
event.cards = cards;
}
"step 2";
if (result.bool) {
player.gain(event.cards, "gain2", "log");
}
},
ai: {
threaten: 1.3,
},
},
zuixiang: {
skillAnimation: true,
animationColor: "gray",
audio: true,
unique: true,
limited: true,
trigger: { player: "phaseZhunbeiBegin" },
content: function () {
"step 0";
player.awakenSkill("zuixiang");
event.cards = player.showCards(get.cards(3)).cards;
player.addToExpansion(event.cards, "gain2").gaintag.add("zuixiang2");
"step 1";
if (lib.skill.zuixiang.filterSame(cards)) {
player.gain(cards, "gain2").type = "xinmanjuan";
} else {
trigger._zuixiang = true;
player.addSkill("zuixiang2");
}
},
filterSame: function (c) {
for (var i = 0; i < c.length; i++) {
for (var j = i + 1; j < c.length; j++) {
if (get.number(c[i]) == get.number(c[j])) return true;
}
}
return false;
},
},
zuixiang2: {
intro: {
content: "expansion",
markcount: "expansion",
},
mod: {
cardEnabled: function (card, player) {
var type = get.type2(card);
var list = player.getExpansions("zuixiang2");
for (var i of list) {
if (get.type2(i, false) == type) return false;
}
},
cardRespondable: function () {
return lib.skill.zuixiang2.mod.cardEnabled.apply(this, arguments);
},
cardSavable: function () {
return lib.skill.zuixiang2.mod.cardEnabled.apply(this, arguments);
},
},
trigger: {
player: "phaseZhunbeiBegin",
target: "useCardToBefore",
},
forced: true,
charlotte: true,
filter: function (event, player) {
if (event.name == "phaseZhunbei") return !event._zuixiang;
var type = get.type2(event.card);
var list = player.getExpansions("zuixiang2");
for (var i of list) {
if (get.type2(i) == type) return true;
}
return false;
},
content: function () {
"step 0";
if (event.triggername == "useCardToBefore") {
trigger.cancel();
event.finish();
return;
}
var cards = get.cards(3);
player.addToExpansion("gain2", cards).gaintag.add("zuixiang2");
"step 1";
var cards = player.getExpansions("zuixiang2");
player.showCards(cards);
if (lib.skill.zuixiang.filterSame(cards)) {
player.gain(cards, "gain2", "log").type = "xinmanjuan";
player.removeSkill("zuixiang2");
}
},
ai: {
effect: {
target: function (card, player, target) {
var type = get.type2(card);
var list = target.getExpansions("zuixiang2");
for (var i of list) {
if (get.type2(i) == type) return "zeroplayertarget";
}
},
},
},
},
yanxiao: {
audio: 2,
enable: "phaseUse",
filterCard: { suit: "diamond" },
filterTarget: function (card, player, target) {
return target.canAddJudge({ name: "yanxiao_card" });
},
check: function (card) {
return 7 - get.value(card);
},
position: "he",
filter: function (event, player) {
return player.countCards("he", { suit: "diamond" }) > 0;
},
discard: false,
lose: false,
delay: false,
prepare: "give",
content: function () {
"step 0";
game.addGlobalSkill("yanxiao_global");
target.addJudge({ name: "yanxiao_card" }, cards);
"step 1";
game.delay();
},
ai: {
order: 8,
result: {
target: function (player, target) {
if (
target.countCards("j", function (card) {
return (
get.effect(
target,
{
name: card.viewAs || card.name,
cards: [card],
},
target,
target
) < 0
);
})
)
return 1;
return 0;
},
},
},
},
yanxiao_global: {
trigger: { player: "phaseJudgeBegin" },
forced: true,
filter: function (event, player) {
return player.countCards("j") > 0 && player.hasJudge("yanxiao_card");
},
content: function () {
player.gain(player.getCards("j"), "gain2");
},
ai: {
effect: {
target: function (card, player, target) {
if (get.type(card) == "delay" && target.hasJudge("yanxiao_card"))
return [0, 0, 0, 0.1];
},
},
},
},
anxian: {
audio: 2,
group: ["anxian_source", "anxian_target"],
subSkill: {
source: {
audio: "anxian",
trigger: { source: "damageBegin2" },
filter: function (event, player) {
return event.card && event.card.name == "sha";
},
check: function (event, player) {
if (get.damageEffect(event.player, player, player) <= 0) return true;
return false;
},
content: function () {
"step 0";
if (trigger.player.countCards("h")) {
trigger.player.chooseToDiscard(true);
}
"step 1";
player.draw();
trigger.cancel();
},
},
target: {
audio: "anxian",
trigger: { target: "useCardToTargeted" },
direct: true,
filter: function (event, player) {
return event.card.name == "sha" && player.countCards("h");
},
content: function () {
"step 0";
var next = player.chooseToDiscard(get.prompt2("anxian"));
next.set("ai", function (card) {
var player = _status.event.player;
var trigger = _status.event.getTrigger();
if (get.attitude(player, trigger.player) > 0) {
return 9 - get.value(card);
}
if (player.countCards("h", { name: "shan" })) return -1;
return 7 - get.value(card);
});
next.logSkill = "anxian";
"step 1";
if (result.bool) {
trigger.player.draw();
trigger.getParent().excluded.push(player);
}
},
},
},
},
junwei: {
trigger: { player: "phaseJieshuBegin" },
direct: true,
filter: function (event, player) {
return player.getExpansions("yinling").length >= 3;
},
content: function () {
"step 0";
var cards = player.getExpansions("yinling");
if (cards.length > 3) {
player
.chooseButton(3, [get.prompt("junwei"), "hidden", cards])
.set("ai", function (button) {
return 1;
});
} else {
player
.chooseBool()
.set("createDialog", [get.prompt("junwei"), "hidden", cards])
.set("dialogselectx", true)
.set("choice", true);
event.cards = cards.slice(0);
}
"step 1";
if (result.bool) {
player.logSkill("junwei");
var cards = event.cards || result.links;
player.loseToDiscardpile(cards);
player
.chooseTarget(true, function (card, player, target) {
return player != target;
})
.set("ai", function (target) {
return -get.attitude(_status.event.player, target) / Math.sqrt(1 + target.hp);
});
} else {
event.finish();
}
"step 2";
if (result.bool && result.targets && result.targets.length) {
var target = result.targets[0];
player.line(result.targets);
event.target = target;
var nshan = target.countCards("h", function (card) {
if (_status.connectMode) return true;
return card.name == "shan";
});
if (nshan == 0) {
event.directfalse = true;
} else {
target
.chooseCard(
"交给" + get.translation(player) + "一张或失去1点体力",
function (card) {
return card.name == "shan";
}
)
.set("ai", function (card) {
if (_status.event.nshan > 1) return 1;
if (_status.event.player.hp >= 3) return 0;
return 1;
})
.set("nshan", nshan);
}
} else {
event.finish();
}
"step 3";
if (!event.directfalse && result.bool) game.delay();
ui.clear();
"step 4";
if (!event.directfalse && result.bool) {
event.cards = result.cards;
event.target.$throw(result.cards);
player
.chooseTarget(
"" + get.translation(event.cards) + "交给一名角色",
true,
function (card, player, target) {
return target != _status.event.getParent().target;
}
)
.set("ai", function (target) {
return (
get.attitude(_status.event.player, target) /
(target.countCards("h", "shan") + 1)
);
});
} else {
event.target.loseHp();
delete event.cards;
}
"step 5";
if (event.cards) {
player.line(result.targets, "green");
result.targets[0].gain(event.cards, "gain2").giver = player;
game.log(player, "", event.cards, "交给", result.targets[0]);
event.finish();
} else {
if (event.target.countCards("e")) {
player.choosePlayerCard(
"e",
"" + get.translation(event.target) + "的一张装备牌移出游戏",
true,
event.target
);
} else {
event.finish();
}
}
"step 6";
if (result.bool) {
var card = result.links[0];
target.addToExpansion(card, target, "give").gaintag.add("junwei2");
target.addSkill("junwei2");
}
},
ai: {
combo: "yinling",
},
},
junwei2: {
mark: true,
intro: {
content: "expansion",
markcount: "expansion",
},
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
trigger: { player: "phaseJieshuBegin" },
forced: true,
charlotte: true,
content: function () {
"step 0";
var cards = player.getExpansions("junwei2").filter(function (card) {
return player.canEquip(card, true);
});
if (cards.length) {
player.$give(cards[0], player, false);
game.delay(0.5);
player.equip(cards[0]);
event.redo();
}
"step 1";
player.removeSkill("junwei2");
},
},
yinling: {
enable: "phaseUse",
filterCard: { color: "black" },
position: "he",
marktext: "",
intro: {
content: "expansion",
markcount: "expansion",
},
onremove: function (player, skill) {
var cards = player.getExpansions(skill);
if (cards.length) player.loseToDiscardpile(cards);
},
filter: function (event, player) {
return (
player.countCards("he", { color: "black" }) > 0 &&
player.getExpansions("yinling").length < 4
);
},
filterTarget: function (card, player, target) {
return target.countCards("he") > 0 && target != player;
},
check: function (card) {
return 6 - get.value(card);
},
content: function () {
"step 0";
player.choosePlayerCard("hej", target, true);
"step 1";
if (result.bool && result.links && result.links.length) {
player.addToExpansion(result.links, target, "give").gaintag.add("yinling");
}
},
ai: {
order: 10.1,
expose: 0.1,
result: {
target: function (player, target) {
if (target.hasSkill("tuntian")) return 0;
var es = target.getCards("e");
var nh = target.countCards("h");
var noe = es.length == 0 || target.hasSkillTag("noe");
var noe2 = es.length == 1 && es[0].name == "baiyin" && target.hp < target.maxHp;
var noh = nh == 0 || target.hasSkillTag("noh");
if (noh && noe) return 0;
if (noh && noe2) return 0.01;
if (get.attitude(player, target) <= 0)
return target.countCards("he") ? -1.5 : 1.5;
var js = target.getCards("j");
if (js.length) {
var jj = js[0].viewAs ? { name: js[0].viewAs } : js[0];
if (jj.name == "guohe") return 3;
if (js.length == 1 && get.effect(target, jj, target, player) >= 0) {
return -1.5;
}
return 2;
}
return -1.5;
},
},
},
},
fenyong: {
audio: 2,
trigger: { player: "damageEnd" },
content: function () {
player.addTempSkill("fenyong2");
},
},
fenyong2: {
audio: "fenyong",
mark: true,
intro: {
content: "防止你受到的所有伤害",
},
trigger: { player: "damageBegin3" },
forced: true,
content: function () {
trigger.cancel();
},
ai: {
maixie: true,
maixie_hp: true,
nofire: true,
nothunder: true,
nodamage: true,
effect: {
target: function (card, player, target, current) {
if (get.tag(card, "damage")) return [0, 0];
},
},
},
},
xuehen: {
audio: 2,
trigger: { global: "phaseJieshuBegin" },
forced: true,
locked: false,
filter: function (event, player) {
return player.hasSkill("fenyong2") && event.player.isIn();
},
content: function () {
"step 0";
player.removeSkill("fenyong2");
player
.chooseControl("弃牌", "出杀", function () {
var player = _status.event.player;
var trigger = _status.event.getTrigger();
if (get.attitude(player, trigger.player) < 0) {
var he = trigger.player.countCards("he");
if (he < 2) return "出杀";
if (player.maxHp - player.hp >= 2 && he <= 3) {
return "弃牌";
}
if (player.maxHp - player.hp >= 3 && he <= 5) {
return "弃牌";
}
if (player.maxHp - player.hp > 3) {
return "弃牌";
}
return "出杀";
}
return "出杀";
})
.set(
"prompt",
"弃置" +
get.translation(trigger.player) +
get.cnNumber(player.maxHp - player.hp) +
"张牌或对任意一名角色使用一张杀"
);
"step 1";
if (result.control == "弃牌") {
player.line(trigger.player, "green");
if (player.hp < player.maxHp && trigger.player.countCards("he")) {
player.discardPlayerCard(trigger.player, true, "he", player.maxHp - player.hp);
}
} else {
player.chooseUseTarget({ name: "sha" }, true, false, "nodistance");
}
},
ai: {
combo: "fenyong",
},
},
mouduan: {
audio: 1,
init2: function (player) {
game.broadcastAll(function (player) {
player._mouduan_mark = player.mark("", {
content: "拥有技能激昂谦逊",
});
}, player);
player.addAdditionalSkill("mouduan", ["jiang", "qianxun"]);
},
onremove: function (player) {
game.broadcastAll(function (player) {
if (player._mouduan_mark) {
player._mouduan_mark.delete();
delete player._mouduan_mark;
}
}, player);
player.removeAdditionalSkills("mouduan");
},
trigger: { player: "loseEnd" },
forced: true,
locked: false,
filter: function (event, player) {
return (
player._mouduan_mark &&
player._mouduan_mark.name == "" &&
player.countCards("h") <= 2
);
},
content: function () {
game.broadcastAll(function (player) {
if (!player._mouduan_mark) return;
player._mouduan_mark.name = "";
player._mouduan_mark.skill = "";
player._mouduan_mark.firstChild.innerHTML = "";
player._mouduan_mark.info.content = "拥有技能英姿克己";
}, player);
player.addAdditionalSkills("mouduan", ["yingzi", "keji"]);
},
group: "mouduan2",
},
mouduan2: {
audio: 1,
trigger: { global: "phaseZhunbeiBegin" },
//priority:5,
filter: function (event, player) {
return (
player._mouduan_mark &&
player._mouduan_mark.name == "" &&
player.countCards("h") > 2
);
},
direct: true,
content: function () {
"step 0";
player.chooseToDiscard("he", "谋断是否弃置一张牌将标记变为").ai = function () {
return -1;
};
"step 1";
if (result.bool && player.countCards("h") > 2) {
game.broadcastAll(function (player) {
if (!player._mouduan_mark) return;
player._mouduan_mark.name = "";
player._mouduan_mark.skill = "";
player._mouduan_mark.firstChild.innerHTML = "";
player._mouduan_mark.info.content = "拥有技能激昂谦逊";
}, player);
player.addAdditionalSkills("mouduan", ["jiang", "qianxun"]);
}
},
},
tanhu: {
audio: 1,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return player.canCompare(target);
},
filter: function (event, player) {
return player.countCards("h") > 0;
},
content: function () {
"step 0";
player.chooseToCompare(target);
"step 1";
if (result.bool) {
target.addTempSkill("tanhu2");
}
},
ai: {
result: {
target: function (player, target) {
var hs = player.getCards("h");
if (hs.length < 3) return 0;
var bool = false;
for (var i = 0; i < hs.length; i++) {
if (hs[i].number >= 9 && get.value(hs[i]) < 7) {
bool = true;
break;
}
}
if (!bool) return 0;
return -1;
},
},
order: 9,
},
group: "tanhu3",
},
tanhu2: {
mark: true,
intro: {
content: "已成为探虎目标",
},
},
tanhu3: {
mod: {
globalFrom: function (from, to) {
if (to.hasSkill("tanhu2")) return -Infinity;
},
wuxieRespondable: function (card, player, target) {
if (target && target.hasSkill("tanhu2")) return false;
},
},
},
jie: {
audio: 1,
trigger: { source: "damageBegin1" },
filter: function (event) {
return (
event.card &&
event.card.name == "sha" &&
get.color(event.card) == "red" &&
event.notLink()
);
},
forced: true,
content: function () {
trigger.num++;
},
},
dahe: {
audio: true,
enable: "phaseUse",
usable: 1,
filterTarget: function (card, player, target) {
return player.canCompare(target);
},
filter: function (event, player) {
return player.countCards("h") > 0;
},
content: function () {
"step 0";
player.chooseToCompare(target).set("preserve", "win");
"step 1";
if (result.bool && result.target) {
event.type = true;
event.card = result.target;
player
.chooseTarget(
"" + get.translation(result.target) + "交给一名角色",
function (card, player, target) {
return target.hp <= player.hp;
}
)
.set("ai", function (target) {
var att = get.attitude(_status.event.player, target);
if (_status.event.du) return -att;
return att;
})
.set("du", event.card.name == "du");
target.addTempSkill("dahe2");
} else {
event.type = false;
if (player.countCards("h")) {
player.showHandcards();
player.chooseToDiscard("h", true);
}
}
"step 2";
if (event.type) {
if (result.bool) {
player.line(result.targets, "green");
result.targets[0].gain(event.card, "gain2");
}
}
},
ai: {
result: {
target: function (player, target) {
var hs = player.getCards("h");
if (hs.length < 3) return 0;
var bool = false;
for (var i = 0; i < hs.length; i++) {
if (hs[i].number >= 9 && get.value(hs[i]) < 7) {
bool = true;
break;
}
}
if (!bool) return 0;
if (player.canUse("sha", target) && player.countCards("h", "sha")) {
return -2;
}
return -0.5;
},
},
order: 9,
},
},
dahe2: {
mark: true,
intro: {
content: "非红桃闪无效",
},
mod: {
cardRespondable: function (card, player) {
if (card.name == "shan") {
const suit = get.suit(card);
if (suit != "heart" && suit != "unsure") return false;
}
},
cardEnabled: function (card, player) {
if (card.name == "shan") {
const suit = get.suit(card);
if (suit != "heart" && suit != "unsure") return false;
}
},
},
},
shichou: {
//audio:1,
skillAnimation: true,
animationColor: "orange",
unique: true,
limited: true,
mark: false,
trigger: { player: "phaseZhunbeiBegin" },
zhuSkill: true,
direct: true,
filter: function (event, player) {
if (!player.hasZhuSkill("shichou")) return false;
if (player.countCards("he") < 2) return false;
return game.hasPlayer(function (current) {
return current != player && current.group == "shu";
});
},
init: function (player) {
if (player.hasZhuSkill("shichou")) {
player.markSkill("shichou");
player.storage.shichou = false;
}
},
content: function () {
"step 0";
player.chooseCardTarget({
prompt: get.prompt2("shichou"),
selectCard: 2,
filterTarget: function (card, player, target) {
return target.group == "shu" && target != player;
},
filterCard: true,
position: "he",
ai1: function (card) {
return 7 - get.value(card);
},
ai2: function (target) {
var player = _status.event.player;
if (player.hasUnknown()) return 0;
var att = get.attitude(player, target);
if (att <= 0) {
if (target.hp == 1) return (10 - att) / 2;
return 10 - att;
} else {
if (target.hp == 1) return 0;
return (10 - att) / 4;
}
},
});
"step 1";
if (!result.bool) return;
var target = result.targets[0];
var cards = result.cards;
player.storage.shichou = true;
player.logSkill("shichou", target);
player.awakenSkill("shichou");
player.give(cards, target);
player.storage.shichou_target = target;
player.addSkill("shichou2");
target.markSkillCharacter(
"shichou",
player,
"誓仇",
"代替" + get.translation(player) + "承受伤害直到首次进入濒死状态"
);
},
intro: {
content: "limited",
},
},
shichou2: {
group: "shichou3",
trigger: { player: "damageBegin3" },
forced: true,
popup: false,
content: function () {
trigger.player = player.storage.shichou_target;
trigger.shichou4 = true;
trigger.player.addSkill("shichou4");
player.logSkill("shichou2", player.storage.shichou_target);
game.delay(0.5);
},
ai: {
effect: {
target: function (card, player, target, current) {
if (get.tag(card, "damage")) {
if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
if (get.attitude(player, target) > 0) return [0, 0];
var eff = get.damageEffect(target.storage.shichou_target, player, target);
if (eff > 0) {
return [0, 1];
} else if (eff < 0) {
return [0, -2];
} else {
return [0, 0];
}
}
},
},
},
},
shichou3: {
trigger: { global: ["dying", "dieBegin"] },
forced: true,
popup: false,
//priority:10,
filter: function (event, player) {
return event.player == player.storage.shichou_target;
},
content: function () {
trigger.player.unmarkSkill("shichou");
delete player.storage.shichou_target;
player.removeSkill("shichou2");
},
},
shichou4: {
trigger: { player: ["damageAfter", "damageCancelled"] },
forced: true,
popup: false,
audio: false,
content: function () {
if (!trigger.shichou4) return;
if (event.triggername == "damageAfter" && trigger.num) {
player.draw(trigger.num);
}
player.removeSkill("shichou4");
},
},
zhaolie: {
trigger: { player: "phaseDrawBegin2" },
direct: true,
filter: function (event, player) {
return !event.numFixed;
},
content: function () {
"step 0";
player
.chooseTarget(get.prompt2("zhaolie"), function (card, player, target) {
return target != player && player.inRange(target);
})
.set("ai", function (target) {
var player = _status.event.player;
if (get.attitude(player, target) > 0) return 0;
return get.damageEffect(target, player, player);
});
"step 1";
if (result.bool) {
trigger.num--;
player.storage.zhaolie = result.targets[0];
player.logSkill("zhaolie", result.targets);
player.addTempSkill("zhaolie2", "phaseDrawAfter");
}
},
},
zhaolie2: {
trigger: { player: "phaseDrawEnd" },
forced: true,
popup: false,
content: function () {
"step 0";
event.cards = get.cards(3);
player.showCards(event.cards);
"step 1";
event.basic = [];
event.nonbasic = [];
event.todis = [];
for (var i = 0; i < event.cards.length; i++) {
if (get.type(event.cards[i]) == "basic") {
if (event.cards[i].name == "tao") {
event.todis.push(event.cards[i]);
} else {
event.basic.push(event.cards[i]);
}
} else {
event.todis.push(event.cards[i]);
event.nonbasic.push(event.cards[i]);
}
}
game.cardsDiscard(event.todis);
var num = event.nonbasic.length;
if (num == 0) {
if (event.basic.length == 0) {
event.finish();
return;
}
player.storage.zhaolie
.chooseTarget(
function (card, player, target) {
var source = _status.event.source;
return target == source || target == source.storage.zhaolie;
},
true,
"选择一个目标获得" + get.translation(event.basic)
)
.set("ai", function (target) {
return get.attitude(_status.event.player, target);
})
.set("source", player);
} else {
player.storage.zhaolie
.chooseToDiscard(
num,
"he",
"弃置" +
get.cnNumber(num) +
"张牌并令" +
get.translation(player) +
"拿牌或受到" +
get.cnNumber(num) +
"点伤害并拿牌"
)
.set("ai", function (card) {
var player = _status.event.player;
switch (_status.event.num) {
case 1:
return player.hp > 1 ? 0 : 7 - get.value(card);
case 2:
return 8 - get.value(card);
case 3:
return 10 - get.value(card);
default:
return 0;
}
})
.set("num", num);
}
"step 2";
var num = event.nonbasic.length;
var undone = false;
if (num == 0) {
if (event.basic.length) {
result.targets[0].gain(event.basic, "gain2", "log");
}
} else {
if (result.bool) {
if (event.basic.length) {
player.gain(event.basic, "gain2", "log");
}
} else {
player.storage.zhaolie.damage(num);
if (event.basic.length) {
undone = true;
}
}
}
if (!undone) {
delete player.storage.zhaolie;
event.finish();
}
"step 3";
if (player.storage.zhaolie.isIn()) {
player.storage.zhaolie.gain(event.basic, "gain2", "log");
} else {
game.cardsDiscard(event.basic);
}
delete player.storage.zhaolie;
},
},
fulu: {
trigger: { player: "useCard1" },
filter: function (event, player) {
if (event.card.name == "sha" && !game.hasNature(event.card)) return true;
},
audio: true,
check: function (event, player) {
var eff = 0;
for (var i = 0; i < event.targets.length; i++) {
var target = event.targets[i];
var eff1 = get.damageEffect(target, player, player);
var eff2 = get.damageEffect(target, player, player, "thunder");
eff += eff2;
eff -= eff1;
}
return eff >= 0;
},
content: function () {
game.setNature(trigger.card, "thunder");
if (get.itemtype(trigger.card) == "card") {
var next = game.createEvent("fulu_clear");
next.card = trigger.card;
event.next.remove(next);
trigger.after.push(next);
next.setContent(function () {
game.setNature(card, []);
});
}
},
},
fuji: {
trigger: { global: "damageBegin1" },
filter: function (event) {
return event.source && event.source.isIn() && event.hasNature("thunder");
},
check: function (event, player) {
return get.attitude(player, event.source) > 0 && get.attitude(player, event.player) < 0;
},
prompt: function (event) {
return (
get.translation(event.source) +
"即将对" +
get.translation(event.player) +
"造成伤害" +
get.prompt("fuji")
);
},
logTarget: "source",
content: function () {
trigger.source.judge().callback = lib.skill.fuji.callback;
},
callback: function () {
var evt = event.getParent(2);
if (event.judgeResult.color == "black") {
//game.cardsDiscard(card);
evt._trigger.num++;
} else {
evt._trigger.source.gain(card, "gain2");
}
},
},
},
characterReplace: {},
dynamicTranslate: {},
translate: {
sp_gongsunzan: "SP公孙瓒",
sp_gongsunzan_prefix: "SP",
sp_simazhao: "SP司马昭",
sp_simazhao_prefix: "SP",
sp_wangyuanji: "SP王元姬",
sp_wangyuanji_prefix: "SP",
sp_xinxianying: "SP辛宪英",
sp_xinxianying_prefix: "SP",
sp_liuxie: "SP刘协",
sp_liuxie_prefix: "SP",
spyicong_info:
"弃牌阶段结束时你可以将任意张牌置于你的武将牌上称为每有一张其他角色与你计算距离时便+1",
spyicong: "义从",
sptuji: "突骑",
sptuji_info:
"准备开始时你将所有置于弃牌堆然后你本回合内计算与其他角色的距离时-X若X不大于1你摸一张牌X为以此法进入弃牌堆的的数量",
sphuangen: "皇恩",
sphuangen_info:
"一名角色使用锦囊牌指定目标时若此牌的目标数大于1则你可以令此牌对其中的至多X个目标无效然后摸一张牌X为你的体力值",
sphantong: "汉统",
sphantong_gain: "汉统",
sphantong_info:
"当你的牌因弃牌阶段的游戏规则要求而进入弃牌堆后你可以将这些牌置于你的武将牌上称为一名角色的回合开始时你可以弃置一张并获得护驾/激将/救援/血裔中的一个技能直至当前回合结束",
spzhaoxin: "昭心",
spzhaoxin_info: "摸牌阶段结束时你可以展示所有手牌然后视为使用一张",
splanggu: "狼顾",
splanggu_rewrite: "狼顾",
splanggu_info:
"当你受到有来源的伤害后你可以进行判定此判定结果生效前你可以打出一张手牌替换判定牌然后你可以观看伤害来源的手牌并弃置其中的任意张与判定结果花色相同的牌",
spfuluan: "扶乱",
spfuluan_info:
"出牌阶段限一次你可以弃置三张花色相同的牌并选择攻击范围内的一名角色若如此做该角色翻面且你不能使用直到回合结束",
spshude: "淑德",
spshude_info: "结束阶段开始时你可以将手牌补至体力上限",
spmingjian: "明鉴",
spmingjian_info:
"一名角色的回合开始时你可以选择一项①弃置一张牌然后其跳过本回合的判定阶段②将一张手牌置于其武将牌上然后其本回合内进行判定时不触发判定结果生效前的时机且其回合结束时将此牌置入弃牌堆",
spyinzhi: "隐智",
spyinzhi_info:
"当你受到1点伤害后你可以亮出牌堆顶的两张牌若其中有黑桃牌则你可以进行至多X次令一名角色获得伤害来源的一张手牌的步骤然后获得其余的牌X为其中黑桃牌的数量",
yj_caoang: "用间曹昂",
yj_caoang_prefix: "用间",
yjxuepin: "血拼",
yjxuepin_info:
"出牌阶段限一次你可以选择攻击范围内的一名角色并失去1点体力你弃置其两张牌若这两张牌类型相同你回复1点体力",
ns_chendao: "用间陈到",
ns_chendao_prefix: "用间",
nsjianglie: "将烈",
nsjianglie_info: "当你使用指定目标后你可以令其展示所有手牌然后弃置其中一种颜色的牌",
ns_jiaxu: "贾诩",
ns_jiaxu_prefix: "",
nsyice: "遗策",
nsyice_info:
"锁定技当你使用/打出/弃置的牌进入弃牌堆后你将这些牌以任意顺序置于你的武将牌上称为若这些中有点数相同的牌则你获得这两张牌中的所有牌将这两张牌置于牌堆两端若场上没有处于濒死状态的角色则你对一名角色造成1点伤害",
ns_lijue: "SP李傕",
ns_lijue_prefix: "SP",
ns_zhangji: "SP张济",
ns_zhangji_prefix: "SP",
nsfeixiong: "飞熊",
nsfeixiong_info: "出牌阶段开始时你可以和一名其他角色拼点赢的角色对没赢的角色造成1点伤害",
nscesuan: "策算",
nscesuan_info:
"锁定技当你受到伤害时你防止此伤害并失去1点体力上限若你因以此法失去体力上限导致体力值减少则你摸一张牌",
nslulve: "掳掠",
nslulve_info:
"出牌阶段限一次你可以弃置X张牌并选择一名装备区内有牌的其他角色然后对其造成1点伤害X为其装备区内的牌数",
ns_fanchou: "SP樊稠",
ns_fanchou_prefix: "SP",
nsyangwu: "扬武",
nsyangwu_info:
"出牌阶段限一次你可以弃置一张手牌并选择一名手牌数大于你的其他角色你观看其手牌并获得其中的X张牌X为其与你手牌数之差的一半且向上取整",
jsp_liubei: "刘备",
jsp_liubei_prefix: "",
jsprende: "仁德",
jsprende_info:
"出牌阶段你可以将至少一张手牌交给其他角色若你于此阶段内给出的牌首次达到两张你可以视为使用一张基本牌",
ns_caoanmin: "战役篇曹安民",
ns_caoanmin_prefix: "战役篇",
nskuishe: "窥舍",
nskuishe_info:
"出牌阶段限一次你可以选择一名其他角色A的一张牌并将此牌交给不为A的一名角色然后A可以对你使用一张",
sp_xiahoushi: "SP夏侯氏",
sp_xiahoushi_prefix: "SP",
xinfu_yanyu: "燕语",
xinfu_yanyu_info:
"一名角色的出牌阶段开始时你可以弃置一张牌若如此做则该出牌阶段内限三次当一张与你弃置的牌类别相同的其他牌进入弃牌堆后你可令任意一名角色获得此牌",
xinfu_yanyu2: "燕语",
xinfu_xiaode: "孝德",
xinfu_xiaode_info:
"其他角色死亡后你可以声明该角色武将牌上的一个技能主公技觉醒技隐匿技使命技除外若如此做你获得此技能且不能再发动孝德直到你的回合结束",
jsp_zhaoyun: "J.SP赵云",
jsp_zhaoyun_prefix: "J.SP",
chixin: "赤心",
chixin1: "赤心",
chixin2: "赤心",
chixin_info:
"你可以将牌当作使用或打出出牌阶段你对在你攻击范围内且本回合内未成为过你使用的的目标的角色使用的没有次数限制",
suiren: "随仁",
suiren_info:
"限定技准备阶段开始时你可以失去技能义从然后加1点体力上限并回复1点体力然后令一名角色摸三张牌",
huangjinleishi: "黄巾雷使",
fulu: "符箓",
fulu_info: "当你声明使用普通你可以将此改为雷",
fuji: "助祭",
fuji_info:
"当一名角色造成雷属性伤害时你可以令其进行判定若结果为黑色此伤害+1若结果为红色该角色获得判定牌",
sp_pangtong: "SP庞统",
sp_pangtong_prefix: "SP",
manjuan: "漫卷",
manjuan_info: "其他角色的牌因弃置而进入弃牌堆后你可以弃置一张花色与之不同的牌然后获得此牌",
xinmanjuan: "漫卷",
xinmanjuan_info:
"锁定技当你不因漫卷醉乡而得到牌时你将此牌置入弃牌堆然后若此时处于你的回合内则你可以从弃牌堆中选择获得一张与此牌点数相同的其他牌",
zuixiang: "醉乡",
zuixiang2: "醉乡",
zuixiang_info:
"限定技准备阶段开始时你可以亮出牌堆顶的三张牌并置于你的武将牌上你不能使用或打出与该些牌同类的牌所有同类牌对你无效之后的每个准备阶段你须重复展示一次直到这些牌中任意两张点数相同然后你获得这些牌",
sp_daqiao: "SP大乔",
sp_daqiao_prefix: "SP",
yanxiao: "言笑",
yanxiao_info:
"出牌阶段你可以将一张牌置于一名角色的判定区内判定区内有言笑牌的角色下个判定阶段开始时其获得判定区里的所有牌",
anxian: "安娴",
anxian_info:
"当你使用对目标角色造成伤害时你可以防止此伤害令其弃置一张手牌然后你摸一张牌当你成为的目标后你可以弃置一张手牌令此对你无效然后此的使用者摸一张牌",
sp_ganning: "SP甘宁",
sp_ganning_prefix: "SP",
yinling: "银铃",
yinling_bg: "",
yinling_info:
"出牌阶段若你的小于四张你可以弃置一张黑色牌并指定一名其他角色若如此做你将其的一张牌置于你的武将牌上称为",
junwei: "军威",
junwei2: "军威",
junwei_info:
"结束阶段开始时你可以移去三张若如此做你须指定一名角色并令其选择一项1.展示一张然后你将此交给一名其他角色2.该角色失去1点体力然后你将其装备区内的一张牌移出游戏该角色的回合结束后将以此法移出游戏的装备牌移回原处",
sp_xiahoudun: "SP夏侯惇",
sp_xiahoudun_prefix: "SP",
fenyong: "愤勇",
fenyong2: "愤勇",
fenyong2_bg: "",
fenyong_info:
"每当你受到一次伤害后你可以获得一枚愤勇标记当你拥有愤勇标记时防止你受到的所有伤害",
xuehen: "雪恨",
xuehen_info:
"每个角色的结束阶段开始时若你有愤勇标记你弃置之然后选择一项1.弃置当前回合角色X张牌X为你已损失的体力值2.视为对一名任意角色使用一张",
sp_lvmeng: "SP吕蒙",
sp_lvmeng_prefix: "SP",
tanhu: "探虎",
tanhu2: "探虎",
tanhu3: "探虎",
tanhu_info:
"出牌阶段限一次你可以与一名其他角色拼点若你赢你获得以下效果直到回合结束你与该角色的距离为1你对该角色使用的普通锦囊牌不能被无懈可击响应",
mouduan: "谋断",
mouduan_info:
"游戏开始时你获得标记并获得技能激昂谦逊当你失去手牌后若手牌数不大于2你须将你的标记变为将这两项技能改为英姿克己一名角色的回合开始前你可弃一张牌将标记翻回",
sp_zhangfei: "SP张飞",
sp_zhangfei_prefix: "SP",
jie: "嫉恶",
jie_info: "锁定技当你使用红色造成伤害时此伤害+1",
dahe: "大喝",
dahe2: "大喝",
dahe2_bg: "",
dahe_info:
"出牌阶段限一次你可以与一名其他角色拼点若你赢该角色不能使用或打出不为花色的直到回合结束且你可将该角色拼点的牌交给场上一名体力不多于你的角色若你没赢你须展示手牌并弃置其中的一张",
sp_liubei: "SP刘备",
sp_liubei_prefix: "SP",
zhaolie: "昭烈",
zhaolie_info:
"摸牌阶段摸牌时你可以少摸一张牌并指定攻击范围内的一名角色你亮出牌堆顶的三张牌将其中的非基本牌和置于弃牌堆然后该角色选择一项1.你对其造成X点伤害然后其获得这些基本牌2.其弃置X张牌然后你获得这些基本牌X为其中非基本牌的数量",
shichou: "誓仇",
shichou2: "誓仇",
shichou_info:
"主公技限定技准备阶段你可指定一名蜀势力角色并交给其两张牌本局游戏中当你受到伤害时改为该角色受到等量的伤害并摸等量的牌直至该角色第一次进入濒死状态",
longyufei: "龙羽飞",
longyi: "龙裔",
longyi_info:
"你可将所有手牌当做任意基本牌使用或打出若此牌对应的实体牌中有锦囊牌你摸一张牌有装备牌此牌不可被响应",
zhenjue: "阵绝",
zhenjue_info:
"一名角色的结束阶段开始时若你没有手牌则你可以令其选择一项①弃置一张牌②令你摸一张牌",
//用间
yj_caocao: "用间曹操",
yj_caocao_prefix: "用间",
yjxiandao: "献刀",
yjxiandao_info:
"每回合限一次当你赠予其他角色一张牌后你令其不能使用或打出与本次赠予移动的牌A花色相同的牌直到回合结束然后若牌A为锦囊牌你摸两张牌为装备牌你获得其一张不为A的牌为武器牌你对其造成1点伤害",
yjsancai: "散财",
yjsancai_info:
"出牌阶段限一次你可以展示所有手牌若这些牌的类别均相同则你可以赠予一名其他角色一张手牌",
yjyibing: "义兵",
yjyibing_info:
"当你不因赠予且不因义兵的嵌套结算而于摸牌阶段外得到牌时你可以将此次得到的所有牌当做使用无距离限制且不计入使用次数",
yj_caohong: "用间曹洪",
yj_caohong_prefix: "用间",
yjlifeng: "厉锋",
yjlifeng_info:
"①出牌阶段限一次你可以获得弃牌堆里的一张装备牌②你发动赠予可以选择手牌区里的装备牌或装备区里的牌",
yj_zhangfei: "用间张飞",
yj_zhangfei_prefix: "用间",
yjmangji: "莽击",
yjmangji_info:
"锁定技当你装备区里的牌数或体力值变化后若你的体力值不小于1你弃置一张手牌并视为使用一张",
yongjian_ganning: "用间甘宁",
yongjian_ganning_prefix: "用间",
yjjielve: "劫掠",
yjjielve_info:
"你可以将两张颜色相同的牌当趁火打劫使用若你以此法造成伤害此技能于本回合失效",
//什么?孙鲁班?谁会做这种离谱的东西
yj_dongzhuo: "用间董卓",
yj_dongzhuo_prefix: "用间",
yjtuicheng: "推诚",
yjtuicheng_info: "你可以失去1点体力并视为使用一张推心置腹",
yjyaoling: "耀令",
yjyaoling_info:
"出牌阶段结束时你可以减1点体力上限并选择一名其他角色A和一名角色B你令A选择一项1.对B使用一张2.你弃置其一张牌",
yjshicha: "失察",
yjshicha_info:
"锁定技弃牌阶段开始时若你本回合未发动过推诚耀令之一你本回合的手牌上限为1",
yjyongquan: "拥权",
yjyongquan_info: "主公技结束阶段其他群势力角色依次可以交给你一张牌",
yj_liru: "用间李儒",
yj_liru_prefix: "用间",
yjdumou: "毒谋",
yjdumou_info:
"锁定技你的回合内其他角色的黑色手牌均视为你的均视为过河拆桥",
yjweiquan: "威权",
yjweiquan_info:
"限定技出牌阶段你可以选择至多X名角色X为游戏轮数然后选择一名角色A这些角色依次将一张手牌交给A然后若A的手牌数大于体力值其插入执行一个仅有弃牌阶段的回合",
yjrenwang: "人望",
yjrenwang_info: "出牌阶段限一次你可以选择弃牌堆中的一张黑色基本牌令一名角色获得之",
yj_xuyou: "用间许攸",
yj_xuyou_prefix: "用间",
yjshicai: "恃才",
yjshicai_info:
"①回合内牌堆顶的一张牌对你可见②出牌阶段限一次你可以弃置一张牌展示并获得牌堆顶的一张牌当此牌离开你的手牌区后重置恃才②",
yjchenggong: "逞功",
yjchenggong_info: "当一名角色使用牌指定第一个目标后若此牌目标数大于1你可以令其摸一张牌",
yjzezhu: "择主",
yjzezhu_info: "出牌阶段限一次你可以获得主公区域内的一张牌然后交给其一张牌",
yj_jiaxu: "用间贾诩",
yj_jiaxu_prefix: "用间",
yjzhenlve: "缜略",
yjzhenlve_info: "锁定技①你使用的普通锦囊牌不能被响应②你不能成为延时锦囊牌的目标",
yjjianshu: "间书",
yjjianshu_info:
"出牌阶段限一次你可以将一张手牌交给一名其他角色令其与你选择的另一名其他角色拼点没赢的角色失去1点体力",
yjyongdi: "拥嫡",
yjyongdi_info:
"限定技准备阶段你可以令一名男性角色加1点体力上限并回复1点体力然后若其武将牌上有主公技且其不为主公其获得此主公技",
yj_zhugedan: "用间诸葛诞",
yj_zhugedan_prefix: "用间",
yj_zhenji: "用间甄宓",
yj_zhenji_prefix: "用间",
yjluoshen: "洛神",
yjluoshen_info: "准备阶段你可以判定并获得判定牌且可重复此流程直到结果的颜色不同",
//线下E系列 一战成名 战役篇官盗
shen_jiaxu: "战役篇神贾诩",
shen_jiaxu_prefix: "战役篇神",
zybishi: "避世",
zybishi_info: "当你成为的目标后你可以令使用者摸一张牌然后令此无效",
zyjianbing: "谏兵",
zyjianbing_info:
"当一名其他角色受到执行的效果而受到伤害时你可以获得其一张牌若此牌花色为其回复1点体力",
pe_wangyun: "战役篇王允",
pe_wangyun_prefix: "战役篇",
zylianji: "连计",
zylianji_info:
"出牌阶段结束时若你于此阶段使用牌的类别数达到1你可以令一名角色摸一张牌2你可以回复1点体力3你可以跳过本回合剩余阶段然后令一名其他角色执行一个仅有你于此回合未执行过的阶段的回合",
zymoucheng: "谋逞",
zymoucheng_info: "每回合限一次你可以将一张黑色牌当借刀杀人使用",
pe_zhonghui: "战役篇钟会",
pe_zhonghui_prefix: "战役篇",
zyquanji: "权计",
zyquanji_info:
"①当你受到伤害后或使用牌对唯一目标造成伤害后你可以摸一张牌并将一张牌置于武将上称为②你的手牌上限+XX为",
zypaiyi: "排异",
zypaiyi_backup: "排异",
zypaiyi_info:
"出牌阶段限一次你可以移去一张并令一名角色摸X张牌X为且至多为7然后若其手牌数大于你你对其造成1点伤害",
pe_mengda: "战役篇孟达",
pe_mengda_prefix: "战役篇",
qiuan: "求安",
qiuan_info:
"当你受到伤害后若此伤害的渠道有对应的实体牌且你的武将牌上没有则你可以防止此伤害并将这些牌置于你的武将牌上称为",
liangfan: "量反",
liangfan2: "量反",
liangfan_info:
"锁定技准备阶段开始时若你的武将牌上有则你获得这些牌然后失去1点体力当你于此回合内因使用实体牌中包含的牌且执行这些牌的效果而造成伤害后你可以获得目标角色的一张牌",
pe_sunchen: "战役篇孙綝",
pe_sunchen_prefix: "战役篇",
zyshilu: "嗜戮",
zyshilu_info:
"①一名角色死亡后你可以将其武将牌置于你的武将牌上称为若杀死其的角色是你你将一张武将牌堆里的牌置为②回合开始时你可以弃置至多X张牌然后摸等量的牌X为",
zyxiongnve: "凶虐",
zyxiongnve_info:
"①出牌阶段开始时你可以将一张置入武将牌堆并选择一项直到回合结束1.当你造成伤害时此伤害+12.当你对其他角色造成伤害时获得其一张牌3.你使用牌无次数限制②出牌阶段结束时你可以将两张置入武将牌堆然后当你于下回合开始前受到其他角色造成的伤害时此伤害-1",
pe_wenqin: "战役篇文钦",
pe_wenqin_prefix: "战役篇",
gzjinfa: "矜伐",
gzjinfa_info:
"出牌阶段限一次你可以弃置一张牌令一名其他角色选择一项1.令你获得其一张牌2.交给你一张装备牌若此牌花色为其视为对你使用一张",
zyshangyi: "尚义",
zyshangyi_info:
"出牌阶段限一次你可以令一名其他角色观看你的手牌然后你观看其手牌并可以弃置其中一张牌",
zymingshi: "名士",
zymingshi_info: "锁定技若你有空置的防具栏属性对你无效",
gzsuishi: "随势",
gzsuishi2: "随势",
gzsuishi_info:
"锁定技其他角色进入濒死状态时若伤害来源与你势力相同你摸一张牌其他角色死亡时若其与你势力相同你失去1点体力",
//线下S系列
ps_guanyu: "关羽",
ps_guanyu_prefix: "",
pszhonghun: "忠魂",
pszhonghun_info: "当你使用或打出红色牌时你可以亮出牌堆顶的一张牌若此牌为红色你获得之",
ps2070_guojia: "郭嘉",
ps2070_guojia_prefix: "",
psquanmou: "全谋",
psquanmou_info:
"当其他角色使用锦囊牌结算结束后若你是此牌目标你可以弃置一张与此牌颜色相同的手牌并获得之",
ps1059_guojia: "郭嘉",
ps1059_guojia_prefix: "",
psqizuo: "奇佐",
psqizuo_info:
"当你攻击范围内的角色造成或受到伤害时你可以弃置一张牌并判定若此牌颜色与结果相同你可以令此伤害+1-1",
ps2063_zhaoyun: "赵云",
ps2063_zhaoyun_prefix: "",
psqijin: "七进",
psqijin_info: "摸牌阶段你可以改为亮出牌堆顶的七张牌并获得其中一种颜色的所有牌",
psqichu: "七出",
psqichu_info:
"每回合限一次当你于回合外需要使用或打出一张基本牌时你可以观看牌堆顶的两张牌若其中有此牌你可以使用或打出之",
pslongxin: "龙心",
pslongxin_info: "判定阶段开始时你可以弃置一张装备牌然后弃置你判定区里的一张牌",
ps2080_zhouyu: "周瑜",
ps2080_zhouyu_prefix: "",
psshiyin: "识音",
psshiyin_info:
"①游戏开始时你可以将一张手牌置于武将牌上称为杂音②出牌阶段开始时你可以用一张手牌替换杂音",
psquwu: "曲误",
psquwu_info: "锁定技你不能使用或打出与杂音牌花色相同的牌且这些牌对你无效",
psliaozou: "聊奏",
psliaozou_info: "出牌阶段你可以展示所有手牌若其中没有与杂音牌花色相同的牌你摸一张牌",
ps1062_zhouyu: "周瑜",
ps1062_zhouyu_prefix: "",
psoldshiyin: "识音",
psoldshiyin_info:
"当你于回合内得到牌后你可以展示之然后根据你展示的牌包含的花色数令你本回合使用的下一张牌获得对应效果不小于1不能被响应不小于2造成的伤害+1不小于3使用时摸一张牌",
ps_caozhi: "曹植",
ps_caozhi_prefix: "",
psliushang: "流殇",
psliushang_info:
"锁定技①摸牌阶段你改为摸X+1张牌然后依次将一张手牌置于所有其他角色的武将牌上称为流殇X为场上角色数且至少为3②其他角色的准备阶段其选择一项1.获得其流殇且当其于本回合对你造成伤害时防止此伤害2.将其流殇牌置入弃牌堆",
psqibu: "七步",
psqibu_info:
"限定技当你进入濒死状态时你可以亮出牌堆顶的七张牌回复等同于其中牌数的体力并获得所有",
ps_jin_simayi: "司马懿",
ps_jin_simayi_prefix: "",
psquanyi: "权奕",
psquanyi_info:
"①出牌阶段限一次你可以与一名角色拼点赢的角色根据所有拼点牌的花色执行以下效果其获得没赢的角色区域里的一张牌其对没赢的角色造成1点伤害其失去1点体力其弃置两张牌②当你拼点时你可以选择牌堆顶的牌作为拼点牌",
ps2067_zhaoyun: "武将传赵云",
ps2067_zhaoyun_prefix: "武将传",
pshuiqiang: "回枪",
pshuiqiang_info: "当你使用的抵消后你可以对其使用一张",
pshuntu: "魂突",
pshuntu_info: "出牌阶段限一次当你使用对目标角色造成伤害后你可以对其使用一张",
ps_caopi: "曹丕",
ps_caopi_prefix: "",
psjianwei: "僭位",
psjianwei_info: "限定技回合开始时你可以失去1点体力然后与一名其他角色交换区域里的所有牌",
ps2068_simayi: "司马懿",
ps2068_simayi_prefix: "",
pszhonghu: "冢虎",
pszhonghu_info:
"当一名角色于你的回合外死亡后你可以结束此回合然后令所有角色于其回合开始前跳过此回合直到你的回合开始前",
ps_simayi: "司马懿",
ps_simayi_prefix: "",
pshuxiao: "虎啸",
pshuxiao_info:
"回合开始时你可以判定若结果为基本牌或普通锦囊牌你于本回合内获得如下效果你可以将与结果点数或花色相同的手牌当与判定牌牌名和属性相同的牌使用",
ps_zhugeliang: "诸葛亮",
ps_zhugeliang_prefix: "",
psguanxing: "观星",
psguanxing_info: "准备阶段你可以观看牌堆顶的五张牌并将其以任意顺序置于牌堆项或牌堆底",
pslongyin: "龙吟",
pslongyin_info:
"每回合限一次你可以将任意张点数和为13的牌当做任意一张基本牌或普通锦囊牌使用或打出",
ps2066_zhugeliang: "武将传诸葛亮",
ps2066_zhugeliang_prefix: "武将传",
pszhiji: "智激",
pszhiji_info:
"出牌阶段限一次你可以弃置两张手牌并选择两名势力不同的角色视为这两名角色依次视为对对方使用一张",
psjiefeng: "借风",
psjiefeng_info:
"出牌阶段你可以弃置两张手牌然后亮出牌堆顶五张牌若其中有至少两张红色牌你视为使用一张万箭齐发",
ps_machao: "马超",
ps_machao_prefix: "",
psweihou: "威侯",
psweihou_info:
"当你判定前你可以亮出牌堆顶的两张牌选择其中一张作为你的本次判定结果然后将另一张置入弃牌堆",
ps_lvbu: "吕布",
ps_lvbu_prefix: "",
pssheji: "射戟",
pssheji_info:
"出牌阶段限一次你可以将所有手牌当一张无距离限制的使用然后当此对目标角色造成伤害后你获得其装备区里的所有武器牌和坐骑牌",
ps_jiaxu: "贾诩",
ps_jiaxu_prefix: "",
psqupo: "驱魄",
psqupo_info:
"一名角色A的回合开始时你可以将一张牌交给另一名其他角色B若此牌为黑色当A使用指定不为B的角色为目标时A失去1点体力红色当B于本回合下一次受到伤害时B失去1点体力",
psbaoquan: "保全",
psbaoquan_info: "当你受到伤害时你可以弃置一张锦囊牌并防止此伤害",
//S特
ps_shen_machao: "S特神马超",
ps_shen_machao_prefix: "S特神",
psshouli: "狩骊",
psshouli_info:
"锁定技①游戏开始时所有角色依次选择一项1.使用一张坐骑牌然后摸一张牌2.随机从游戏外的八张坐骑牌指示物中使用一张②你可以将场上一张进攻坐骑当防御坐骑当使用或打出若此坐骑牌的拥有者不为你则其非锁定技于本回合内失效且当你或其于本回合内受到伤害时此伤害+1且改为雷属性",
pshengwu: "横骛",
pshengwu_info:
"当你使用或打出牌时若场上有该花色的装备牌你可以弃置任意张该花色的手牌然后摸X张牌X为你弃置的牌数与场上与此牌花色相同的装备牌数之和",
//线下K系列木盒
pk_sp_duyu: "K系列杜预",
pk_sp_duyu_prefix: "K系列",
pkwuku: "武库",
pkwuku_info: "锁定技当有角色使用装备牌时若你的武库数小于3则你获得1枚武库",
pksanchen: "三陈",
pksanchen_info:
"觉醒技结束阶段若你的武库数大于2则你加1点体力上限并回复1点体力然后获得灭吴",
pkmiewu: "灭吴",
pkmiewu2: "灭吴",
pkmiewu_info:
"每回合限一次你可移去1枚武库视为使用或打出任意一张基本牌或普通锦囊牌然后摸一张牌",
//天书乱斗虚拟偶像
vtb_xiaosha: "小杀",
vtbguisha: "瑰杀",
vtbguisha_info:
"当其他角色使用你可以弃置一张牌令此不计入次数且此对目标角色造成的伤害+1",
vtbshuli: "淑丽",
vtbshuli_info: "每回合限两次当其他角色使用造成伤害后你可以与其各摸一张牌",
vtb_xiaoshan: "小闪",
vtbshanwu: "闪舞",
vtbshanwu_info:
"当其他角色成为的第一个目标时你可以弃置一张然后取消此的所有目标",
vtbxianli: "娴丽",
vtbxianli_info: "每回合限两次当你失去牌后若其中有你可以获得当前回合角色的一张牌",
vtb_xiaotao: "小桃",
vtbtaoyan: "桃宴",
vtbtaoyan_info:
"回合开始时你可以令至多两名其他角色摸一张牌并于游戏外获得一张共五张且均为6",
vtbyanli: "妍丽",
vtbyanli_info:
"每轮限一次一名角色于你的回合外进入濒死状态时你可以令其回复至1点体力然后其摸一张牌",
vtb_xiaole: "小乐",
vtbleyu: "乐虞",
vtbleyu_info:
"一名角色的回合开始时你可以弃置三张牌令其判定若结果不为其跳过本回合的出牌阶段",
vtbyuanli: "媛丽",
vtbyuanli_info: "一名角色跳过出牌阶段后你可以与一名其他角色各摸一张牌",
vtb_xiaojiu: "小酒",
vtbmeiniang: "美酿",
vtbmeiniang_info:
"其他角色的出牌阶段开始时你可以令其视为使用一张无次数限制且不计入次数的",
vtbyaoli: "媱丽",
vtbyaoli_info:
"其他角色于其出牌阶段内使用你可以令其于本回合内使用的下一张不能被响应且可以额外指定一个目标",
old_machao: "J.SP马超",
old_machao_prefix: "J.SP",
jsp_caoren: "SP曹仁",
jsp_caoren_prefix: "SP",
jsp_ganfuren: "SP甘夫人",
jsp_ganfuren_prefix: "SP",
zhangliang: "SP张梁",
zhangliang_prefix: "SP",
ol_xinxianying: "将辛宪英",
ol_xinxianying_prefix: "",
jiangqing: "战役篇蒋钦",
jiangqing_prefix: "战役篇",
tianfeng: "战役篇田丰",
tianfeng_prefix: "战役篇",
jiling: "战役篇纪灵",
jiling_prefix: "战役篇",
kongrong: "战役篇孔融",
kongrong_prefix: "战役篇",
mateng: "战役篇马腾",
mateng_prefix: "战役篇",
drag_guanyu: "龙关羽",
drag_guanyu_prefix: "",
drag_caoren: "龙曹仁",
drag_caoren_prefix: "",
drag_lvchang: "龙吕常",
drag_lvchang_prefix: "",
dragchaojue: "超绝",
dragchaojue_info:
"准备阶段你可以弃置一张手牌然后令所有其他角色本回合不能使用或打出此花色的牌然后这些角色依次选择一项①正面朝上交给你一张牌②本回合非锁定技失效",
dragjunshen: "军神",
dragjunshen_info:
"①你可以将一张红色牌当作使用或打出②当你使用军神①转化的造成伤害时你可以令受伤角色选择弃置装备区的所有牌或令此伤害+1③你使用方片无距离限制使用红桃可以额外选择一个目标",
draglizhong: "厉众",
draglizhong_info:
"结束阶段你可以以任意顺序选择执行任意项①将任意张装备牌置入任意名角色的装备区②令你或任意名装备区里有牌的角色各摸一张牌然后本次成为厉众②的角色于本轮手牌上限+2且可以将装备区的牌当作无懈可击使用",
dragjuesui: "玦碎",
dragjuesui_info:
"每名角色限一次一名角色进入濒死状态时你可以令其选择是否将体力值回复至1点并废除装备栏若其选择是则其本局游戏获得以下效果你可以将一张黑色非基本牌当作无次数限制的使用或打出",
dragjuwu: "拒武",
dragjuwu_info: "锁定技攻击范围内至少包含三名角色的角色使用的无属性对你无效",
dragshouxiang: "守襄",
dragshouxiang_info:
"摸牌阶段你可以额外摸X张牌若如此做你跳过出牌阶段且本回合的弃牌阶段开始时你可以交给至多X名角色各一张手牌X为攻击范围内包含你的角色",
offline_star: "桌游志·SP",
offline_sticker: "桌游志·贴纸",
offline_yijiang: "一将成名",
offline_luanwu: "文和乱武",
offline_yongjian: "用间篇",
offline_yongjian_prefix: "用间",
offline_feihongyingxue: "飞鸿映雪",
offline_piracyE: "官盗E系列·战役篇",
offline_piracyS: "官盗S系列",
offline_vtuber: "天书乱斗·虚拟偶像",
offline_piracyK: "官盗K系列",
offline_others: "线下其他系列",
offline_longyutao: "龙起襄樊",
},
};
});