diff --git a/character/clan/characterFilter.js b/character/clan/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/clan/characterFilter.js
+++ b/character/clan/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/collab/character.js b/character/collab/character.js
index 99c8fea39..55361aca1 100644
--- a/character/collab/character.js
+++ b/character/collab/character.js
@@ -19,6 +19,7 @@ const characters = {
sp_fuwan: ["male", "qun", 3, ["spfengyin", "spchizhong"]],
old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"]],
sp_mushun: ["male", "qun", 4, ["moukui"]],
+ dc_wuyi: ["male", "shu", 4, ["dcbenxi"]],
};
export default characters;
diff --git a/character/collab/characterFilter.js b/character/collab/characterFilter.js
index 55952424e..9535d337b 100644
--- a/character/collab/characterFilter.js
+++ b/character/collab/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
old_lingju(mode) {
return mode == "identity";
diff --git a/character/collab/dynamicTranslate.js b/character/collab/dynamicTranslate.js
index 0caffe703..60937eac8 100644
--- a/character/collab/dynamicTranslate.js
+++ b/character/collab/dynamicTranslate.js
@@ -4,5 +4,9 @@ const dynamicTranslates = {
dcjianxiong(player) {
return "当你受到伤害后,你可以摸" + get.cnNumber(player.countMark("dcjianxiong") + 1) + "张牌并获得对你造成伤害的牌,然后你令此技能摸牌数+1(至多为5)。";
},
+ dcbenxi(player) {
+ if(player.storage.dcbenxi) return "转换技,锁定技。当你失去手牌后,阴:系统随机检索出一句转换为拼音后包含“wu,yi”的技能台词,然后你念出此台词。阳:你获得上次所念出的台词对应的技能;若你已拥有该技能,则改为对其他角色各造成1点伤害。";
+ return "转换技,锁定技。当你失去手牌后,阴:系统随机检索出一句转换为拼音后包含“wu,yi”的技能台词,然后你念出此台词。阳:你获得上次所念出的台词对应的技能;若你已拥有该技能,则改为对其他角色各造成1点伤害。";
+ },
};
export default dynamicTranslates;
diff --git a/character/collab/skill.js b/character/collab/skill.js
index 450c2fb5f..a883c5797 100644
--- a/character/collab/skill.js
+++ b/character/collab/skill.js
@@ -2,6 +2,110 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
+ //名将吴懿
+ dcbenxi: {
+ trigger: {
+ player: ["loseAfter"],
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ forced: true,
+ zhuanhuanji: true,
+ filter(event, player) {
+ const evt = event.getl(player);
+ return evt && evt.hs && evt.hs.length > 0;
+ },
+ async content(event, trigger, player) {
+ player.changeZhuanhuanji("dcbenxi");
+ if (player.storage.dcbenxi) {
+ const map = lib.skill.dcbenxi.getMap(),
+ list = Object.keys(map);
+ if (list.length > 0) {
+ const skill = list.randomGet(),
+ voiceMap = game.parseSkillTextMap(skill, map[skill]);
+ console.log(voiceMap);
+ player.storage.dcbenxi_pending = skill;
+ findaudio: for (let data of voiceMap) {
+ if(!data.text) continue;
+ const pinyins = get.pinyin(data.text, false);
+ for (let i = 0; i < pinyins.length - 1; i++) {
+ if (pinyins[i] === "wu" && pinyins[i + 1] === "yi") {
+ player.chat(data.text);
+ game.broadcastAll(file => game.playAudio(file), data.file)
+ break findaudio;
+ }
+ }
+ }
+ }
+ } else {
+ const skill = player.storage.dcbenxi_pending;
+ if (skill) {
+ if (player.hasSkill(skill, null, false)){
+ const targets = game.filterPlayer(current => current != player).sortBySeat();
+ player.line(targets, 'fire');
+ for(let target of targets){
+ if(target.isIn()) await target.damage();
+ }
+ }
+ else{
+ await player.addTempSkills([skill], {player: "phaseBegin"});
+ }
+ delete player.storage.dcbenxi_pending;
+ }
+ }
+ },
+ onremove(player){
+ delete player.storage.dcbenxi;
+ delete player.storage.dcbenxi_pending;
+ },
+ mark: true,
+ marktext: "☯",
+ intro: {
+ mark(dialog, storage, player){
+ if(storage){
+ const skill = player.storage.dcbenxi_pending;
+ if(skill){
+ dialog.addText(`锁定技,当你下次失去手牌后,你获得技能〖${get.translation(skill)}〗直到你的下回合开始。若已获得该技能,则改为对所有其他角色各造成1点伤害。`, false);
+ dialog.add('
【' + get.translation(lib.translate[skill + "_ab"] || get.translation(skill).slice(0, 2)) + "】
" + get.skillInfoTranslation(skill, player) + "
");
+ }
+ }
+ else{
+ return "锁定技。当你下次失去手牌后,你随机念出一句拼音中含有“wu,yi”的台词。";
+ }
+ },
+ },
+ getMap() {
+ if (!_status.dcbenxi_map) {
+ _status.dcbenxi_map = {};
+ let list;
+ if (_status.connectMode) {
+ list = get.charactersOL();
+ } else {
+ list = get.gainableCharacters();
+ }
+ list.forEach(name => {
+ if (name !== "dc_wuyi") {
+ const skills = get.character(name).skills;
+ skills.forEach(skill => {
+ if (skill in _status.dcbenxi_map) return;
+ const voices = game.parseSkillText(skill, name);
+ if (
+ voices.some(text => {
+ const pinyins = get.pinyin(text, false);
+ for (let i = 0; i < pinyins.length - 1; i++) {
+ if (pinyins[i] === "wu" && pinyins[i + 1] === "yi") return true;
+ }
+ return false;
+ })
+ ) {
+ _status.dcbenxi_map[skill] = name;
+ }
+ });
+ }
+ });
+ }
+ return _status.dcbenxi_map;
+ },
+ },
//新InitFilter测试高达一号
//打赢复活赛的牢达[哭]
dclonghun: {
diff --git a/character/collab/sort.js b/character/collab/sort.js
index f056ebc6f..ac0e9b39f 100644
--- a/character/collab/sort.js
+++ b/character/collab/sort.js
@@ -3,7 +3,7 @@ const characterSort = {
collab_tongque: ["sp_fuwan", "sp_fuhuanghou", "sp_jiben", "old_lingju", "sp_mushun"],
collab_duanwu: ["sunwukong", "longwang", "taoshen"],
collab_decade: ["libai", "xiaoyuehankehan", "zhutiexiong", "wu_zhutiexiong"],
- collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun"],
+ collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun", "dc_wuyi"],
};
const characterSortTranslate = {
diff --git a/character/collab/translate.js b/character/collab/translate.js
index 3ef849aed..43969a5e6 100644
--- a/character/collab/translate.js
+++ b/character/collab/translate.js
@@ -95,11 +95,10 @@ const translates = {
dczhanjiang: "斩将",
dczhanjiang_info: "准备阶段,若场上有【青釭剑】,则你可以获得之。",
- collab_olympic: "OL·伦敦奥运会",
- collab_tongque: "OL·铜雀台",
- collab_duanwu: "新服·端午畅玩",
- collab_decade: "新服·创玩节",
- collab_remake: "新服·共创武将",
+ dc_wuyi: "经典吴懿",
+ dc_wuyi_prefix: "经典",
+ dcbenxi: "奔袭",
+ dcbenxi_info: "转换技,锁定技。当你失去手牌后,阴:系统随机检索出一句转换为拼音后包含“wu,yi”的技能台词,然后你念出此台词。阳:你获得上次所念出的台词对应的技能;若你已拥有该技能,则改为对其他角色各造成1点伤害。",
};
export default translates;
diff --git a/character/ddd/characterFilter.js b/character/ddd/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/ddd/characterFilter.js
+++ b/character/ddd/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/diy/character.js b/character/diy/character.js
index 5ee99c062..aeae39d34 100644
--- a/character/diy/character.js
+++ b/character/diy/character.js
@@ -1,21 +1,6 @@
const characters = {
noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"]],
- key_kud: ["female", "key", 3, ["kud_qiaoshou", "kud_buhui"]],
- key_misuzu: ["female", "key", 3, ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"]],
- key_kamome: ["female", "key", 3, ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"]],
- key_nao: ["female", "key", 3, ["nao_duyin", "nao_wanxin", "nao_shouqing"]],
- key_yuuki: ["female", "key", 3, ["yuuki_yicha"]],
- key_kotarou: ["male", "key", 3, ["kotarou_rewrite", "kotarou_aurora"]],
- key_tenzen: ["male", "key", 4, ["tenzen_fenghuan", "tenzen_retianquan"]],
- key_kyouko: ["female", "key", 3, ["kyouko_rongzhu", "kyouko_gongmian"]],
- key_kyou: ["female", "key", 3, ["kyou_zhidian", "kyou_duanfa"]],
- key_seira: ["female", "key", 3, ["seira_xinghui", "seira_yuanying"]],
- key_kiyu: ["female", "key", 3, ["kiyu_yuling", "kiyu_rexianyu"]],
- key_tomoyo: ["female", "key", 4, ["tomoyo_wuwei", "tomoyo_zhengfeng"]],
- key_minagi: ["female", "key", 3, ["minagi_peiquan", "minagi_huanliu"]],
- key_michiru: ["female", "key", 3, ["michiru_sheyuan"]],
-
ns_huangchengyan: ["male", "shu", 3, ["nslongyue", "nszhenyin"]],
ns_sunchensunjun: ["male", "wu", 5, ["nsxianhai", "nsxingchu"]],
ns_yuanxi: ["male", "qun", 4, ["nsshengyan", "nsdaizhan"]],
diff --git a/character/diy/characterFilter.js b/character/diy/characterFilter.js
index 685ecb85f..f1d70b0b5 100644
--- a/character/diy/characterFilter.js
+++ b/character/diy/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
ns_duangui(mode) {
return mode == "identity" && _status.mode == "normal";
diff --git a/character/diy/characterTitles.js b/character/diy/characterTitles.js
index 0e8c18558..534b7b72b 100644
--- a/character/diy/characterTitles.js
+++ b/character/diy/characterTitles.js
@@ -1,18 +1,4 @@
export default {
- key_kud: "#b千夜",
- key_misuzu: "#b长发及腰黑长直",
- key_kamome: "#b仿生纱",
- key_nao: "#b潮鸣",
- key_kyou: "#b长发及腰黑长直",
- key_yuuki: "#b4399司命",
- key_kyouko: "#b阿阿阿687",
- key_tenzen: "#b皋耳击",
- key_kotarou: "#bb1154486224",
- key_seira: "#b阿开木木W🍀",
- key_kiyu: "#b无面◎隐者",
- key_tomoyo: "#b长发及腰黑长直",
- key_minagi: "#b无面◎隐者",
-
ns_huangchengyan: "#g竹邀月",
ns_sunchensunjun: "#gVenusjeu",
ns_yuanxi: "#g食茸二十四",
diff --git a/character/diy/skill.js b/character/diy/skill.js
index 81377c1f1..e3ed0ac77 100644
--- a/character/diy/skill.js
+++ b/character/diy/skill.js
@@ -2,941 +2,6 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
- //远野美凪&远野小满
- minagi_peiquan: {
- enable: "phaseUse",
- filter(event, player) {
- return player.hasCard(card => card.hasGaintag("minagi_tag"), "h");
- },
- filterCard(card) {
- return card.hasGaintag("minagi_tag");
- },
- position: "h",
- filterTarget: lib.filter.notMe,
- discard: false,
- lose: false,
- delay: false,
- promptfunc: () => "出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。",
- check: card => {
- const player = _status.event.player;
- return get.type(card, false) == "equip" && game.hasPlayer(current => player.canGift(card, current, true) && !current.refuseGifts(card, player) && get.effect(current, card, player, player) > 0) ? 2 : 1 + Math.random();
- },
- content() {
- "step 0";
- player.gift(cards, target);
- "step 1";
- var list = player.getStorage("minagi_peiquan_yukito");
- if (list.length >= 4) event.finish();
- else {
- var yukito = get.translation(target);
- player
- .chooseButton(
- [
- "配券:请选择一项执行",
- [
- [
- ["damage", "选项一:对" + yukito + "造成1点伤害"],
- ["draw", "选项二:摸两张牌"],
- ["discard", "选项三:弃置" + yukito + "的两张牌"],
- ["use", "选项四:亮出牌堆顶的一张牌,然后可以使用之"],
- ],
- "textbutton",
- ],
- ],
- true
- )
- .set("list", list)
- .set("filterButton", function (button) {
- return !_status.event.list.includes(button.link);
- })
- .set("ai", function (button) {
- var player = _status.event.player,
- target = _status.event.getParent().target;
- switch (button.link) {
- case "damage":
- return get.damageEffect(target, player, player);
- case "draw":
- return 2 * get.effect(player, { name: "draw" }, player, player);
- case "discard":
- return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(1.6, target.countCards("he"));
- case "use":
- return _status.event.getRand("minagi_peiquan") * 4;
- }
- });
- }
- "step 2";
- player.markAuto("minagi_peiquan_yukito", result.links);
- player.addTempSkill("minagi_peiquan_yukito");
- switch (result.links[0]) {
- case "damage":
- target.damage("nocard");
- break;
- case "draw":
- player.draw(2);
- break;
- case "discard":
- player.discardPlayerCard(target, 2, "he", true);
- break;
- }
- if (result.links[0] != "use") event.finish();
- "step 3";
- var card = get.cards()[0];
- game.cardsGotoOrdering(card);
- player.showCards(card);
- player.chooseUseTarget(card, "是否使用" + get.translation(card) + "?");
- },
- ai: {
- order: 4,
- result: {
- player: (player, target) => {
- const giftEffects = ui.selected.cards.map(value => player.getGiftEffect(value, target));
- const baseEffect = Math.min(3, giftEffects.reduce((previousValue, currentValue) => previousValue + currentValue, 0) / giftEffects.length);
- const choices = ["damage", "draw", "discard", "use"];
- choices.removeArray(player.getStorage("minagi_peiquan_yukito"));
- if (choices.length <= 0) return baseEffect;
- return (
- baseEffect +
- Math.max(
- ...choices.map(choice => {
- switch (choice) {
- case "damage":
- return get.damageEffect(target, player, player);
- case "draw":
- return 2 * get.effect(player, { name: "draw" }, player, player);
- case "discard":
- return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(1.6, target.countCards("he"));
- case "use":
- return _status.event.getRand("minagi_peiquan") * 4;
- }
- })
- )
- );
- },
- },
- },
- group: "minagi_peiquan_umareta",
- subSkill: {
- yukito: { charlotte: true, onremove: true },
- umareta: {
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- forced: true,
- filter(event, player) {
- return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0;
- },
- content() {
- var hs = player.getCards("h");
- player.addGaintag(hs, "minagi_tag");
- },
- },
- },
- },
- minagi_huanliu: {
- trigger: { player: "phaseZhunbeiBegin" },
- async cost(event, trigger, player) {
- event.result = await player
- .chooseTarget(lib.filter.notMe, get.prompt("minagi_huanliu"), "和一名其他角色进行“协力”,并获得“远野小满”的所有对应技能")
- .set("ai", function (target) {
- return get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1);
- })
- .forResult();
- },
- content() {
- "step 0";
- var target = targets[0];
- player.chooseCooperationFor(target, "minagi_huanliu").set("ai", function (button) {
- var base = 0;
- switch (button.link) {
- case "cooperation_damage":
- base = 0.1;
- break;
- case "cooperation_draw":
- base = 0.6;
- break;
- case "cooperation_discard":
- base = 0.1;
- break;
- case "cooperation_use":
- base = 0.3;
- break;
- }
- return base + Math.random();
- });
- player.addAdditionalSkill("cooperation", ["minagi_huanliu_effect", "michiru_sheyuan"]);
- "step 1";
- game.delayx();
- },
- subSkill: {
- effect: {
- charlotte: true,
- trigger: { global: "phaseJieshuBegin" },
- forced: true,
- logTarget: "player",
- filter(event, player) {
- return player.checkCooperationStatus(event.player, "minagi_huanliu") && player.countCards("h") > 0;
- },
- content() {
- game.log(player, "和", trigger.player, "的协力成功");
- var hs = player.getCards("h");
- player.addGaintag(hs, "minagi_tag");
- game.delayx();
- },
- },
- },
- derivation: "michiru_sheyuan",
- },
- michiru_sheyuan: {
- charlotte: true,
- enable: "chooseToUse",
- filter(event, player) {
- if (player.hasSkill("michiru_sheyuan_round")) return false;
- var hs = player.getCards("h");
- if (!hs.length) return false;
- for (var i of hs) {
- if (i.hasGaintag("minagi_tag")) return false;
- if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false;
- }
- for (var name of lib.inpile) {
- var type = get.type(name);
- if (type != "basic" && type != "trick") return false;
- var card = get.autoViewAs({ name: name }, hs);
- if (event.filterCard(card, player, event)) return true;
- if (name == "sha") {
- for (var nature of lib.inpile_nature) {
- card.nature = nature;
- if (event.filterCard(card, player, event)) return true;
- }
- }
- }
- return false;
- },
- hiddenCard(player, name) {
- var type = get.type(name);
- if (type != "basic" && type != "trick") return false;
- if (player.hasSkill("michiru_sheyuan_round")) return false;
- var hs = player.getCards("h");
- if (!hs.length) return false;
- if (_status.connectMode) return true;
- for (var i of hs) {
- if (i.hasGaintag("minagi_tag")) return false;
- if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false;
- }
- return true;
- },
- chooseButton: {
- dialog(event, player) {
- var list = [],
- hs = player.getCards("h");
- for (var name of lib.inpile) {
- var type = get.type(name);
- if (type != "basic" && type != "trick") continue;
- var card = get.autoViewAs({ name: name }, hs);
- if (event.filterCard(card, player, event)) list.push([type, "", name]);
- if (name == "sha") {
- for (var nature of lib.inpile_nature) {
- card.nature = nature;
- if (event.filterCard(card, player, event)) list.push([type, "", name, nature]);
- }
- }
- }
- return ui.create.dialog("舍愿", [list, "vcard"], "hidden");
- },
- check(button) {
- var player = _status.event.player;
- var card = {
- name: button.link[2],
- nature: button.link[3],
- };
- if (_status.event.getParent().type == "phase") return player.getUseValue(card, null, true);
- return 1;
- },
- backup(links, player) {
- return {
- viewAs: {
- name: links[0][2],
- nature: links[0][3],
- },
- filterCard: true,
- position: "h",
- selectCard: -1,
- onuse(result, player) {
- player.addTempSkill("michiru_sheyuan_round", "roundStart");
- },
- };
- },
- prompt(links, player) {
- return "将所有手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用,然后摸等量的牌";
- },
- },
- ai: {
- respondSha: true,
- respondShan: true,
- skillTagFilter(player, tag, arg) {
- return lib.skill.michiru_sheyuan.hiddenCard(player, "s" + tag.slice(8));
- },
- order: 1,
- result: {
- player(player) {
- if (_status.event.dying) return get.attitude(player, _status.event.dying);
- return 1;
- },
- },
- },
- subSkill: {
- round: {
- charlotte: true,
- trigger: { player: "useCardAfter" },
- forced: true,
- popup: false,
- filter(event, player) {
- return event.skill == "michiru_sheyuan_backup";
- },
- content() {
- player.draw(trigger.cards.length);
- },
- },
- backup: {},
- },
- },
- //坂上智代
- tomoyo_wuwei: {
- enable: ["chooseToUse", "chooseToRespond"],
- viewAs: { name: "sha" },
- viewAsFilter(player) {
- var storage = player.getStorage("tomoyo_wuwei_mark");
- return player.hasCard(function (card) {
- return !storage.includes(get.suit(card));
- }, "hs");
- },
- position: "hs",
- filterCard(card, player) {
- var storage = player.getStorage("tomoyo_wuwei_mark");
- return !storage.includes(get.suit(card));
- },
- check(card) {
- return 5 - get.value(card);
- },
- onuse(result, player) {
- player.markAuto("tomoyo_wuwei_mark", [get.suit(result.card, false)]);
- player.addTempSkill("tomoyo_wuwei_mark");
- },
- onrespond(event, player) {
- player.markAuto("tomoyo_wuwei_mark", [get.suit(event.card, false)]);
- player.addTempSkill("tomoyo_wuwei_mark");
- },
- group: "tomoyo_wuwei_combo",
- subSkill: {
- mark: {
- charlotte: true,
- onremove: true,
- },
- combo: {
- trigger: { global: "useCardAfter" },
- direct: true,
- //chooseToUse类技能暂时没办法改
- filter(event, player) {
- return event.card.name == "shan" && player.inRangeOf(event.player) && player.canUse("sha", event.player, false);
- },
- content() {
- player
- .chooseToUse(
- "武威:是否对" + get.translation(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 = "tomoyo_wuwei_combo";
- },
- },
- },
- },
- tomoyo_zhengfeng: {
- dutySkill: true,
- trigger: { player: "phaseZhunbeiBegin" },
- filter(event, player) {
- return game.hasPlayer(current => player.inRange(current));
- },
- derivation: "tomoyo_changshi",
- async cost(event, trigger, player) {
- event.result = await player
- .chooseTarget(get.prompt("tomoyo_zhengfeng"), "令一名攻击范围内的角色进行判定。其于你的下回合开始前使用与判定结果颜色相同的牌时,你摸一张牌。", function (card, player, target) {
- return player.inRange(target);
- })
- .set("ai", function (target) {
- var player = _status.event.player;
- if (player.hp <= 1 && !player.countCards("h")) return 0;
- var hs = target.countCards("h"),
- thr = get.threaten(target);
- if (target.hasJudge("lebu")) return 0;
- return Math.sqrt(1 + hs) * Math.sqrt(Math.max(1, 1 + thr));
- })
- .forResult();
- },
- content() {
- "step 0";
- var target = targets[0];
- event.target = target;
- target.judge();
- "step 1";
- player.addTempSkill("tomoyo_zhengfeng_tomoyo", {
- player: "phaseBeginStart",
- });
- player.markAuto("tomoyo_zhengfeng_tomoyo", [
- {
- target: target,
- color: result.color,
- },
- ]);
- },
- group: "tomoyo_zhengfeng_after",
- subSkill: {
- tomoyo: {
- charlotte: true,
- onremove: true,
- mod: {
- inRangeOf(source, player) {
- var list = player.getStorage("tomoyo_zhengfeng_tomoyo");
- for (var obj of list) {
- if (obj.target == source) return true;
- }
- },
- },
- trigger: { global: "useCard" },
- forced: true,
- filter(event, player) {
- var color = get.color(event.card);
- if (color == "none") return false;
- var list = player.getStorage("tomoyo_zhengfeng_tomoyo");
- for (var obj of list) {
- if (obj.target == event.player && color == obj.color) return true;
- }
- return false;
- },
- content() {
- player.draw();
- },
- intro: {
- mark(dialog, students, player) {
- if (!students || !students.length) return "全校风纪良好!";
- var str = "";
- for (var i of students) {
- if (str.length > 0) str += "
";
- str += get.translation(i.target);
- str += ":";
- str += get.translation(i.color);
- }
- dialog.addText(str);
- },
- },
- },
- after: {
- trigger: { player: "phaseJieshuBegin" },
- filter(event, player) {
- return !player.hasHistory("useSkill", function (evt) {
- return evt.skill == "tomoyo_zhengfeng";
- });
- },
- prompt: "整风:是否放弃使命?",
- prompt2: "你可以减1点体力上限并失去〖武威〗,摸两张牌并回复1点体力,然后获得技能〖长誓〗。",
- skillAnimation: true,
- animationColor: "gray",
- check(event, player) {
- return player.hp * 1.1 + player.countCards("h") < 3;
- },
- content() {
- "step 0";
- game.log(player, "放弃了身为学生会长的使命");
- player.awakenSkill("tomoyo_zhengfeng");
- player.loseMaxHp();
- "step 1";
- player.removeSkills("tomoyo_wuwei");
- "step 2";
- player.draw(2);
- player.recover();
- "step 3";
- player.addSkills("tomoyo_changshi");
- },
- },
- },
- },
- tomoyo_changshi: {
- trigger: {
- global: ["gainAfter", "loseAsyncAfter"],
- },
- forced: true,
- filter(event, player) {
- return game.hasPlayer(function (current) {
- return current != player && event.getg(current).length > 1 && player.inRangeOf(current);
- });
- },
- content() {
- player.draw();
- },
- group: "tomoyo_changshi_recover",
- subSkill: {
- recover: {
- trigger: { global: "recoverAfter" },
- forced: true,
- filter(event, player) {
- return event.player.isAlive() && player.inRangeOf(event.player);
- },
- content() {
- player.changeHujia(1);
- },
- },
- },
- },
- //天宫希优
- kiyu_yuling: {
- mod: {
- targetEnabled(card) {
- var info = get.info(card);
- if (!info || (info.type != "trick" && info.type != "delay")) return;
- if (info.range) return false;
- },
- },
- trigger: { target: "useCardToTargeted" },
- forced: true,
- charlotte: true,
- filter(event, player) {
- return event.card.name == "sha" && event.player.countCards("he") > 0;
- },
- logTarget: "player",
- content() {
- trigger.player.chooseToDiscard("he", true, get.distance(trigger.player, player));
- },
- ai: {
- threaten: 0.7,
- effect: {
- target(card, player, target, current) {
- if (card.name == "sha") return 0.7;
- },
- },
- },
- },
- kiyu_rexianyu: {
- trigger: { player: "phaseUseEnd" },
- charlotte: true,
- unique: true,
- filter(event, player) {
- return (
- !player.hasSkill("kiyu_rexianyu_round", null, null, false) &&
- player.hasHistory("useCard", function (evt) {
- var type = get.type(evt.card);
- if (type != "basic" && type != "trick") return false;
- return evt.getParent("phaseUse") == event;
- })
- );
- },
- async cost(event, trigger, player) {
- const history = player.getHistory("useCard", function (evt) {
- var type = get.type(evt.card);
- if (type != "basic" && type != "trick") return false;
- return evt.getParent("phaseUse") == trigger;
- });
- const list = [];
- for (var i = 0; i < Math.min(history.length, 3); i++) {
- var card = history[i].card;
- list.push({ name: card.name, isCard: true });
- if (card.nature) list[i].nature = card.nature;
- }
- const { result } = await player
- .chooseTarget(get.prompt("kiyu_rexianyu"), "将以下使用结果告知于一名其他角色:" + get.translation(list), function (card, player, target) {
- return target != player && !target.hasSkill("kiyu_rexianyu_lastrun", null, null, false);
- })
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target) * get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1);
- });
- if (result.bool) {
- event.result = {
- bool: result.bool,
- targets: result.targets,
- cost_data: { list },
- };
- }
- },
- async content(event, trigger, player) {
- player.addTempSkill("kiyu_rexianyu_round", "roundStart");
- const tabito = targets[0];
- tabito.storage.kiyu_rexianyu_lastrun = event.cost_data.list;
- tabito.storage.amamiya_kiyu = player;
- tabito.addTempSkill("kiyu_rexianyu_lastrun", {
- player: ["phaseUseAfter"],
- global: ["roundStart"],
- });
- await game.asyncDelayx();
- },
- subSkill: {
- round: { charlotte: true },
- lastrun: {
- enable: "chooseToUse",
- onChooseToUse(event) {
- if (!game.online && event.type == "phase") {
- var evtx = event.getParent();
- var num = event.player.getHistory("useCard", function (evt) {
- return evt.getParent("phaseUse") == evtx;
- }).length;
- event.set("rexianyu_num", num);
- }
- },
- filter(event, player) {
- if (!player.countCards("hs")) return false;
- var num = event.rexianyu_num,
- list = player.storage.kiyu_rexianyu_lastrun;
- if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return false;
- var card = get.copy(list[num]);
- delete card.isCard;
- card = get.autoViewAs(card, "unsure");
- if (event.filterCard(card, player, event)) return true;
- return false;
- },
- onremove: true,
- viewAs(cards, player) {
- var num = _status.event.rexianyu_num,
- list = player.storage.kiyu_rexianyu_lastrun;
- if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return { name: "sha" };
- var card = get.copy(list[num]);
- delete card.isCard;
- return card;
- },
- prompt() {
- var player = _status.event.player;
- var num = _status.event.rexianyu_num,
- list = player.storage.kiyu_rexianyu_lastrun;
- if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return "无可用牌";
- var card = list[num];
- var str = "将一张牌当做" + get.translation(card);
- var kiyu = player.storage.amamiya_kiyu;
- if (kiyu && kiyu.isAlive()) str += ";然后" + get.translation(kiyu) + "摸一张牌,且你本回合的手牌上限+1";
- return str;
- },
- filterCard: true,
- position: "h",
- popname: true,
- check(card) {
- var player = _status.event.player;
- var num = _status.event.rexianyu_num,
- list = player.storage.kiyu_rexianyu_lastrun;
- return player.getUseValue(list[num], null, true) - player.getUseValue(card, null, true);
- },
- group: "kiyu_rexianyu_earthbound",
- mark: true,
- intro: { content: "已记录:$" },
- ai: {
- order: 12,
- result: {
- player(player) {
- var lunarq = player.storage.amamiya_kiyu;
- if (lunarq && get.attitude(player, lunarq) <= 0) return -1;
- return 1;
- },
- },
- },
- },
- earthbound: {
- trigger: { player: "useCardAfter" },
- forced: true,
- charlotte: true,
- filter(event, player) {
- if (event.skill != "kiyu_rexianyu_lastrun") return false;
- var lunarq = player.storage.amamiya_kiyu;
- return get.itemtype(lunarq) == "player" && lunarq.isAlive();
- },
- content() {
- var lunarq = player.storage.amamiya_kiyu;
- lunarq.draw();
- player.addTempSkill("kiyu_rexianyu_wolf");
- player.addMark("kiyu_rexianyu_wolf", 1, false);
- },
- },
- wolf: {
- charlotte: true,
- onremove: true,
- mod: {
- maxHandcard(player, num) {
- return num + player.countMark("kiyu_rexianyu_wolf");
- },
- },
- markimage: "image/card/handcard.png",
- intro: { content: "手牌上限+#" },
- },
- },
- },
- kiyu_xianyu: {
- trigger: { global: "phaseUseBegin" },
- charlotte: true,
- round: 1,
- filter(event, player) {
- return event.player.countCards("h") > 0;
- },
- logTarget: "player",
- check(event, player) {
- var target = event.player;
- var next = target.next;
- if (target.getSeatNum() > next.getSeatNum()) return true;
- if (
- target.countCards("h") < 4 &&
- target.countCards("h", function (card) {
- return target.hasUseTarget(card, null, true);
- }) < 2
- )
- return false;
- return true;
- },
- content() {
- "step 0";
- var target = trigger.player,
- cards = target.getCards("h");
- var next = player.chooseToMove("先预:预测" + get.translation(target) + "使用牌的顺序", true);
- next.set("list", [[get.translation(target) + "的手牌", cards]]);
- next.set("processAI", function (list) {
- var cards = list[0][1].slice(0);
- var target = _status.event.getTrigger().player;
- cards.sort(function (a, b) {
- return get.order(b, target) - get.order(a, target);
- });
- return [cards];
- });
- "step 1";
- if (result.bool) {
- var list = result.moved[0];
- player.storage.kiyu_xianyu_lastrun = list;
- player.addTempSkill("kiyu_xianyu_lastrun", list);
- }
- },
- subSkill: {
- lastrun: {
- trigger: { global: "phaseUseAfter" },
- forced: true,
- charlotte: true,
- onremove: true,
- content() {
- var num = 0,
- index = -1,
- target = trigger.player;
- var cards = player.getStorage("kiyu_xianyu_lastrun");
- var history = target.getHistory("useCard", function (event) {
- return event.getParent("phaseUse") == trigger;
- });
- for (var evt of history) {
- var goon = false;
- for (var card of evt.cards) {
- var index2 = cards.indexOf(card);
- if (index2 > index) {
- goon = true;
- index = index2;
- }
- }
- if (goon) num++;
- }
- if (num > 0) {
- num = Math.min(3, num);
- player.draw(num);
- if (target.isIn()) {
- target.addTempSkill("kiyu_xianyu_effect");
- target.addMark("kiyu_xianyu_effect", num, false);
- }
- }
- },
- },
- effect: {
- charlotte: true,
- onremove: true,
- mod: {
- maxHandcard(player, num) {
- return num + player.countMark("kiyu_xianyu_effect");
- },
- },
- },
- },
- },
- //樱庭星罗
- seira_xinghui: {
- trigger: { player: "phaseZhunbeiBegin" },
- check(event, player) {
- return !player.getExpansions("seira_xinghui").length;
- },
- content() {
- "step 0";
- game.delayx();
- "step 1";
- if (get.isLuckyStar(player)) {
- event.num = 6;
- player.throwDice(6);
- } else player.throwDice();
- "step 2";
- var cards = get.cards(num);
- event.cards = cards;
- game.cardsGotoOrdering(cards);
- var next = player.chooseToMove();
- next.set("prompt", "星辉:选择要作为“星屑”的牌(先选择的在上)");
- next.set("list", [["置于武将牌上", cards], ["置入弃牌堆"]]);
- 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 3";
- if (result.bool && result.moved && result.moved[0].length) {
- event.cards = result.moved[0];
- player
- .chooseTarget(true, "将以下牌置于一名角色的武将牌上", get.translation(event.cards), function (card, player, target) {
- return !target.getExpansions("seira_xinghui").length;
- })
- .set("ai", function (target) {
- return target == _status.event.player ? 1 : 0;
- });
- event.cards.reverse();
- } else event.finish();
- "step 4";
- var target = result.targets[0];
- player.line(target, { color: [253, 153, 182] });
- target.addToExpansion(cards).gaintag.add("seira_xinghui");
- game.log(player, "将" + get.cnNumber(cards.length) + "张牌置于", target, "的武将牌上");
- target.addSkill("seira_xinghui_hoshikuzu");
- },
- intro: {
- markcount: "expansion",
- content(storage, player) {
- return "共有" + get.cnNumber(player.getExpansions("seira_xinghui").length) + "张牌";
- },
- onunmark(storage, player) {
- player.removeSkill("seira_xinghui_hoshikuzu");
- },
- },
- subSkill: {
- hoshikuzu: {
- trigger: { source: "damageBegin1" },
- forced: true,
- charlotte: true,
- filter(event, player) {
- return player.getExpansions("seira_xinghui").length > 0;
- },
- content() {
- trigger.num++;
- game.log(player, "造成了", "#y暴击伤害");
- },
- group: ["seira_xinghui_draw", "seira_xinghui_judge"],
- },
- draw: {
- trigger: { player: "drawBefore" },
- forced: true,
- filter(event, player) {
- return player.getExpansions("seira_xinghui").length > 0;
- },
- content() {
- var cards = player.getExpansions("seira_xinghui");
- var num = Math.min(cards.length, trigger.num);
- trigger.num -= num;
- player.gain(cards.slice(0, num), "draw");
- if (trigger.num == 0) trigger.cancel();
- },
- },
- judge: {
- trigger: { player: "judgeBegin" },
- forced: true,
- filter(event, player) {
- return player.getExpansions("seira_xinghui").length > 0;
- },
- content() {
- trigger.directresult = player.getExpansions("seira_xinghui")[0];
- },
- },
- },
- },
- seira_yuanying: {
- enable: "phaseUse",
- usable: 1,
- filterTarget: true,
- selectTarget: 2,
- multitarget: true,
- multiline: true,
- line: { color: [253, 153, 182] },
- content() {
- game.filterPlayer()
- .sortBySeat()
- .forEach(function (current) {
- if (!targets.includes(current)) {
- current.removeSkills("seira_yinyuan");
- } else {
- current.addSkills("seira_yinyuan");
- }
- });
- game.delayx();
- },
- ai: {
- order: 1,
- result: { target: 1 },
- expose: 0.1,
- },
- derivation: "seira_yinyuan",
- },
- seira_yinyuan: {
- enable: "phaseUse",
- usable: 1,
- filterTarget(card, player, target) {
- return target != player && target.hasSkill("seira_yinyuan", null, null, false) && target.countCards("hej") > 0;
- },
- content() {
- player.gainPlayerCard(target, true, "hej");
- target.recover();
- },
- mark: true,
- intro: {
- content: "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。",
- },
- ai: {
- order: 9,
- viewHandcard: true,
- skillTagFilter(player, tag, arg) {
- if (player == arg) return false;
- return player.hasSkill("seira_yinyuan") && arg.hasSkill("seira_yinyuan");
- },
- result: {
- player(player, target) {
- var effect = get.effect(target, { name: "shunshou_copy" }, player, player);
- if (target.isDamaged()) {
- if (effect < 0) effect /= 2;
- effect += get.recoverEffect(target, player, player);
- }
- return effect;
- },
- },
- },
- },
//派对浪客
nsxingyun: {
audio: 2,
@@ -1551,1739 +616,6 @@ const skills = {
},
},
},
- //加纳天善(改版)
- tenzen_fenghuan: {
- trigger: { global: "useCardAfter" },
- filter(event, player) {
- if (player == event.player || event.targets.length != 1 || event.targets[0] != player || !event.player.isIn() || (event.card.name != "sha" && (get.type(event.card, null, false) != "trick" || !get.tag(event.card, "damage")))) return false;
- if (
- !player.canUse(
- {
- name: event.card.name,
- nature: event.card.nature,
- isCard: true,
- },
- event.player,
- false
- )
- )
- return false;
- var num = get.number(event.card);
- if (typeof num != "number") return false;
- num *= 2;
- var hs = player.getCards("he");
- for (var i of hs) {
- num -= get.number(i);
- if (num <= 0) return true;
- }
- return false;
- },
- async cost(event, trigger, player) {
- const num = get.number(trigger.card) * 2,
- card = {
- name: trigger.card.name,
- nature: trigger.card.nature,
- isCard: true,
- };
- event.result = await player
- .chooseToDiscard("he", get.prompt("tenzen_fenghuan", trigger.player), "弃置任意张点数之和不小于" + num + "的牌,然后视为对其使用一张" + get.translation(card), "chooseonly")
- .set("selectCard", function () {
- var cards = ui.selected.cards,
- num = _status.event.cardNumber;
- for (var i of cards) {
- num -= get.number(i);
- if (num <= 0) return [cards.length, cards.length + 1];
- }
- return [cards.length + 1, cards.length + 1];
- })
- .set("cardNumber", num)
- .set("effect", get.effect(trigger.player, card, player, player))
- .set("ai", function (card) {
- var eff = _status.event.effect;
- if (eff <= 0) return 0;
- for (var i of ui.selected.cards) eff -= get.value(i) / Math.sqrt(get.number(i) / 3);
- return eff - get.value(card) / Math.sqrt(get.number(card) / 3);
- })
- .forResult();
- },
- async content(event, trigger, player) {
- await player.discard(event.cards);
- var card = {
- name: trigger.card.name,
- nature: trigger.card.nature,
- isCard: true,
- },
- target = trigger.player;
- if (target.isIn() && player.canUse(card, target, false)) await player.useCard(card, target, false);
- },
- },
- tenzen_retianquan: {
- trigger: { player: "useCardToPlayered" },
- filter(event, player) {
- return (
- event.card.name == "sha" &&
- (player.hp > 0 ||
- player.hasCard(function (card) {
- return lib.filter.cardDiscardable(card, player, "tenzen_retianquan");
- }, "he"))
- );
- },
- logTarget: "target",
- usable: 1,
- check(event, player) {
- if (get.attitude(player, event.target) >= 0) return false;
- if (player.hp > player.maxHp / 2) return true;
- if (
- player.hasCard(function (card) {
- return lib.filter.cardDiscardable(card, player, "tenzen_retianquan") && get.value(card) < 6;
- }, "he")
- )
- return true;
- return true;
- },
- prompt2: "你可失去1点体力或弃置一张牌,亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。每有一张基本牌,其所需使用的【闪】的数量便+1。然后若此牌造成过伤害,则你获得展示牌中的所有非基本牌。",
- content() {
- "step 0";
- player
- .chooseToDiscard("弃置一张牌,或点「取消」失去1点体力", "he")
- .set("goon", player.hp > player.maxHp / 2)
- .set("ai", function (card) {
- var val = get.value(card);
- if (_status.event.goon) return 0.1 - val;
- return 6 - val;
- });
- "step 1";
- if (!result.bool) player.loseHp();
- "step 2";
- var cards = get.cards(player.hp <= player.maxHp / 2 ? 5 : 3);
- player.showCards(cards, get.translation(player) + "发动了【天全】");
- game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent();
- var num = cards.filter(function (card) {
- return get.type(card, false) == "basic";
- }).length;
- if (num) {
- if (trigger.card.name == "sha") {
- var id = trigger.target.playerid;
- var map = trigger.getParent().customArgs;
- if (!map[id]) map[id] = {};
- if (typeof map[id].shanRequired == "number") {
- map[id].shanRequired += num;
- } else {
- map[id].shanRequired = 1 + num;
- }
- }
- }
- if (num < 5) {
- var next = game.createEvent("tenzen_retianqua_gain");
- next.cards = cards;
- next.player = player;
- event.next.remove(next);
- trigger.getParent().after.push(next);
- next.setContent(function () {
- if (
- player.getHistory("sourceDamage", function (evt) {
- return evt.card == event.parent.card;
- }).length > 0
- )
- player.gain(
- cards.filter(function (card) {
- return get.type(card, false) != "basic";
- }),
- "gain2"
- );
- });
- }
- },
- },
- //藤林杏
- kyou_zhidian: {
- locked: false,
- mod: {
- targetInRange(card) {
- if (card.kyou_zhidian) return true;
- },
- aiOrder(player, card, numx) {
- var num = _status.event._kyou_zhidian_baseValue;
- if (num > 0 && get.type2(card) == "trick" && player.getUseValue(card) < num) return numx / 10;
- },
- },
- enable: "chooseToUse",
- filter(event, player) {
- return player.countCards("hs", card => get.type2(card) == "trick") > 0;
- },
- filterCard(card) {
- return get.type2(card) == "trick";
- },
- onChooseToUse(event) {
- event._kyou_zhidian_baseValue = event.player.getUseValue({
- name: "sha",
- });
- },
- check(card) {
- var num = _status.event._kyou_zhidian_baseValue,
- player = _status.event.player;
- return num - player.getUseValue(card);
- },
- prompt: "将一张锦囊牌当做【杀】使用",
- viewAs: {
- name: "sha",
- kyou_zhidian: true,
- },
- group: "kyou_zhidian_aim",
- ai: {
- respondSha: true,
- skillTagFilter: player => player.countCards("hs", card => get.type2(card) == "trick") > 0,
- },
- subSkill: {
- aim: {
- trigger: {
- player: "useCardToPlayered",
- },
- forced: true,
- locked: false,
- filter(event, player) {
- return event.isFirstTarget && event.card.name == "sha";
- },
- logTarget: "target",
- content() {
- "step 0";
- var list = ["不可被响应", "无视防具", "伤害+1", "不计入次数"];
- list.remove(player.storage.kyou_zhidian);
- player
- .chooseControl(list)
- .set("prompt", "掷典:请为" + get.translation(trigger.card) + "选择一种效果")
- .set(
- "choice",
- (function () {
- if (list.includes("不计入次数") && player.hasSha()) return "不计入次数";
- if (
- list.includes("不可被响应") &&
- trigger.target.mayHaveShan(
- player,
- "use",
- trigger.target.getCards("h", i => {
- return i.hasGaintag("sha_notshan");
- })
- )
- )
- return "不可被响应";
- if (list.includes("伤害+1")) return "伤害+1";
- return list.randomGet();
- })()
- )
- .set("ai", () => _status.event.choice);
- "step 1";
- var target = trigger.target;
- player.storage.kyou_zhidian = result.control;
- game.log(player, "对", target, "的", trigger.card, "#g" + result.control);
- switch (result.control) {
- case "不可被响应":
- trigger.directHit.add(target);
- break;
- case "无视防具":
- target.addTempSkill("qinggang2");
- target.storage.qinggang2.add(trigger.card);
- break;
- case "伤害+1":
- var map = trigger.customArgs;
- var id = target.playerid;
- if (!map[id]) map[id] = {};
- if (!map[id].extraDamage) map[id].extraDamage = 0;
- map[id].extraDamage++;
- break;
- case "不计入次数":
- var evt = trigger.getParent();
- if (evt.addCount !== false) {
- evt.addCount = false;
- player.getStat().card.sha--;
- }
- break;
- }
- },
- },
- },
- },
- kyou_duanfa: {
- trigger: { player: "damageBegin2" },
- limited: true,
- skillAnimation: true,
- animationColor: "thunder",
- filter(event, player) {
- return player.hp <= event.num;
- },
- content() {
- player.awakenSkill("kyou_duanfa");
- if (player.countCards("h") > 0) player.chooseToDiscard("h", true, player.countCards("h"));
- player.recover();
- trigger.cancel();
- player.addTempSkill("kyou_duanfa_draw", {
- player: "phaseBeginStart",
- });
- },
- subSkill: {
- draw: {
- trigger: { target: "useCardToTargeted" },
- forced: true,
- charlotte: true,
- filter(event, player) {
- if (event.card.name == "sha") return true;
- return get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0;
- },
- content() {
- player.draw();
- },
- },
- },
- },
- //天王寺瑚太朗
- kotarou_aurora: {
- trigger: {
- player: ["damageEnd", "loseHpEnd", "gainMaxHpEnd"],
- },
- forced: true,
- charlotte: true,
- filter(event, player) {
- return player.hasEnabledSlot(1);
- },
- content() {
- if (player.hasEmptySlot(1)) {
- var card = get.cardPile2(function (card) {
- return get.subtype(card) == "equip1" && !get.cardtag(card, "gifts") && player.canUse(card, player);
- });
- if (card) player.chooseUseTarget(card, true);
- } else player.chooseUseTarget("sha", true, false);
- },
- },
- kotarou_rewrite: {
- enable: "phaseUse",
- charlotte: true,
- filter(event, player) {
- return !player.hasSkill("kotarou_rewrite_block");
- },
- content() {
- "step 0";
- player.getHistory("custom").push({ kotarou_rewrite: true });
- player
- .chooseControl()
- .set("choiceList", ["视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌", "移动场上的一张牌", "增加1点体力上限并失去1点体力", "本回合内下一次造成的伤害+1", "本回合内下一次回复体力时,额外回复1点体力", "本回合内手牌上限和【杀】的使用次数+1 "])
- .set("ai", function () {
- var player = _status.event.player;
- if (player.hp > 2 && player.getUseValue({ name: "sha" }) > 0) return 2;
- return 0;
- });
- "step 1";
- lib.skill.kotarou_rewrite.rewrites[result.index](player, event);
- if (result.index != 0) event.goto(3);
- "step 2";
- if (result.bool) {
- player.storage.kotarou_rewrite.push(result.links[0][2]);
- player.chooseUseTarget(true, {
- name: result.links[0][2],
- nature: result.links[0][3],
- isCard: true,
- });
- }
- "step 3";
- if (
- player.getHistory("custom", function (evt) {
- return evt && evt.kotarou_rewrite == true;
- }).length >= 3
- )
- player.addTempSkill("kotarou_rewrite_block");
- },
- onremove: true,
- rewrites: [
- function (player, event) {
- var list = [];
- if (!player.storage.kotarou_rewrite) player.storage.kotarou_rewrite = [];
- for (var i of lib.inpile) {
- if (player.storage.kotarou_rewrite.includes(i)) continue;
- var type = get.type(i);
- if (type == "basic" || type == "trick") list.push([type, "", i]);
- if (i == "sha") {
- for (var j of lib.inpile_nature) list.push([type, "", i, j]);
- }
- }
- if (list.length) {
- player
- .chooseButton(["改写:视为使用一张基本牌或普通锦囊牌", [list, "vcard"]], true)
- .set("filterButton", function (button) {
- return player.hasUseTarget(
- {
- name: button.link[2],
- nature: button.link[3],
- isCard: true,
- },
- null,
- true
- );
- })
- .set("ai", function (button) {
- return player.getUseValue({
- name: button.link[2],
- nature: button.link[3],
- isCard: true,
- });
- });
- } else event._result = { bool: false };
- },
- function (player, event) {
- player.moveCard(true);
- },
- function (player, event) {
- if (player.maxHp < 5) player.gainMaxHp();
- player.loseHp();
- },
- function (player, event) {
- player.addSkill("kotarou_rewrite_damage");
- player.addMark("kotarou_rewrite_damage", 1, false);
- game.log(player, "本回合下次造成的伤害", "#y+1");
- },
- function (player, event) {
- player.addSkill("kotarou_rewrite_recover");
- player.addMark("kotarou_rewrite_recover", 1, false);
- game.log(player, "本回合下次回复的体力", "#y+1");
- },
- function (player, event) {
- player.addSkill("kotarou_rewrite_sha");
- player.addMark("kotarou_rewrite_sha", 1, false);
- game.log(player, "本回合的手牌上限和使用【杀】的次数上限", "#y+1");
- },
- ],
- ai: {
- order: 4,
- result: {
- player(player) {
- if (
- player.getHistory("custom", function (evt) {
- return evt && evt.kotarou_rewrite == true;
- }).length >= 2
- )
- return 0;
- return 1;
- },
- },
- },
- },
- kotarou_rewrite_damage: {
- onremove: true,
- trigger: { source: "damageBegin1" },
- forced: true,
- content() {
- trigger.num += player.countMark("kotarou_rewrite_damage");
- player.removeSkill("kotarou_rewrite_damage");
- },
- charlotte: true,
- intro: { content: "下一次造成的伤害+#" },
- },
- kotarou_rewrite_recover: {
- onremove: true,
- trigger: { player: "recoverBegin" },
- forced: true,
- content() {
- trigger.num += player.countMark("kotarou_rewrite_recover");
- player.removeSkill("kotarou_rewrite_recover");
- },
- charlotte: true,
- intro: { content: "下一次回复的体力+#" },
- },
- kotarou_rewrite_sha: {
- onremove: true,
- mod: {
- maxHandcard(player, num) {
- return num + player.countMark("kotarou_rewrite_sha");
- },
- cardUsable(card, player, num) {
- if (card.name == "sha") return num + player.countMark("kotarou_rewrite_sha");
- },
- },
- charlotte: true,
- intro: { content: "手牌上限和出杀次数+#" },
- },
- kotarou_rewrite_block: {
- trigger: { player: "phaseEnd" },
- forced: true,
- charlotte: true,
- content() {
- player.removeSkill("kotarou_rewrite");
- player.removeSkill("kotarou_aurora");
- if (player.maxHp > 3) player.loseMaxHp(player.maxHp - 3);
- },
- },
- //加纳天善(旧)
- tenzen_yixing: {
- trigger: {
- global: "damageEnd",
- },
- filter(event, player) {
- if (!event.card || (event.card.name != "sha" && event.card.name != "juedou")) return false;
- var hairi = event.source;
- if (hairi && (hairi == player || player.inRangeOf(hairi)) && hairi.isIn() && hairi.name1 != "key_shizuku" && hairi.name2 != "key_shizuku") return true;
- hairi = event.player;
- return hairi && (hairi == player || player.inRange(hairi)) && hairi.isIn() && hairi.name1 != "key_shizuku" && hairi.name2 != "key_shizuku";
- },
- frequent: true,
- content() {
- "step 0";
- player.draw();
- "step 1";
- if (player.countCards("he") > 0) {
- player.chooseCard("he", true, "将一张牌作为“兴”置于武将牌上");
- } else event.finish();
- "step 2";
- if (result.bool) {
- var cards = result.cards;
- player.addToExpansion(cards, player, "give").gaintag.add("tenzen_yixing");
- }
- },
- intro: {
- content: "expansion",
- onunmark: "expansion",
- },
- onremove(player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- group: "tenzen_yixing_counter",
- subSkill: {
- counter: {
- trigger: { target: "useCardToTargeted" },
- filter(event, player) {
- if (player == event.player || !player.getExpansions("tenzen_yixing").length) return false;
- return event.targets.length == 1 && (event.card.name == "sha" || get.type(event.card) == "trick");
- },
- prompt2(event) {
- return "获得一张“兴”,且" + get.translation(event.card) + "结算完成后可以弃置两张牌,视为对" + get.translation(event.player) + "使用一张同名牌";
- },
- check(event, player) {
- if (!player.storage.tenzen_lingyu && player.getExpansions("tenzen_yixing").length < 3) return false;
- var card = {
- name: event.card.name,
- nature: event.card.nature,
- isCard: true,
- };
- return player.canUse(card, event.player, false) && get.effect(event.player, card, player, player) > 0;
- },
- content() {
- "step 0";
- player.chooseButton(["选择获得一张“兴”", player.getExpansions("tenzen_yixing")], true);
- "step 1";
- if (result.bool) {
- player.gain(result.links, "gain2");
- }
- var next = game.createEvent("tenzen_yixing_insert");
- event.next.remove(next);
- trigger.getParent().after.push(next);
- next.player = player;
- next.target = trigger.player;
- next.setContent(lib.skill.tenzen_yixing.content_extra);
- },
- },
- },
- content_extra() {
- "step 0";
- var card = event.getParent().card;
- event.card = {
- name: card.name,
- nature: card.nature,
- isCard: true,
- };
- if (player.countCards("he") > 1 && target && target.isIn() && player.canUse(event.card, target, false)) {
- player.chooseToDiscard("he", 2, "是否弃置两张牌,视为对" + get.translation(target) + "使用" + get.translation(event.card) + "?").set("ai", function (card) {
- return 5 - get.value(card);
- });
- } else event.finish();
- "step 1";
- if (result.bool) player.useCard(card, target, false, "tenzen_yixing");
- },
- },
- tenzen_lingyu: {
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- juexingji: true,
- skillAnimation: true,
- animationColor: "water",
- filter(event, player) {
- return player.getExpansions("tenzen_yixing").length >= player.hp;
- },
- content() {
- player.awakenSkill("tenzen_lingyu");
- player.storage.tenzen_lingyu = true;
- player.loseMaxHp();
- if (player.isHealthy()) player.draw(2);
- player.addSkills("tenzen_tianquan");
- },
- ai: {
- combo: "tenzen_yixing",
- },
- },
- tenzen_tianquan: {
- trigger: { player: "useCardToPlayered" },
- filter(event, player) {
- return (event.card.name == "sha" || event.card.name == "juedou") && event.targets.length == 1 && player.getExpansions("tenzen_yixing").length > 1;
- },
- logTarget: "target",
- usable: 1,
- check(event, player) {
- return get.attitude(player, event.target) < 0;
- },
- content() {
- "step 0";
- //player.viewHandcards(trigger.target);
- player.chooseButton(["选择移去两张“兴”", player.getExpansions("tenzen_yixing")], true, 2);
- "step 1";
- if (result.bool) {
- player.loseToDiscardpile(result.links);
- var cards = get.cards(5);
- player.showCards(cards, get.translation(player) + "发动了【天全】");
- game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent();
- var num = cards.filter(function (card) {
- return get.type(card, false) == "basic";
- }).length;
- if (num) {
- if (trigger.card.name == "sha") {
- var id = trigger.target.playerid;
- var map = trigger.getParent().customArgs;
- if (!map[id]) map[id] = {};
- if (typeof map[id].shanRequired == "number") {
- map[id].shanRequired += num;
- } else {
- map[id].shanRequired = 1 + num;
- }
- } else {
- var idt = trigger.target.playerid;
- var map = trigger.getParent().customArgs;
- if (!map[idt]) map[idt] = {};
- if (!map[idt].shaReq) map[idt].shaReq = {};
- if (!map[idt].shaReq[idt]) map[idt].shaReq[idt] = 1;
- map[idt].shaReq[idt]++;
- }
- }
- if (num < 5) {
- var next = game.createEvent("tenzen_lingyu_gain");
- next.cards = cards;
- next.player = player;
- event.next.remove(next);
- trigger.getParent().after.push(next);
- next.setContent(function () {
- if (
- player.getHistory("sourceDamage", function (evt) {
- return evt.card == event.parent.card;
- }).length > 0
- )
- player.gain(
- cards.filter(function (card) {
- return get.type(card, false) != "basic";
- }),
- "gain2"
- );
- });
- }
- }
- },
- },
- //伊座并杏子
- kyouko_rongzhu: {
- trigger: { global: "gainEnd" },
- filter(event, player) {
- if (player == event.player || event.getParent().name == "kyouko_rongzhu") return false;
- var evt = event.getl(player);
- return evt && evt.cards2 && evt.cards2.length > 0;
- },
- logTarget: "player",
- check(event, player) {
- return get.attitude(player, event.player) > 0;
- },
- content() {
- "step 0";
- player.draw();
- "step 1";
- var target = trigger.player;
- if (player.countCards("he") > 0 && target.isIn()) {
- player.chooseCard("he", true, "将一张牌交给" + get.translation(target));
- } else event.finish();
- "step 2";
- if (result.bool) {
- player.give(result.cards, trigger.player);
- var target = _status.currentPhase;
- var name;
- if (target == player) {
- name = "kyouko_rongzhu_me";
- player.addTempSkill(name);
- player.addMark(name, 1, false);
- } else if (target == trigger.player) {
- name = "kyouko_rongzhu_notme";
- target.addTempSkill(name);
- target.addMark(name, 1, false);
- }
- }
- },
- subSkill: {
- me: {
- mod: {
- maxHandcard(player, num) {
- return num + player.countMark("kyouko_rongzhu_me");
- },
- },
- intro: { content: "手牌上限+#" },
- onremove: true,
- },
- notme: {
- mod: {
- cardUsable(card, player, num) {
- if (card.name == "sha") return num + player.countMark("kyouko_rongzhu_notme");
- },
- },
- intro: { content: "使用杀的次数上限+#" },
- onremove: true,
- },
- },
- },
- kyouko_gongmian: {
- enable: "phaseUse",
- prompt: "出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。",
- filter(event, player) {
- return game.hasPlayer(function (current) {
- return current != player && lib.skill.kyouko_gongmian.filterTarget(null, player, current);
- });
- },
- filterTarget(card, kyouko, hina) {
- if (kyouko == hina || kyouko.getStorage("kyouko_gongmian").includes(hina)) return false;
- var hs = hina.countCards("he");
- if (hs == 0) return kyouko.countCards("h") == 0;
- return true;
- },
- content() {
- "step 0";
- player.markAuto("kyouko_gongmian", targets);
- var hs = player.countCards("h"),
- ts = target.countCards("h");
- player.getHistory("custom").push({ kyouko_gongmian: true });
- if (hs > ts) {
- event.utype = 1;
- target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌");
- } else if (hs == ts) {
- game.asyncDraw([player, target]);
- event.utype = 2;
- } else {
- event.utype = 3;
- player.gainPlayerCard(target, true, "he");
- }
- "step 1";
- if (event.utype == 2) {
- game.delayx();
- event.finish();
- } else if (!result.bool) event.finish();
- else if (event.utype == 1) target.give(result.cards, player);
- "step 2";
- if (player.countCards("he") > 0) {
- player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌");
- } else event.finish();
- "step 3";
- if (result.bool) player.give(result.cards, target);
- },
- intro: {
- content: "已与$共勉",
- },
- group: ["kyouko_gongmian_use", "kyouko_gongmian_discard"],
- ai: {
- order: 6,
- result: {
- target(player, target) {
- if (
- player.getHistory("custom", function (evt) {
- return evt.kyouko_gongmian == true;
- }).length
- )
- return 0;
- return 1;
- },
- },
- },
- },
- kyouko_gongmian_use: {
- trigger: { player: "phaseUseEnd" },
- filter(event, player) {
- return (
- player.getHistory("custom", function (evt) {
- return evt.kyouko_gongmian == true;
- }).length > 0 &&
- game.hasPlayer(function (current) {
- return current != player && current.countGainableCards(player, "hej") > 0;
- })
- );
- },
- async cost(event, trigger, player) {
- const num = player.getHistory("custom", function (evt) {
- return evt.kyouko_gongmian == true;
- }).length;
- event.result = await player
- .chooseTarget(get.prompt("kyouko_gongmian"), "获得一名其他角色的至多" + get.cnNumber(num) + "张牌,然后交给其等量的牌", function (card, player, target) {
- return target != player && target.countGainableCards(player, "hej") > 0;
- })
- .set("ai", function (target) {
- var player = _status.event.player,
- att = get.attitude(player, target);
- if (att > 0) return att;
- var he = player.getCards("he");
- if (
- target.countCards("he", function (card) {
- return get.value(card, target) > 7;
- }) &&
- he.length > 0
- )
- return (
- -att +
- 5 -
- Math.min.apply(
- Math,
- he.map(function (card) {
- return get.value(card, player);
- })
- )
- );
- return 0;
- })
- .forResult();
- },
- async content(event, trigger, player) {
- const num = player.getHistory("custom", function (evt) {
- return evt.kyouko_gongmian == true;
- }).length,
- target = event.targets[0];
- let result = await player.gainPlayerCard(target, "hej", true, [1, num]).forResult();
- if (target.isIn() && result.bool && result.cards && result.cards.length && player.countCards("he") > 0) {
- const num = result.cards.length,
- hs = player.getCards("he");
- if (hs.length <= num) result = { bool: true, cards: hs };
- else {
- result = await player.chooseCard("he", true, num, "交给" + get.translation(target) + get.cnNumber(num) + "张牌").forResult();
- }
- if (result.bool && result.cards && result.cards.length) {
- player.give(result.cards, target);
- }
- }
- },
- },
- kyouko_gongmian_discard: {
- trigger: { player: "phaseDiscardBegin" },
- filter(event, player) {
- var hs = player.countCards("h");
- return (
- hs > 0 &&
- player.getHistory("custom", function (evt) {
- return evt.kyouko_gongmian == true;
- }).length >= player.hp &&
- game.hasPlayer(function (current) {
- return current != player && current.countCards("h") < hs;
- })
- );
- },
- async cost(event, trigger, player) {
- event.result = await player
- .chooseTarget(get.prompt("kyouko_gongmian"), "获得一名其他角色的所有手牌,然后将一半的牌交给该角色(向上取整)", function (card, player, target) {
- return target != player && target.countCards("h") < player.countCards("h");
- })
- .forResult();
- },
- content() {
- "step 0";
- var target = event.targets[0];
- event.target = target;
- var hs = target.getCards("h");
- if (hs.length > 0) player.gain(hs, target, "giveAuto", "bySelf");
- "step 1";
- if (target.isIn() && player.countCards("h") > 0) {
- var hs = player.getCards("h"),
- num = Math.ceil(hs.length / 2);
- if (hs.length <= num) event._result = { bool: true, cards: hs };
- else player.chooseCard("he", true, num, "交给" + get.translation(target) + get.cnNumber(num) + "张牌");
- } else event.finish();
- "step 2";
- if (result.bool && result.cards && result.cards.length) {
- player.give(result.cards, target);
- }
- },
- },
- //冰室忧希
- yuuki_yicha: {
- trigger: { player: "phaseUseBegin" },
- frequent: true,
- createDialog(id) {
- var dialog = ui.create.dialog("hidden");
- (dialog.textPrompt = dialog.add("异插")).style.textAlign = "center";
- dialog.cards = [];
- dialog.rawButtons = [];
- dialog.videoId = id;
- var cards = [];
- for (var i = 0; i < 3; i++) {
- var card = ui.create.card(null, null, true);
- card.pos = i;
- card.pos_x = i;
- card.pos_y = 0;
- cards.push(card);
- dialog.rawButtons.push(card);
- }
- dialog.add(cards);
- cards = [];
- for (var i = 0; i < 3; i++) {
- var card = ui.create.card(null, null, true);
- card.pos = i + 3;
- card.pos_x = i;
- card.pos_y = 1;
- cards.push(card);
- dialog.rawButtons.push(card);
- }
- dialog.add(cards);
- for (var i of dialog.buttons) {
- i.pos_x = i.link.pos_x;
- i.pos_y = i.link.pos_y;
- i.link = i.link.pos;
- }
- dialog.open();
- },
- addCard(card, id, pos) {
- var dialog = get.idDialog(id);
- if (!dialog) return;
- for (var i = 0; i < dialog.buttons.length; i++) {
- var button = dialog.buttons[i];
- if (button.link == pos) {
- var card2 = ui.create.button(card, "card");
- card2.pos = button.link;
- card2.pos_x = button.pos_x;
- card2.pos_y = button.pos_y;
- card2.classList.add("noclick");
- button.parentNode.insertBefore(card2, button);
- dialog.cards.push(card2);
- button.remove();
- dialog.buttons.splice(i, 1);
- break;
- }
- }
- },
- changePrompt(str, id) {
- var dialog = get.idDialog(id);
- if (!dialog) return;
- dialog.textPrompt.innerHTML = str;
- },
- content() {
- "step 0";
- var next = game.createEvent("cardsGotoOrdering");
- next.cards = [];
- next.setContent("cardsGotoOrdering");
- event.videoId = lib.status.videoId++;
- event.forceDie = true;
- event.cards = [];
- event.positions = [0, 1, 2, 3, 4, 5];
- game.broadcastAll(function (id) {
- lib.skill.yuuki_yicha.createDialog(id);
- }, event.videoId);
- player.judge().set("callback", function () {
- event.getParent().orderingCards.remove(event.judgeResult.card);
- event.getParent(2).orderingCards.add(event.judgeResult.card);
- });
- "step 1";
- if (get.position(result.card, true) == "o") {
- var pos = event.positions.randomRemove();
- event._first_pos = pos;
- game.broadcastAll(
- function (card, id, player, pos) {
- lib.skill.yuuki_yicha.addCard(card, id, pos);
- lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id);
- },
- result.card,
- event.videoId,
- player,
- pos
- );
- cards.push(result.card);
- game.delay(2);
- }
- player.judge().set("callback", function () {
- event.getParent().orderingCards.remove(event.judgeResult.card);
- event.getParent(2).orderingCards.add(event.judgeResult.card);
- });
- "step 2";
- if (get.position(result.card, true) == "o") {
- var list = event.positions;
- if (get.isLuckyStar(player)) {
- var index = get.color(cards[0], false) == get.color(result.card, false) ? 0 : 1;
- list = list.filter(function (i) {
- return Math.abs((i % 2) - (event._first_pos % 2)) == index;
- });
- }
- var pos = list.randomRemove();
- game.broadcastAll(
- function (card, id, player, pos) {
- lib.skill.yuuki_yicha.addCard(card, id, pos);
- lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id);
- },
- result.card,
- event.videoId,
- player,
- pos
- );
- cards.push(result.card);
- game.delay(2);
- }
- if (cards.length) event.count = 4;
- else {
- game.broadcastAll("closeDialog", event.videoId);
- event.finish();
- }
- "step 3";
- event.count--;
- player.judge().set("callback", function () {
- event.getParent().orderingCards.remove(event.judgeResult.card);
- event.getParent(2).orderingCards.add(event.judgeResult.card);
- });
- "step 4";
- var card = result.card;
- event.card = card;
- var str = "请选择一个位置放置" + get.translation(card);
- if (player == game.me || player.isUnderControl()) {
- lib.skill.yuuki_yicha.changePrompt(str, event.videoId);
- } else if (player.isOnline()) {
- player.send(
- function (str, id) {
- lib.skill.yuuki_yicha.changePrompt(str, event.videoId);
- },
- str,
- id
- );
- }
- player
- .chooseButton()
- .set("dialog", event.videoId)
- .set("filterButton", function (button) {
- var posx = button.pos_x,
- posy = button.pos_y;
- var list = [],
- cards = ui.dialog.cards;
- for (var i of cards) {
- if (i.pos_x == posx && Math.abs(i.pos_y - posy) == 1) list.push(i.link);
- if (i.pos_y == posy && Math.abs(i.pos_x - posx) == 1) list.push(i.link);
- }
- if (list.length > 0) {
- var color = get.color(list[0], false);
- if (list.length > 1) {
- for (var i = 1; i < list.length; i++) {
- if (get.color(list[i]) != color) return false;
- }
- }
- return get.color(_status.event.card, false) != color;
- }
- return false;
- })
- .set("card", card);
- "step 5";
- if (result.bool) {
- cards.push(card);
- event.positions.remove(result.links[0]);
- game.broadcastAll(
- function (card, id, pos, player) {
- lib.skill.yuuki_yicha.addCard(card, id, pos);
- lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id);
- },
- card,
- event.videoId,
- result.links[0],
- player
- );
- game.delay(2);
- }
- if (event.count > 0) event.goto(3);
- "step 6";
- game.broadcastAll("closeDialog", event.videoId);
- player.chooseTarget("令一名角色获得" + get.translation(cards), true).set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- });
- "step 7";
- if (result.bool && result.targets && result.targets.length) {
- var target = result.targets[0];
- player.line(target, "green");
- target.gain(cards, "gain2");
- }
- },
- },
- //库特莉亚芙卡
- kud_qiaoshou: {
- enable: "phaseUse",
- usable: 1,
- filter(event, player) {
- return !player.getExpansions("kud_qiaoshou_equip").length && player.countCards("h") > 0;
- },
- chooseButton: {
- dialog() {
- var list = [];
- var list2 = ["pyzhuren_heart", "pyzhuren_diamond", "pyzhuren_club", "pyzhuren_spade", "pyzhuren_shandian", "rewrite_zhuge"];
- list2.addArray(lib.inpile);
- for (var i of list2) {
- var sub = get.subtype(i);
- if (["equip1", "equip4"].includes(sub)) list.push([sub, "", i]);
- }
- return ui.create.dialog("巧手:选择一种装备牌", [list, "vcard"], "hidden");
- },
- check(button) {
- var player = _status.event.player;
- var name = button.link[2];
- if (get.subtype(name) == "equip4" || player.getEquip(name)) return 0;
- var sha = player.countCards("h", "sha");
- switch (name) {
- case "rewrite_zhuge":
- return sha - player.getCardUsable("sha");
- case "guding":
- if (
- sha > 0 &&
- game.hasPlayer(function (current) {
- return get.attitude(player, current) < 0 && !current.countCards("h") && player.canUse("sha", current) && get.effect(current, { name: "sha" }, player) > 0;
- })
- )
- return 1.4 + Math.random();
- return 0;
- case "guanshi":
- if (sha > 0) return 0.7 + Math.random();
- return 0;
- case "qinggang":
- if (sha > 0) return 0.4 + Math.random();
- return 0;
- case "zhuque":
- if (
- game.hasPlayer(function (current) {
- return get.attitude(player, current) < 0 && current.getEquip("tengjia") && get.effect(current, { name: "sha", nature: "fire" }, player) > 0;
- })
- )
- return 1.2 + Math.random();
- return 0;
- default:
- return 0;
- }
- },
- backup(links) {
- var next = get.copy(lib.skill.kud_qiaoshou_backupx);
- next.cardname = links[0][2];
- return next;
- },
- prompt(links) {
- return "将一张手牌置于武将牌上,然后视为装备" + get.translation(links[0][2]);
- },
- },
- group: "kud_qiaoshou_end",
- ai: {
- notemp: true,
- order: 5,
- result: {
- player: 1,
- },
- },
- },
- kud_qiaoshou_backupx: {
- filterCard: true,
- discard: false,
- lose: false,
- delay: false,
- check(event, player) {
- return 6 - get.value(card);
- },
- content() {
- "step 0";
- player.addToExpansion(cards, player, "give").gaintag.add("kud_qiaoshou_equip");
- "step 1";
- if (!player.getExpansions("kud_qiaoshou_equip").length) return;
- player.addTempSkill("kud_qiaoshou_equip", {
- player: ["phaseUseEnd", "phaseZhunbeiBegin"],
- });
- var name = lib.skill.kud_qiaoshou_backup.cardname;
- player.storage.kud_qiaoshou_equip2 = name;
- var info = lib.card[name].skills;
- if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info);
- player.draw();
- game.log(player, "声明了", "#y" + get.translation(name));
- },
- ai: {
- result: {
- player: 1,
- },
- },
- },
- kud_qiaoshou_equip: {
- charlotte: true,
- mod: {
- globalFrom(from, to, distance) {
- var info = lib.card[from.storage.kud_qiaoshou_equip2];
- if (info && info.distance && info.distance.globalFrom) return distance + info.distance.globalFrom;
- },
- globalTo(from, to, distance) {
- var info = lib.card[to.storage.kud_qiaoshou_equip2];
- if (info && info.distance && info.distance.globalTo) return distance + info.distance.globalTo;
- },
- attackRange(from, distance) {
- var info = lib.card[from.storage.kud_qiaoshou_equip2];
- if (info && info.distance && info.distance.attackFrom) return distance - info.distance.attackFrom;
- },
- attackTo(from, to, distance) {
- var info = lib.card[to.storage.kud_qiaoshou_equip2];
- if (info && info.distance && info.distance.attackTo) return distance + info.distance.attackTo;
- },
- },
- onremove(player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- intro: {
- markcount: "expansion",
- mark(dialog, storage, player) {
- dialog.add(player.getExpansions("kud_qiaoshou_equip"));
- dialog.addText("当前装备:" + get.translation(player.storage.kud_qiaoshou_equip2));
- var str2 = lib.translate[player.storage.kud_qiaoshou_equip2 + "_info"];
- if (str2) {
- if (str2.length >= 12) dialog.addText(str2, false);
- else dialog.addText(str2);
- }
- },
- onunmark(storage, player) {
- player.removeAdditionalSkill("kud_qiaoshou_equip");
- delete player.storage.kud_qiaoshou_equip2;
- player.addEquipTrigger();
- },
- },
- },
- kud_qiaoshou_end: {
- trigger: { player: "phaseJieshuBegin" },
- filter(event, player) {
- return player.countCards("h") > 0 && !player.getExpansions("kud_qiaoshou_equip").length;
- },
- cost() {
- "step 0";
- var list = [];
- var list2 = ["rewrite_bagua", "rewrite_renwang", "rewrite_tengjia", "rewrite_baiyin"];
- list2.addArray(lib.inpile);
- for (var i of list2) {
- var sub = get.subtype(i);
- if (["equip2", "equip3"].includes(sub)) list.push([sub, "", i]);
- }
- player.chooseButton([get.prompt("kud_qiaoshou"), [list, "vcard"]]).set("ai", function (button) {
- var player = _status.event.player;
- var name = button.link[2];
- if (get.subtype(name) == "equip3" || player.getEquip(name)) return false;
- switch (name) {
- case "yexingyi":
- if (player.hp > 2 || player.getEquip("bagua") || player.getEquip("tengjia")) return 1.5 + Math.random();
- return 0.5 + Math.random();
- case "rewrite_bagua":
- case "rewrite_renwang":
- if (player.getEquip("bagua") || player.getEquip("tengjia") || player.getEquip("renwang")) return Math.random();
- return 1.2 + Math.random();
- case "rewrite_tengjia":
- if (player.getEquip("baiyin")) return 1.3 + Math.random();
- return Math.random();
- case "rewrite_baiyin":
- return 0.4 + Math.random();
- default:
- return 0;
- }
- });
- "step 1";
- if (result.bool) {
- event.cardname = result.links[0][2];
- player.chooseCard("h", true, "将一张手牌置于武将牌上,然后视为装备" + get.translation(event.cardname));
- } else event.finish();
- "step 2";
- if (result.bool) {
- event.result = {
- bool: true,
- cards: result.cards,
- cost_data: {
- cardname: event.cardname,
- },
- };
- }
- },
- async content(event, trigger, player) {
- await player.addToExpansion(event.cards, player, "give").gaintag.add("kud_qiaoshou_equip");
- if (!player.getExpansions("kud_qiaoshou_equip").length) return;
- player.addTempSkill("kud_qiaoshou_equip", {
- player: ["phaseUseEnd", "phaseZhunbeiBegin"],
- });
- var name = event.cost_data.cardname;
- player.storage.kud_qiaoshou_equip2 = name;
- player.markAuto("kud_qiaoshou_equip", cards);
- var info = lib.card[name].skills;
- if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info);
- game.log(player, "声明了", "#y" + get.translation(name));
- await player.draw();
- },
- },
- kud_buhui: {
- enable: "chooseToUse",
- filter(event, player) {
- return event.type == "dying" && player == event.dying && player.getExpansions("kud_qiaoshou_equip").length + player.countCards("e") > 0;
- },
- skillAnimation: true,
- limited: true,
- animationColor: "gray",
- content() {
- "step 0";
- player.awakenSkill("kud_buhui");
- var cards = player.getCards("e").concat(player.getExpansions("kud_qiaoshou_equip"));
- if (cards.length) player.discard(cards);
- player.removeSkill("kud_qiaoshou_equip");
- player.draw(cards.length);
- player.addSkills("kud_chongzhen");
- "step 1";
- var num = 2 - player.hp;
- if (num) player.recover(num);
- },
- derivation: "riki_chongzhen",
- ai: {
- order: 0.5,
- result: {
- player: 1,
- },
- save: true,
- skillTagFilter(player, tag, target) {
- return player == target;
- },
- },
- },
- kud_chongzhen: {
- inherit: "riki_chongzhen",
- },
- //神尾观铃
- misuzu_hengzhou: {
- trigger: {
- player: ["phaseJieshuBegin", "recoverEnd", "damageEnd", "phaseDrawBegin2", "phaseZhunbeiBegin"],
- },
- forced: true,
- character: true,
- filter(event, player) {
- if (event.name == "phaseZhunbei") return true;
- if (["damage", "recover"].includes(event.name)) return event.num > 0;
- var num = player.countMark("misuzu_hengzhou");
- if (event.name == "phaseDraw") return num > 0 && !event.numFixed;
- return num > 3;
- },
- content() {
- var num = player.countMark("misuzu_hengzhou");
- if (trigger.name == "phaseDraw") trigger.num += num;
- else if (trigger.name == "phaseJieshu") {
- player.removeMark("misuzu_hengzhou", num);
- player.loseHp();
- } else player.addMark("misuzu_hengzhou", trigger.num || 1);
- },
- intro: {
- name: "诅咒",
- name2: "诅咒",
- content: "mark",
- },
- marktext: "诅",
- mod: {
- maxHandcard(player, num) {
- return num + player.countMark("misuzu_hengzhou");
- },
- },
- ai: {
- notemp: true,
- },
- },
- misuzu_nongyin: {
- enable: "chooseToUse",
- viewAs: {
- name: "tao",
- isCard: true,
- },
- viewAsFilter(player) {
- return (
- !player.hasJudge("lebu") &&
- player.countCards("hes", function (card) {
- return get.color(card) == "red" && get.type(card, "trick") != "trick";
- })
- );
- },
- filterCard(card) {
- return get.color(card) == "red" && get.type(card, "trick") != "trick";
- },
- check(card) {
- return 7 + (_status.event.dying || _status.event.player).getDamagedHp() - get.value(card);
- },
- ignoreMod: true,
- position: "hes",
- precontent() {
- player.logSkill("misuzu_nongyin");
- player.$throw(event.result.cards);
- player.addJudge({ name: "lebu" }, event.result.cards);
- event.result.card.cards = [];
- event.result.cards = [];
- delete event.result.skill;
- delete event.result.card.suit;
- delete event.result.card.number;
- },
- ai: {
- result: 0.5,
- },
- },
- misuzu_zhongxing: {
- trigger: {
- player: "loseAfter",
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- filter(event, player) {
- var evt = event.getl(player);
- return evt && evt.js && evt.js.length > 0 && !player.hasSkill("misuzu_zhongxing_haruko");
- },
- async cost(event, trigger, player) {
- event.result = await player
- .chooseTarget(get.prompt("misuzu_zhongxing"), "令一名角色选择摸两张牌或回复1点体力")
- .set("ai", function (card) {
- return get.attitude(_status.event.player, card);
- })
- .forResult();
- },
- async content(event, trigger, player) {
- var target = event.targets[0];
- player.logSkill("misuzu_zhongxing", target);
- player.addTempSkill("misuzu_zhongxing_haruko");
- target.chooseDrawRecover(2, true);
- },
- },
- misuzu_zhongxing_haruko: { charlotte: true },
- //久岛鸥
- kamome_suitcase: {
- trigger: {
- player: ["phaseJudgeBefore", "phaseDiscardBefore", "turnOverBefore"],
- },
- forced: true,
- popup: false,
- equipSkill: true,
- content() {
- trigger.cancel();
- },
- },
- kamome_yangfan: {
- trigger: {
- player: ["loseAfter", "enterGame"],
- global: ["equipAfter", "addJudgeAfter", "phaseBefore", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- forced: true,
- filter(event, player) {
- if (typeof event.getl != "function") return event.name != "phase" || game.phaseNumber == 0;
- var evt = event.getl(player);
- return evt && evt.player == player && evt.es && evt.es.length;
- },
- content() {
- if (trigger.getl) player.draw(2 * trigger.getl(player).es.length);
- else player.equip(game.createCard2("kamome_suitcase", "spade", 1));
- },
- ai: {
- noe: true,
- reverseEquip: true,
- effect: {
- target(card, player, target, current) {
- if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3];
- },
- },
- },
- },
- kamome_huanmeng: {
- trigger: { player: "phaseZhunbeiBegin" },
- frequent: true,
- content() {
- "step 0";
- var num = 1 + player.countCards("e");
- 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,
- },
- },
- kamome_jieban: {
- trigger: {
- player: "damageEnd",
- source: "damageSource",
- },
- zhuanhuanji: true,
- marktext: "☯",
- mark: true,
- intro: {
- content(storage, player) {
- return "转换技。每回合限一次,当你受到或造成伤害后," + (!storage ? "你可将两张牌交给一名其他角色,然后其交给你一张牌。" : "你可将一张牌交给一名其他角色,然后其交给你两张牌。");
- },
- },
- filter(event, player) {
- var num = player.storage.kamome_jieban ? 1 : 2;
- return player.countCards("he") >= num && !player.hasSkill("kamome_jieban_phase");
- },
- async cost(event, trigger, player) {
- event.num = player.storage.kamome_jieban ? 1 : 2;
- event.result = await player
- .chooseCardTarget({
- position: "he",
- filterCard: true,
- filterTarget: lib.filter.notMe,
- selectCard: event.num,
- prompt: get.prompt("kamome_jieban"),
- prompt2: event.num == 2 ? "将两张牌交给一名其他角色,然后其交给你一张牌。" : "将一张牌交给一名其他角色,然后其交给你两张牌。",
- ai1(card) {
- if (card.name == "du") return 20;
- var val = get.value(card);
- var player = _status.event.player;
- if (get.position(card) == "e") {
- if (val <= 0) return 10;
- return 10 / val;
- }
- return 6 - val;
- },
- ai2(target) {
- var player = _status.event.player;
- var att = get.attitude(player, target);
- if (ui.selected.cards[0].name == "du") return -2 * att;
- if (att > 0) return 1.5 * att;
- var num = get.select(_status.event.selectCard)[1];
- if (att < 0 && num == 1) return -0.7 * att;
- return att;
- },
- })
- .forResult();
- },
- content() {
- "step 0";
- event.num = player.storage.kamome_jieban ? 1 : 2;
- var target = targets[0];
- event.target = target;
- player.addTempSkill("kamome_jieban_phase");
- player.give(cards, target);
- player.changeZhuanhuanji("kamome_jieban");
- "step 1";
- var num = 3 - event.num;
- var hs = target.getCards("he");
- if (hs.length) {
- if (hs.length <= num) event._result = { bool: true, cards: hs };
- else {
- target.chooseCard("he", true, "交给" + get.translation(player) + get.cnNumber(num) + "张牌", num).set("ai", function (card) {
- var player = _status.event.player;
- var target = _status.event.getParent().player;
- if (get.attitude(player, target) > 0) {
- if (!target.hasShan() && card.name == "shan") return 10;
- if (get.type(card) == "equip" && !get.cardtag(card, "gifts") && target.hasUseTarget(card)) return 10 - get.value(card);
- return 6 - get.value(card);
- }
- return -get.value(card);
- });
- }
- } else event.finish();
- "step 2";
- target.give(result.cards, player);
- },
- },
- kamome_jieban_phase: { charlotte: true },
- //友利奈绪
- nao_duyin: {
- trigger: { global: "phaseBegin" },
- filter(event, player) {
- return event.player != player && (!player.storage.nao_duyin || !player.storage.nao_duyin.includes(event.player));
- },
- logTarget: "player",
- charlotte: true,
- check() {
- return false;
- },
- content() {
- "step 0";
- player.chooseToDiscard("he", "弃置一张牌,或将武将牌翻面").set("ai", function (card) {
- if (_status.event.player.isTurnedOver()) return 0;
- return 6 - get.value(card);
- });
- "step 1";
- if (!result.bool) player.turnOver();
- player.addTempSkill("nao_duyin2", { player: "phaseAfter" });
- if (!player.storage.nao_duyin) player.storage.nao_duyin = [];
- player.storage.nao_duyin.push(trigger.player);
- if (!player.storage.nao_duyin2) player.storage.nao_duyin2 = [];
- player.storage.nao_duyin2.push(trigger.player);
- player.markSkill("nao_duyin2");
- },
- },
- nao_duyin2: {
- intro: {
- content: "$不能使用牌指定你为目标,对$使用牌没有距离和次数限制",
- },
- mod: {
- targetEnabled(card, player, target) {
- if (target.storage.nao_duyin2 && target.storage.nao_duyin2.includes(player)) return false;
- },
- targetInRange(card, player, target) {
- if (player.storage.nao_duyin2 && player.storage.nao_duyin2.includes(target)) return true;
- },
- },
- trigger: { player: "useCardEnd" },
- firstDo: true,
- silent: true,
- onremove: true,
- filter(event, player) {
- if (player.storage.nao_duyin2) {
- for (var i of player.storage.nao_duyin2) {
- if (event.targets.includes(i)) return true;
- }
- }
- return false;
- },
- content() {
- if (trigger.addCount !== false) {
- trigger.addCount = false;
- var stat = player.getStat();
- if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--;
- }
- },
- },
- nao_wanxin: {
- trigger: { global: "phaseEnd" },
- hasHistory(player) {
- return player.getHistory("damage").length > 0;
- },
- filter(event, player) {
- return game.hasPlayer(function (current) {
- return lib.skill.nao_wanxin.hasHistory(current);
- });
- },
- async cost(event, trigger, player) {
- event.result = await player
- .chooseTarget(get.prompt2("nao_wanxin"), function (card, player, target) {
- return _status.event.yuus.includes(target);
- })
- .set(
- "yuus",
- game.filterPlayer(function (current) {
- return lib.skill.nao_wanxin.hasHistory(current);
- })
- )
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- })
- .forResult();
- },
- async content(event, trigger, player) {
- const target = event.targets[0];
- await target.draw(2);
- await player.turnOver(false);
- await player.link(false);
- if (target == player) return;
- await target.turnOver(false);
- await target.link(false);
- },
- },
- nao_shouqing: {
- global: "nao_shouqing2",
- },
- nao_shouqing2: {
- enable: "phaseUse",
- viewAs() {
- return { name: "tao" };
- },
- filterCard: { name: "tao" },
- ignoreMod: true,
- filterTarget(card, player, target) {
- return target != player && target.isDamaged() && target.hasSkill("nao_shouqing");
- },
- selectTarget() {
- return game.countPlayer(function (current) {
- return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current);
- }) > 1
- ? 1
- : -1;
- },
- filter(event, player) {
- return (
- player.countCards("hs", "tao") &&
- game.hasPlayer(function (current) {
- return lib.skill.nao_shouqing2.filterTarget(null, player, current);
- })
- );
- },
- position: "hs",
- onuse(links, player) {
- player.addSkill("nao_shouqing3");
- player.addMark("nao_shouqing3", 1, false);
- },
- prompt() {
- var list = game.filterPlayer(function (current) {
- return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current);
- });
- var str = "对" + get.translation(list);
- if (list.length > 1) str += "中的一名角色";
- str += "使用一张【桃】";
- return str;
- },
- },
- nao_shouqing3: {
- intro: {
- content: "手牌上限+#",
- },
- mod: {
- maxHandcard(player, num) {
- return num + player.countMark("nao_shouqing3");
- },
- },
- trigger: { player: "useCardAfter" },
- forced: true,
- popup: false,
- filter(event, player) {
- return event.skill == "nao_shouqing2";
- },
- content() {
- player.draw();
- },
- },
nsqiyue: {
trigger: {
diff --git a/character/diy/sort.js b/character/diy/sort.js
index 76b1b3faa..6fbc9df30 100644
--- a/character/diy/sort.js
+++ b/character/diy/sort.js
@@ -1,7 +1,7 @@
const characterSort = {
- diy_yijiang: ["key_kud", "key_misuzu", "key_kamome", "key_nao", "ns_huangchengyan", "ns_sunchensunjun", "ns_yuanxi", "ns_caoshuang"],
- diy_yijiang2: ["key_yuuki", "key_tenzen", "key_kyouko", "key_kotarou", "key_kyou", "ns_chentai", "ns_huangwudie", "ns_sunyi", "ns_zhangning", "ns_yanghu"],
- diy_yijiang3: ["ns_ruanji", "ns_zanghong", "ns_limi", "ns_zhonglimu", "prp_zhugeliang", "key_seira", "key_kiyu", "key_tomoyo", "key_minagi", "key_michiru"],
+ diy_yijiang: ["ns_huangchengyan", "ns_sunchensunjun", "ns_yuanxi", "ns_caoshuang"],
+ diy_yijiang2: ["ns_chentai", "ns_huangwudie", "ns_sunyi", "ns_zhangning", "ns_yanghu"],
+ diy_yijiang3: ["ns_ruanji", "ns_zanghong", "ns_limi", "ns_zhonglimu", "prp_zhugeliang"],
diy_tieba: ["ns_zuoci", "ns_lvzhi", "ns_wangyun", "ns_nanhua", "ns_nanhua_left", "ns_nanhua_right", "ns_huamulan", "ns_huangzu", "ns_jinke", "ns_yanliang", "ns_wenchou", "ns_caocao", "ns_caocaosp", "ns_zhugeliang", "ns_wangyue", "ns_yuji", "ns_xinxianying", "ns_guanlu", "ns_simazhao", "ns_sunjian", "ns_duangui", "ns_zhangbao", "ns_masu", "ns_zhangxiu", "ns_lvmeng", "ns_shenpei", "ns_yujisp", "ns_yangyi", "ns_liuzhang", "ns_xinnanhua", "ns_luyusheng"],
diy_fakenews: ["diy_wenyang", "ns_zhangwei", "ns_caimao", "ns_chengpu", "ns_sundeng", "ns_duji", "ns_mengyou"],
diy_xushi: ["diy_feishi", "diy_hanlong", "diy_liufu", "diy_liuyan", "diy_liuzan", "diy_tianyu", "diy_xizhenxihong", "diy_yangyi", "diy_zaozhirenjun"],
diff --git a/character/diy/translate.js b/character/diy/translate.js
index bdcef0e4a..5bea28f90 100644
--- a/character/diy/translate.js
+++ b/character/diy/translate.js
@@ -63,103 +63,6 @@ const translates = {
ns_xinnanhua: "南华老仙",
ns_luyusheng: "陆郁生",
- key_kud: "库特莉亚芙卡",
- kud_qiaoshou: "巧手",
- kud_qiaoshou_equip: "巧手",
- kud_qiaoshou_end: "巧手",
- kud_qiaoshou_backup: "巧手",
- kud_qiaoshou_info: "出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。",
- kud_buhui: "不悔",
- kud_buhui_info: "限定技,当你进入濒死状态时,你可以弃置“巧”和装备区内的所有牌(至少一张)并摸等量的牌,将体力回复至2点,获得技能〖重振〗。",
- key_misuzu: "神尾观铃",
- misuzu_hengzhou: "恒咒",
- misuzu_hengzhou_info: "锁定技,准备阶段开始时,或当你受到1点伤害或回复1点体力后,你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时,若X大于3,则你移去所有“诅咒”标记并失去1点体力。(X为“诅咒”标记数)",
- misuzu_nongyin: "浓饮",
- misuzu_nongyin_info: "当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。",
- misuzu_zhongxing: "终幸",
- misuzu_zhongxing_info: "每回合限一次,当你判定区的牌移动到其他区域后,你可令一名角色回复1点体力或摸两张牌。",
- key_kamome: "久岛鸥",
- kamome_yangfan: "扬帆",
- kamome_yangfan_info: "锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。",
- kamome_huanmeng: "幻梦",
- kamome_huanmeng_info: "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)",
- kamome_jieban: "结伴",
- kamome_jieban_info: "转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。",
- kamome_suitcase: "旅行箱",
- kamome_suitcase_info: "锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。",
- key_nao: "友利奈绪",
- nao_duyin: "独隐",
- nao_duyin2: "独隐",
- nao_duyin_info: "一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。",
- nao_wanxin: "挽心",
- nao_wanxin_info: "一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。",
- nao_shouqing: "守情",
- nao_shouqing2: "守情",
- nao_shouqing3: "守情",
- nao_shouqing_info: "其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。",
- key_yuuki: "冰室忧希",
- yuuki_yicha: "异插",
- yuuki_yicha_info: "出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。",
- key_kyouko: "伊座并杏子",
- kyouko_rongzhu: "容助",
- kyouko_rongzhu_info: "其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1;若你是当前回合角色,则你本回合的手牌上限+1。",
- kyouko_gongmian: "共勉",
- kyouko_gongmian_use: "共勉",
- kyouko_gongmian_exchange: "共勉",
- kyouko_gongmian_info: "①出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。②出牌阶段结束时,你可以获得一名其他角色区域内的至多X张牌,然后交给其等量的牌。③弃牌阶段开始时,若X不小于你的体力值,你可以获得一名手牌数少于你的角色的所有手牌,然后将手牌数的一半(向上取整)交给该角色。(X为你本回合内发动过〖共勉①〗的次数)",
- key_tenzen: "加纳天善",
- tenzen_yixing: "弈兴",
- tenzen_yixing_info: "当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。",
- //若对方为水织静久则无法触发〖弈兴〗
- tenzen_lingyu: "领域",
- tenzen_lingyu_info: "觉醒技,准备阶段,若你的“兴”不小于你的体力值,则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力,则你摸两张牌。",
- tenzen_tianquan: "天全",
- tenzen_tianquan_info: "每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后,若此牌造成过伤害,则你获得这些牌中的非基本牌。",
- key_kotarou: "天王寺瑚太朗",
- kotarou_aurora: "丝刃",
- kotarou_aurora_info: "锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。",
- kotarou_rewrite: "改写",
- kotarou_rewrite_damage: "改写",
- kotarou_rewrite_recover: "改写",
- kotarou_rewrite_sha: "改写",
- kotarou_rewrite_block: "改写",
- kotarou_rewrite_info: "出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加1点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。",
- key_kyou: "藤林杏",
- kyou_zhidian: "掷典",
- kyou_zhidian_info: "你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。",
- kyou_duanfa: "断发",
- kyou_duanfa_info: "限定技,当你受到伤害时,若伤害值不小于你的体力值,则你可弃置所有手牌,防止此伤害并回复1点体力;且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后,你摸一张牌。",
- key_seira: "樱庭星罗",
- seira_xinghui: "星辉",
- seira_xinghui_info: "准备阶段,你可以投掷一枚骰子,观看牌堆顶的X张牌(X为投掷点数)并以任意顺序扣置于一名没有“星屑”的角色的武将牌上,称为“星屑”。有“星屑”的角色造成的伤害+1,且当其从牌堆顶摸牌或取得判定牌时,改为从“星屑”中获取。",
- seira_yuanying: "缘映",
- seira_yuanying_info: "出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。",
- seira_yinyuan: "姻缘",
- seira_yinyuan_info: "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。",
- key_kiyu: "露娜Q",
- kiyu_yuling: "玉灵",
- kiyu_yuling_info: "锁定技。你不是有距离限制的锦囊牌的合法目标;你成为【杀】的目标后,使用者需弃置X张牌(X为其至你的距离)。",
- kiyu_xianyu: "先预",
- kiyu_xianyu_info: "每轮限一次。一名角色的出牌阶段开始时,你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时,你摸X张牌,且其本回合的手牌上限+X(X为你的预测与其实际使用顺序的吻合数且至多为3)。",
- kiyu_rexianyu: "先预",
- kiyu_rexianyu_info: "每轮限一次。出牌阶段结束时,你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时,其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用(X至多为3);若如此做,你摸一张牌,且其本回合的手牌上限+1。",
- key_tomoyo: "坂上智代",
- tomoyo_wuwei: "武威",
- tomoyo_wuwei_info: "①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。",
- tomoyo_zhengfeng: "整风",
- tomoyo_zhengfeng_info: "使命技。①准备阶段,你可以令攻击范围内的一名角色进行判定。若如此做,你获得如下效果直到下回合开始:你视为在该角色的攻击范围内,且当该角色使用与判定牌颜色相同的牌时,你摸一张牌。②失败:结束阶段,若你于本回合内未发动过〖整风①〗,则你可以减1点体力上限。你失去〖武威〗,摸两张牌并回复1点体力,然后获得〖长誓〗。",
- tomoyo_changshi: "长誓",
- tomoyo_changshi_info: "锁定技。一名攻击范围内包含你的角色回复体力后,你获得1点护甲;一名攻击范围内包含你的角色一次性获得至少两张牌后,你摸一张牌。",
- key_minagi: "远野美凪",
- minagi_peiquan: "配券",
- minagi_peiquan_info: "锁定技。①游戏开始时,你将你所有的手牌记录为“米券”。②出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。",
- minagi_huanliu: "幻流",
- minagi_huanliu_info: "准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。",
- key_michiru: "远野小满",
- michiru_sheyuan: "舍愿",
- michiru_sheyuan_info: "每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。",
- minagi_tag: "米券",
-
noname: "小无",
noname_zhuyuan: "祝愿",
noname_zhuyuan_info: "①每回合每名角色限一次。出牌阶段,你可以将四张花色各不相同的牌交给一名其他角色。你与其获得技能〖铁骑〗和〖激昂〗至各自的回合结束。②锁定技,若你于当前回合内:未发动过〖祝愿〗,则你使用牌无次数限制;发动过〖祝愿〗,则你使用牌无距离限制。",
diff --git a/character/extra/character.js b/character/extra/character.js
index 35df5f7c2..3467af923 100644
--- a/character/extra/character.js
+++ b/character/extra/character.js
@@ -13,9 +13,6 @@ const characters = {
shen_machao: ["male", "shen", 4, ["shouli", "hengwu"], ["shu"]],
shen_sunquan: ["male", "shen", 4, ["junkyuheng", "junkdili"], ["wu"]],
shen_jiangwei: ["male", "shen", 4, ["jiufa", "tianren", "pingxiang"], ["shu"]],
- key_kagari: ["female", "shen", 3, ["kagari_zongsi"], ["key"]],
- key_shiki: ["female", "shen", "3/5", ["shiki_omusubi"], ["key"]],
- db_key_hina: ["female", "key", 3, ["hina_shenshi", "hina_xingzhi"], ["doublegroup:key:shen"]],
shen_sunce: ["male", "shen", "1/6", ["yingba", "scfuhai", "pinghe"], ["wu"]],
shen_xunyu: ["male", "shen", 3, ["tianzuo", "lingce", "dinghan"], ["wei", "clan:颍川荀氏"]],
diff --git a/character/extra/characterFilter.js b/character/extra/characterFilter.js
index f7b687897..14004adc3 100644
--- a/character/extra/characterFilter.js
+++ b/character/extra/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
shen_diaochan(mode) {
return mode == "identity" || mode == "doudizhu" || mode == "single" || (mode == "versus" && _status.mode != "standard" && _status.mode != "three");
diff --git a/character/extra/skill.js b/character/extra/skill.js
index 4a8cfc98d..7354d3af0 100644
--- a/character/extra/skill.js
+++ b/character/extra/skill.js
@@ -4049,77 +4049,6 @@ const skills = {
},
},
},
- hina_shenshi: {
- groupSkill: true,
- trigger: { player: ["phaseUseBegin", "phaseUseEnd"] },
- frequent: true,
- filter(event, player) {
- return player.group == "shen";
- },
- content() {
- "step 0";
- player.draw(2).gaintag = ["hina_shenshi"];
- player.addSkill("hina_shenshi_yingbian");
- "step 1";
- var cards = player.getCards("h", function (card) {
- return card.hasGaintag("hina_shenshi");
- });
- if (!cards.length) event.finish();
- else if (cards.length == 1) event._result = { bool: true, cards: cards };
- else
- player.chooseCard("h", true, "将一张“神视”牌置于牌堆顶", function (card) {
- return card.hasGaintag("hina_shenshi");
- });
- "step 2";
- if (result.bool) {
- game.log(player, "将一张牌置于了牌堆顶");
- player.lose(result.cards, ui.cardPile, "insert");
- player.$throw(1, 1000);
- } else event.finish();
- "step 3";
- game.delayx();
- },
- onremove(player) {
- player.removeGaintag("hina_shenshi");
- },
- group: "hina_shenshi_yingbian",
- },
- hina_shenshi_yingbian: {
- trigger: { player: "yingbian" },
- forced: true,
- filter: (event, player) => event.card.isCard && player.hasHistory("lose", evt => evt.getParent() == event && Object.values(evt.gaintag_map).some(value => value.includes("hina_shenshi"))),
- content: () => {
- if (!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian = [];
- trigger.temporaryYingbian.add("force");
- trigger.temporaryYingbian.addArray(get.yingbianEffects());
- },
- },
- hina_xingzhi: {
- groupSkill: true,
- trigger: { player: "yingbian" },
- usable: 1,
- filter: (event, player) => player.group == "key" && !event.card.yingbian && lib.yingbian.condition.complex.has("zhuzhan"),
- content: () => {
- "step 0";
- trigger.yingbianZhuzhanAI = (player, card, source, targets) => cardx => {
- if (get.attitude(player, source) <= 0) return 0;
- var info = get.info(card),
- num = 0;
- if (info && info.ai && info.ai.yingbian) {
- var ai = info.ai.yingbian(card, source, targets, player);
- if (ai) num = ai;
- }
- return Math.max(num, 6) - get.value(cardx);
- };
- trigger.afterYingbianZhuzhan = event => event.zhuzhanresult.draw(2);
- lib.yingbian.condition.complex.get("zhuzhan")(trigger);
- "step 1";
- if (!result.bool) return;
- trigger.card.yingbian = true;
- lib.yingbian.effect.forEach(value => game.yingbianEffect(trigger, value));
- player.addTempSkill("yingbian_changeTarget");
- },
- },
yingba: {
audio: 2,
mod: {
@@ -5396,179 +5325,6 @@ const skills = {
delete player._trueMe;
},
},
- shiki_omusubi: {
- audio: 2,
- trigger: { global: "roundStart" },
- direct: true,
- content() {
- "step 0";
- player.chooseTarget(get.prompt2("shiki_omusubi"), lib.filter.notMe).set("ai", function (target) {
- var player = _status.event.player;
- if (player.isHealthy()) return 0;
- if (player.hp < 3 && player.getDamagedHp() < 2) return 0;
- var list = [];
- if (lib.character[target.name]) list.addArray(lib.character[target.name][3]);
- if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]);
- if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]);
- list = list.filter(function (i) {
- return !player.hasSkill(i);
- });
- if (!list.length) return 0;
- return 1 + Math.random();
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("shiki_omusubi", target);
- player.loseMaxHp();
- var list = [];
- if (lib.character[target.name]) list.addArray(lib.character[target.name][3]);
- if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]);
- if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]);
- player.addSkills(list);
- game.broadcastAll(function (list) {
- lib.character.key_shiki[3].addArray(list);
- game.expandSkills(list);
- for (var i of list) {
- var info = lib.skill[i];
- if (!info) continue;
- if (!info.audioname2) info.audioname2 = {};
- info.audioname2.key_shiki = "shiki_omusubi";
- }
- }, list);
- }
- },
- },
- kagari_zongsi: {
- enable: "phaseUse",
- usable: 1,
- content() {
- "step 0";
- var controls = [];
- if (ui.cardPile.hasChildNodes()) controls.push("选择牌堆中的一张牌");
- if (ui.discardPile.hasChildNodes()) controls.push("选择弃牌堆中的一张牌");
- if (
- game.hasPlayer(function (current) {
- return current.countCards("hej") > 0;
- })
- )
- controls.push("选择一名角色区域内的一张牌");
- if (!controls.length) {
- event.finish();
- return;
- }
- event.controls = controls;
- var next = player.chooseControl();
- next.set("choiceList", controls);
- next.set("prompt", "请选择要移动的卡牌的来源");
- next.ai = function () {
- return 0;
- };
- "step 1";
- result.control = event.controls[result.index];
- var list = ["弃牌堆", "牌堆", "角色"];
- for (var i = 0; i < list.length; i++) {
- if (result.control.indexOf(list[i]) != -1) {
- event.index = i;
- break;
- }
- }
- if (event.index == 2) {
- player.chooseTarget("请选择要移动的卡牌的来源", true, function (card, kagari, target) {
- return target.countCards("hej") > 0;
- });
- } else {
- var source = ui[event.index == 0 ? "discardPile" : "cardPile"].childNodes;
- var list = [];
- for (var i = 0; i < source.length; i++) list.push(source[i]);
- player.chooseButton(["请选择要移动的卡牌", list], true).ai = get.buttonValue;
- }
- "step 2";
- if (event.index == 2) {
- player.line(result.targets[0]);
- event.target1 = result.targets[0];
- player.choosePlayerCard(result.targets[0], true, "hej").set("visible", true);
- } else {
- event.card = result.links[0];
- }
- "step 3";
- if (event.index == 2) event.card = result.cards[0];
- var controls = ["将这张牌移动到牌堆的顶部或者底部", "将这张牌移动到弃牌堆的顶部或者底部", "将这张牌移动到一名角色对应的区域里"];
- event.controls = controls;
- var next = player.chooseControl();
- next.set("prompt", "要对" + get.translation(event.card) + "做什么呢?");
- next.set("choiceList", controls);
- next.ai = function () {
- return 2;
- };
- "step 4";
- result.control = event.controls[result.index];
- var list = ["弃牌堆", "牌堆", "角色"];
- for (var i = 0; i < list.length; i++) {
- if (result.control.indexOf(list[i]) != -1) {
- event.index2 = i;
- break;
- }
- }
- if (event.index2 == 2) {
- player.chooseTarget("要将" + get.translation(card) + "移动到哪一名角色的对应区域呢", true).ai = function (target) {
- return target == _status.event.player ? 1 : 0;
- };
- } else {
- player.chooseControl("顶部", "底部").set("prompt", "把" + get.translation(card) + "移动到" + (event.index2 == 0 ? "弃" : "") + "牌堆的...");
- }
- "step 5";
- if (event.index2 != 2) {
- //if(event.target1) event.target1.lose(card,ui.special);
- //else card.goto(ui.special);
- event.way = result.control;
- } else {
- event.target2 = result.targets[0];
- var list = ["手牌区"];
- if (lib.card[card.name].type == "equip" && event.target2.canEquip(card)) list.push("装备区");
- if (lib.card[card.name].type == "delay" && !event.target2.isDisabledJudge() && !event.target2.hasJudge(card.name)) list.push("判定区");
- if (list.length == 1) event._result = { control: list[0] };
- else {
- player.chooseControl(list).set("prompt", "把" + get.translation(card) + "移动到" + get.translation(event.target2) + "的...").ai = function () {
- return 0;
- };
- }
- }
- "step 6";
- if (event.index2 != 2) {
- var node = ui[event.index == 0 ? "discardPile" : "cardPile"];
- if (event.target1) {
- var next = event.target1.lose(card, event.position);
- if (event.way == "顶部") next.insert_card = true;
- } else {
- if (event.way == "底部") node.appendChild(card);
- else node.insertBefore(card, node.firstChild);
- }
- game.updateRoundNumber();
- event.finish();
- } else {
- if (result.control == "手牌区") {
- var next = event.target2.gain(card);
- if (event.target1) {
- next.source = event.target1;
- next.animate = "giveAuto";
- } else next.animate = "draw";
- } else if (result.control == "装备区") {
- if (event.target1) event.target1.$give(card, event.target2);
- event.target2.equip(card);
- } else {
- if (event.target1) event.target1.$give(card, event.target2);
- event.target2.addJudge(card);
- }
- }
- "step 7";
- game.updateRoundNumber();
- },
- ai: {
- order: 10,
- result: { player: 1 },
- },
- },
caopi_xingdong: {
audio: "olfangquan",
audioname: ["shen_caopi"],
diff --git a/character/extra/sort.js b/character/extra/sort.js
index 03ccdc886..4cf6c8b01 100644
--- a/character/extra/sort.js
+++ b/character/extra/sort.js
@@ -5,7 +5,6 @@ const characterSort = {
extra_shan: ["shen_zhaoyun", "shen_simayi"],
extra_yin: ["shen_liubei", "shen_luxun"],
extra_lei: ["shen_ganning", "shen_zhangliao"],
- extra_key: ["key_kagari", "key_shiki", "db_key_hina"],
extra_decade: ["shen_jiangwei", "shen_machao", "shen_zhangfei", "shen_zhangjiao", "shen_dengai", "shen_xuzhu", "dc_shen_huatuo"],
extra_ol: ["ol_zhangliao", "shen_caopi", "shen_zhenji", "shen_sunquan"],
extra_mobilezhi: ["shen_guojia", "shen_xunyu"],
diff --git a/character/extra/translate.js b/character/extra/translate.js
index d432b1c67..40cfa634c 100644
--- a/character/extra/translate.js
+++ b/character/extra/translate.js
@@ -258,20 +258,6 @@ const translates = {
hengwu_info: "当你使用或打出有花色的牌时,若你的手牌区内没有与此牌花色相同的牌,则你可以摸X张牌(X为场上装备区内花色与此牌相同的牌数)。",
hengwu_append: '棘手,怀念,摧毁!',
- key_kagari: "篝",
- kagari_zongsi: "纵丝",
- kagari_zongsi_info: "出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。",
- key_shiki: "神山识",
- key_shiki_ab: "神山识",
- shiki_omusubi: "御结",
- shiki_omusubi_info: "一轮游戏开始时,你可以减1点体力上限,然后将一名其他角色武将牌上的技能加入到你的武将牌上。",
- shiki_omusubi_append: '来吧,羽依里。用你的手,让我变成那只真正的鬼吧!',
- db_key_hina: "佐藤雏",
- hina_shenshi: "神视",
- hina_shenshi_yingbian: "神视",
- hina_shenshi_info: "神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。",
- hina_xingzhi: "幸凪",
- hina_xingzhi_info: "键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。",
tw_shen_guanyu: "TW神关羽",
tw_shen_guanyu_prefix: "TW神",
twwushen: "武神",
diff --git a/character/huicui/characterFilter.js b/character/huicui/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/huicui/characterFilter.js
+++ b/character/huicui/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/jsrg/characterFilter.js b/character/jsrg/characterFilter.js
index fe783af16..cf7ece41b 100644
--- a/character/jsrg/characterFilter.js
+++ b/character/jsrg/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
jsrg_xushao(mode) {
return mode != "guozhan";
diff --git a/character/key/character.js b/character/key/character.js
index 1df383dc4..d92720147 100644
--- a/character/key/character.js
+++ b/character/key/character.js
@@ -439,6 +439,113 @@ const characters = {
hp: 3,
skills: ["fuuko_xingdiao", "fuuko_chuanyuan"],
},
+ key_kagari: {
+ sex: "female",
+ group: "shen",
+ groupInGuozhan: "key",
+ hp: 3,
+ skills: ["kagari_zongsi"],
+ },
+ key_shiki: {
+ sex: "female",
+ group: "shen",
+ groupInGuozhan: "key",
+ hp: 3,
+ maxHp: 5,
+ skills: ["shiki_omusubi"],
+ },
+ db_key_hina: {
+ sex: "female",
+ group: "shen",
+ groupInGuozhan: "key",
+ hp: 3,
+ skills: ["hina_shenshi", "hina_xingzhi"],
+ doubleGroup: ["key", "shen"],
+ },
+ key_kud: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["kud_qiaoshou", "kud_buhui"],
+ },
+ key_misuzu: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"],
+ },
+ key_kamome: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"],
+ },
+ key_nao: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["nao_duyin", "nao_wanxin", "nao_shouqing"],
+ },
+ key_yuuki: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["yuuki_yicha"],
+ },
+ key_kotarou: {
+ sex: "male",
+ group: "key",
+ hp: 3,
+ skills: ["kotarou_rewrite", "kotarou_aurora"],
+ },
+ key_tenzen: {
+ sex: "male",
+ group: "key",
+ hp: 4,
+ skills: ["tenzen_fenghuan", "tenzen_retianquan"],
+ },
+ key_kyouko: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["kyouko_rongzhu", "kyouko_gongmian"],
+ },
+ key_kyou: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["kyou_zhidian", "kyou_duanfa"],
+ },
+ key_seira: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["seira_xinghui", "seira_yuanying"],
+ },
+ key_kiyu: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["kiyu_yuling", "kiyu_rexianyu"],
+ },
+ key_tomoyo: {
+ sex: "female",
+ group: "key",
+ hp: 4,
+ skills: ["tomoyo_wuwei", "tomoyo_zhengfeng"],
+ },
+ key_minagi: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["minagi_peiquan", "minagi_huanliu"],
+ },
+ key_michiru: {
+ sex: "female",
+ group: "key",
+ hp: 3,
+ skills: ["michiru_sheyuan"],
+ },
};
export default characters;
diff --git a/character/key/index.js b/character/key/index.js
index 99fbd9bde..98f78f6d3 100644
--- a/character/key/index.js
+++ b/character/key/index.js
@@ -10,6 +10,7 @@ import { characterSort, characterSortTranslate } from "./sort.js";
game.import("character", function () {
return {
name: "key",
+ connect: true,
character: { ...characters },
characterSort: {
key: characterSort,
@@ -31,6 +32,19 @@ game.import("character", function () {
characterTitle: {
key_kotomi: "#g落英逐紫裙",
key_jojiro: "战棋专属角色",
+ key_kud: "#b千夜",
+ key_misuzu: "#b长发及腰黑长直",
+ key_kamome: "#b仿生纱",
+ key_nao: "#b潮鸣",
+ key_kyou: "#b长发及腰黑长直",
+ key_yuuki: "#b4399司命",
+ key_kyouko: "#b阿阿阿687",
+ key_tenzen: "#b皋耳击",
+ key_kotarou: "#bb1154486224",
+ key_seira: "#b阿开木木W🍀",
+ key_kiyu: "#b无面◎隐者",
+ key_tomoyo: "#b长发及腰黑长直",
+ key_minagi: "#b无面◎隐者",
},
card: { ...cards },
skill: { ...skills },
diff --git a/character/key/skill.js b/character/key/skill.js
index 3fd200e91..ab0d089bd 100644
--- a/character/key/skill.js
+++ b/character/key/skill.js
@@ -2,6 +2,2921 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
+ //加纳天善(改版)
+ tenzen_fenghuan: {
+ trigger: { global: "useCardAfter" },
+ filter(event, player) {
+ if (player == event.player || event.targets.length != 1 || event.targets[0] != player || !event.player.isIn() || (event.card.name != "sha" && (get.type(event.card, null, false) != "trick" || !get.tag(event.card, "damage")))) return false;
+ if (
+ !player.canUse(
+ {
+ name: event.card.name,
+ nature: event.card.nature,
+ isCard: true,
+ },
+ event.player,
+ false
+ )
+ )
+ return false;
+ var num = get.number(event.card);
+ if (typeof num != "number") return false;
+ num *= 2;
+ var hs = player.getCards("he");
+ for (var i of hs) {
+ num -= get.number(i);
+ if (num <= 0) return true;
+ }
+ return false;
+ },
+ async cost(event, trigger, player) {
+ const num = get.number(trigger.card) * 2,
+ card = {
+ name: trigger.card.name,
+ nature: trigger.card.nature,
+ isCard: true,
+ };
+ event.result = await player
+ .chooseToDiscard("he", get.prompt("tenzen_fenghuan", trigger.player), "弃置任意张点数之和不小于" + num + "的牌,然后视为对其使用一张" + get.translation(card), "chooseonly")
+ .set("selectCard", function () {
+ var cards = ui.selected.cards,
+ num = _status.event.cardNumber;
+ for (var i of cards) {
+ num -= get.number(i);
+ if (num <= 0) return [cards.length, cards.length + 1];
+ }
+ return [cards.length + 1, cards.length + 1];
+ })
+ .set("cardNumber", num)
+ .set("effect", get.effect(trigger.player, card, player, player))
+ .set("ai", function (card) {
+ var eff = _status.event.effect;
+ if (eff <= 0) return 0;
+ for (var i of ui.selected.cards) eff -= get.value(i) / Math.sqrt(get.number(i) / 3);
+ return eff - get.value(card) / Math.sqrt(get.number(card) / 3);
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ await player.discard(event.cards);
+ var card = {
+ name: trigger.card.name,
+ nature: trigger.card.nature,
+ isCard: true,
+ },
+ target = trigger.player;
+ if (target.isIn() && player.canUse(card, target, false)) await player.useCard(card, target, false);
+ },
+ },
+ tenzen_retianquan: {
+ trigger: { player: "useCardToPlayered" },
+ filter(event, player) {
+ return (
+ event.card.name == "sha" &&
+ (player.hp > 0 ||
+ player.hasCard(function (card) {
+ return lib.filter.cardDiscardable(card, player, "tenzen_retianquan");
+ }, "he"))
+ );
+ },
+ logTarget: "target",
+ usable: 1,
+ check(event, player) {
+ if (get.attitude(player, event.target) >= 0) return false;
+ if (player.hp > player.maxHp / 2) return true;
+ if (
+ player.hasCard(function (card) {
+ return lib.filter.cardDiscardable(card, player, "tenzen_retianquan") && get.value(card) < 6;
+ }, "he")
+ )
+ return true;
+ return true;
+ },
+ prompt2: "你可失去1点体力或弃置一张牌,亮出牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。每有一张基本牌,其所需使用的【闪】的数量便+1。然后若此牌造成过伤害,则你获得展示牌中的所有非基本牌。",
+ content() {
+ "step 0";
+ player
+ .chooseToDiscard("弃置一张牌,或点「取消」失去1点体力", "he")
+ .set("goon", player.hp > player.maxHp / 2)
+ .set("ai", function (card) {
+ var val = get.value(card);
+ if (_status.event.goon) return 0.1 - val;
+ return 6 - val;
+ });
+ "step 1";
+ if (!result.bool) player.loseHp();
+ "step 2";
+ var cards = get.cards(player.hp <= player.maxHp / 2 ? 5 : 3);
+ player.showCards(cards, get.translation(player) + "发动了【天全】");
+ game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent();
+ var num = cards.filter(function (card) {
+ return get.type(card, false) == "basic";
+ }).length;
+ if (num) {
+ if (trigger.card.name == "sha") {
+ var id = trigger.target.playerid;
+ var map = trigger.getParent().customArgs;
+ if (!map[id]) map[id] = {};
+ if (typeof map[id].shanRequired == "number") {
+ map[id].shanRequired += num;
+ } else {
+ map[id].shanRequired = 1 + num;
+ }
+ }
+ }
+ if (num < 5) {
+ var next = game.createEvent("tenzen_retianqua_gain");
+ next.cards = cards;
+ next.player = player;
+ event.next.remove(next);
+ trigger.getParent().after.push(next);
+ next.setContent(function () {
+ if (
+ player.getHistory("sourceDamage", function (evt) {
+ return evt.card == event.parent.card;
+ }).length > 0
+ )
+ player.gain(
+ cards.filter(function (card) {
+ return get.type(card, false) != "basic";
+ }),
+ "gain2"
+ );
+ });
+ }
+ },
+ },
+ //藤林杏
+ kyou_zhidian: {
+ locked: false,
+ mod: {
+ targetInRange(card) {
+ if (card.kyou_zhidian) return true;
+ },
+ aiOrder(player, card, numx) {
+ var num = _status.event._kyou_zhidian_baseValue;
+ if (num > 0 && get.type2(card) == "trick" && player.getUseValue(card) < num) return numx / 10;
+ },
+ },
+ enable: "chooseToUse",
+ filter(event, player) {
+ return player.countCards("hs", card => get.type2(card) == "trick") > 0;
+ },
+ filterCard(card) {
+ return get.type2(card) == "trick";
+ },
+ onChooseToUse(event) {
+ event._kyou_zhidian_baseValue = event.player.getUseValue({
+ name: "sha",
+ });
+ },
+ check(card) {
+ var num = _status.event._kyou_zhidian_baseValue,
+ player = _status.event.player;
+ return num - player.getUseValue(card);
+ },
+ prompt: "将一张锦囊牌当做【杀】使用",
+ viewAs: {
+ name: "sha",
+ kyou_zhidian: true,
+ },
+ group: "kyou_zhidian_aim",
+ ai: {
+ respondSha: true,
+ skillTagFilter: player => player.countCards("hs", card => get.type2(card) == "trick") > 0,
+ },
+ subSkill: {
+ aim: {
+ trigger: {
+ player: "useCardToPlayered",
+ },
+ forced: true,
+ locked: false,
+ filter(event, player) {
+ return event.isFirstTarget && event.card.name == "sha";
+ },
+ logTarget: "target",
+ content() {
+ "step 0";
+ var list = ["不可被响应", "无视防具", "伤害+1", "不计入次数"];
+ list.remove(player.storage.kyou_zhidian);
+ player
+ .chooseControl(list)
+ .set("prompt", "掷典:请为" + get.translation(trigger.card) + "选择一种效果")
+ .set(
+ "choice",
+ (function () {
+ if (list.includes("不计入次数") && player.hasSha()) return "不计入次数";
+ if (
+ list.includes("不可被响应") &&
+ trigger.target.mayHaveShan(
+ player,
+ "use",
+ trigger.target.getCards("h", i => {
+ return i.hasGaintag("sha_notshan");
+ })
+ )
+ )
+ return "不可被响应";
+ if (list.includes("伤害+1")) return "伤害+1";
+ return list.randomGet();
+ })()
+ )
+ .set("ai", () => _status.event.choice);
+ "step 1";
+ var target = trigger.target;
+ player.storage.kyou_zhidian = result.control;
+ game.log(player, "对", target, "的", trigger.card, "#g" + result.control);
+ switch (result.control) {
+ case "不可被响应":
+ trigger.directHit.add(target);
+ break;
+ case "无视防具":
+ target.addTempSkill("qinggang2");
+ target.storage.qinggang2.add(trigger.card);
+ break;
+ case "伤害+1":
+ var map = trigger.customArgs;
+ var id = target.playerid;
+ if (!map[id]) map[id] = {};
+ if (!map[id].extraDamage) map[id].extraDamage = 0;
+ map[id].extraDamage++;
+ break;
+ case "不计入次数":
+ var evt = trigger.getParent();
+ if (evt.addCount !== false) {
+ evt.addCount = false;
+ player.getStat().card.sha--;
+ }
+ break;
+ }
+ },
+ },
+ },
+ },
+ kyou_duanfa: {
+ trigger: { player: "damageBegin2" },
+ limited: true,
+ skillAnimation: true,
+ animationColor: "thunder",
+ filter(event, player) {
+ return player.hp <= event.num;
+ },
+ content() {
+ player.awakenSkill("kyou_duanfa");
+ if (player.countCards("h") > 0) player.chooseToDiscard("h", true, player.countCards("h"));
+ player.recover();
+ trigger.cancel();
+ player.addTempSkill("kyou_duanfa_draw", {
+ player: "phaseBeginStart",
+ });
+ },
+ subSkill: {
+ draw: {
+ trigger: { target: "useCardToTargeted" },
+ forced: true,
+ charlotte: true,
+ filter(event, player) {
+ if (event.card.name == "sha") return true;
+ return get.type(event.card, false) == "trick" && get.tag(event.card, "damage") > 0;
+ },
+ content() {
+ player.draw();
+ },
+ },
+ },
+ },
+ //天王寺瑚太朗
+ kotarou_aurora: {
+ trigger: {
+ player: ["damageEnd", "loseHpEnd", "gainMaxHpEnd"],
+ },
+ forced: true,
+ charlotte: true,
+ filter(event, player) {
+ return player.hasEnabledSlot(1);
+ },
+ content() {
+ if (player.hasEmptySlot(1)) {
+ var card = get.cardPile2(function (card) {
+ return get.subtype(card) == "equip1" && !get.cardtag(card, "gifts") && player.canUse(card, player);
+ });
+ if (card) player.chooseUseTarget(card, true);
+ } else player.chooseUseTarget("sha", true, false);
+ },
+ },
+ kotarou_rewrite: {
+ enable: "phaseUse",
+ charlotte: true,
+ filter(event, player) {
+ return !player.hasSkill("kotarou_rewrite_block");
+ },
+ content() {
+ "step 0";
+ player.getHistory("custom").push({ kotarou_rewrite: true });
+ player
+ .chooseControl()
+ .set("choiceList", ["视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌", "移动场上的一张牌", "增加1点体力上限并失去1点体力", "本回合内下一次造成的伤害+1", "本回合内下一次回复体力时,额外回复1点体力", "本回合内手牌上限和【杀】的使用次数+1 "])
+ .set("ai", function () {
+ var player = _status.event.player;
+ if (player.hp > 2 && player.getUseValue({ name: "sha" }) > 0) return 2;
+ return 0;
+ });
+ "step 1";
+ lib.skill.kotarou_rewrite.rewrites[result.index](player, event);
+ if (result.index != 0) event.goto(3);
+ "step 2";
+ if (result.bool) {
+ player.storage.kotarou_rewrite.push(result.links[0][2]);
+ player.chooseUseTarget(true, {
+ name: result.links[0][2],
+ nature: result.links[0][3],
+ isCard: true,
+ });
+ }
+ "step 3";
+ if (
+ player.getHistory("custom", function (evt) {
+ return evt && evt.kotarou_rewrite == true;
+ }).length >= 3
+ )
+ player.addTempSkill("kotarou_rewrite_block");
+ },
+ onremove: true,
+ rewrites: [
+ function (player, event) {
+ var list = [];
+ if (!player.storage.kotarou_rewrite) player.storage.kotarou_rewrite = [];
+ for (var i of lib.inpile) {
+ if (player.storage.kotarou_rewrite.includes(i)) continue;
+ var type = get.type(i);
+ if (type == "basic" || type == "trick") list.push([type, "", i]);
+ if (i == "sha") {
+ for (var j of lib.inpile_nature) list.push([type, "", i, j]);
+ }
+ }
+ if (list.length) {
+ player
+ .chooseButton(["改写:视为使用一张基本牌或普通锦囊牌", [list, "vcard"]], true)
+ .set("filterButton", function (button) {
+ return player.hasUseTarget(
+ {
+ name: button.link[2],
+ nature: button.link[3],
+ isCard: true,
+ },
+ null,
+ true
+ );
+ })
+ .set("ai", function (button) {
+ return player.getUseValue({
+ name: button.link[2],
+ nature: button.link[3],
+ isCard: true,
+ });
+ });
+ } else event._result = { bool: false };
+ },
+ function (player, event) {
+ player.moveCard(true);
+ },
+ function (player, event) {
+ if (player.maxHp < 5) player.gainMaxHp();
+ player.loseHp();
+ },
+ function (player, event) {
+ player.addSkill("kotarou_rewrite_damage");
+ player.addMark("kotarou_rewrite_damage", 1, false);
+ game.log(player, "本回合下次造成的伤害", "#y+1");
+ },
+ function (player, event) {
+ player.addSkill("kotarou_rewrite_recover");
+ player.addMark("kotarou_rewrite_recover", 1, false);
+ game.log(player, "本回合下次回复的体力", "#y+1");
+ },
+ function (player, event) {
+ player.addSkill("kotarou_rewrite_sha");
+ player.addMark("kotarou_rewrite_sha", 1, false);
+ game.log(player, "本回合的手牌上限和使用【杀】的次数上限", "#y+1");
+ },
+ ],
+ ai: {
+ order: 4,
+ result: {
+ player(player) {
+ if (
+ player.getHistory("custom", function (evt) {
+ return evt && evt.kotarou_rewrite == true;
+ }).length >= 2
+ )
+ return 0;
+ return 1;
+ },
+ },
+ },
+ },
+ kotarou_rewrite_damage: {
+ onremove: true,
+ trigger: { source: "damageBegin1" },
+ forced: true,
+ content() {
+ trigger.num += player.countMark("kotarou_rewrite_damage");
+ player.removeSkill("kotarou_rewrite_damage");
+ },
+ charlotte: true,
+ intro: { content: "下一次造成的伤害+#" },
+ },
+ kotarou_rewrite_recover: {
+ onremove: true,
+ trigger: { player: "recoverBegin" },
+ forced: true,
+ content() {
+ trigger.num += player.countMark("kotarou_rewrite_recover");
+ player.removeSkill("kotarou_rewrite_recover");
+ },
+ charlotte: true,
+ intro: { content: "下一次回复的体力+#" },
+ },
+ kotarou_rewrite_sha: {
+ onremove: true,
+ mod: {
+ maxHandcard(player, num) {
+ return num + player.countMark("kotarou_rewrite_sha");
+ },
+ cardUsable(card, player, num) {
+ if (card.name == "sha") return num + player.countMark("kotarou_rewrite_sha");
+ },
+ },
+ charlotte: true,
+ intro: { content: "手牌上限和出杀次数+#" },
+ },
+ kotarou_rewrite_block: {
+ trigger: { player: "phaseEnd" },
+ forced: true,
+ charlotte: true,
+ content() {
+ player.removeSkill("kotarou_rewrite");
+ player.removeSkill("kotarou_aurora");
+ if (player.maxHp > 3) player.loseMaxHp(player.maxHp - 3);
+ },
+ },
+ //加纳天善(旧)
+ tenzen_yixing: {
+ trigger: {
+ global: "damageEnd",
+ },
+ filter(event, player) {
+ if (!event.card || (event.card.name != "sha" && event.card.name != "juedou")) return false;
+ var hairi = event.source;
+ if (hairi && (hairi == player || player.inRangeOf(hairi)) && hairi.isIn() && hairi.name1 != "key_shizuku" && hairi.name2 != "key_shizuku") return true;
+ hairi = event.player;
+ return hairi && (hairi == player || player.inRange(hairi)) && hairi.isIn() && hairi.name1 != "key_shizuku" && hairi.name2 != "key_shizuku";
+ },
+ frequent: true,
+ content() {
+ "step 0";
+ player.draw();
+ "step 1";
+ if (player.countCards("he") > 0) {
+ player.chooseCard("he", true, "将一张牌作为“兴”置于武将牌上");
+ } else event.finish();
+ "step 2";
+ if (result.bool) {
+ var cards = result.cards;
+ player.addToExpansion(cards, player, "give").gaintag.add("tenzen_yixing");
+ }
+ },
+ intro: {
+ content: "expansion",
+ onunmark: "expansion",
+ },
+ onremove(player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ group: "tenzen_yixing_counter",
+ subSkill: {
+ counter: {
+ trigger: { target: "useCardToTargeted" },
+ filter(event, player) {
+ if (player == event.player || !player.getExpansions("tenzen_yixing").length) return false;
+ return event.targets.length == 1 && (event.card.name == "sha" || get.type(event.card) == "trick");
+ },
+ prompt2(event) {
+ return "获得一张“兴”,且" + get.translation(event.card) + "结算完成后可以弃置两张牌,视为对" + get.translation(event.player) + "使用一张同名牌";
+ },
+ check(event, player) {
+ if (!player.storage.tenzen_lingyu && player.getExpansions("tenzen_yixing").length < 3) return false;
+ var card = {
+ name: event.card.name,
+ nature: event.card.nature,
+ isCard: true,
+ };
+ return player.canUse(card, event.player, false) && get.effect(event.player, card, player, player) > 0;
+ },
+ content() {
+ "step 0";
+ player.chooseButton(["选择获得一张“兴”", player.getExpansions("tenzen_yixing")], true);
+ "step 1";
+ if (result.bool) {
+ player.gain(result.links, "gain2");
+ }
+ var next = game.createEvent("tenzen_yixing_insert");
+ event.next.remove(next);
+ trigger.getParent().after.push(next);
+ next.player = player;
+ next.target = trigger.player;
+ next.setContent(lib.skill.tenzen_yixing.content_extra);
+ },
+ },
+ },
+ content_extra() {
+ "step 0";
+ var card = event.getParent().card;
+ event.card = {
+ name: card.name,
+ nature: card.nature,
+ isCard: true,
+ };
+ if (player.countCards("he") > 1 && target && target.isIn() && player.canUse(event.card, target, false)) {
+ player.chooseToDiscard("he", 2, "是否弃置两张牌,视为对" + get.translation(target) + "使用" + get.translation(event.card) + "?").set("ai", function (card) {
+ return 5 - get.value(card);
+ });
+ } else event.finish();
+ "step 1";
+ if (result.bool) player.useCard(card, target, false, "tenzen_yixing");
+ },
+ },
+ tenzen_lingyu: {
+ trigger: { player: "phaseZhunbeiBegin" },
+ forced: true,
+ juexingji: true,
+ skillAnimation: true,
+ animationColor: "water",
+ filter(event, player) {
+ return player.getExpansions("tenzen_yixing").length >= player.hp;
+ },
+ content() {
+ player.awakenSkill("tenzen_lingyu");
+ player.storage.tenzen_lingyu = true;
+ player.loseMaxHp();
+ if (player.isHealthy()) player.draw(2);
+ player.addSkills("tenzen_tianquan");
+ },
+ ai: {
+ combo: "tenzen_yixing",
+ },
+ },
+ tenzen_tianquan: {
+ trigger: { player: "useCardToPlayered" },
+ filter(event, player) {
+ return (event.card.name == "sha" || event.card.name == "juedou") && event.targets.length == 1 && player.getExpansions("tenzen_yixing").length > 1;
+ },
+ logTarget: "target",
+ usable: 1,
+ check(event, player) {
+ return get.attitude(player, event.target) < 0;
+ },
+ content() {
+ "step 0";
+ //player.viewHandcards(trigger.target);
+ player.chooseButton(["选择移去两张“兴”", player.getExpansions("tenzen_yixing")], true, 2);
+ "step 1";
+ if (result.bool) {
+ player.loseToDiscardpile(result.links);
+ var cards = get.cards(5);
+ player.showCards(cards, get.translation(player) + "发动了【天全】");
+ game.cardsGotoOrdering(cards).relatedEvent = trigger.getParent();
+ var num = cards.filter(function (card) {
+ return get.type(card, false) == "basic";
+ }).length;
+ if (num) {
+ if (trigger.card.name == "sha") {
+ var id = trigger.target.playerid;
+ var map = trigger.getParent().customArgs;
+ if (!map[id]) map[id] = {};
+ if (typeof map[id].shanRequired == "number") {
+ map[id].shanRequired += num;
+ } else {
+ map[id].shanRequired = 1 + num;
+ }
+ } else {
+ var idt = trigger.target.playerid;
+ var map = trigger.getParent().customArgs;
+ if (!map[idt]) map[idt] = {};
+ if (!map[idt].shaReq) map[idt].shaReq = {};
+ if (!map[idt].shaReq[idt]) map[idt].shaReq[idt] = 1;
+ map[idt].shaReq[idt]++;
+ }
+ }
+ if (num < 5) {
+ var next = game.createEvent("tenzen_lingyu_gain");
+ next.cards = cards;
+ next.player = player;
+ event.next.remove(next);
+ trigger.getParent().after.push(next);
+ next.setContent(function () {
+ if (
+ player.getHistory("sourceDamage", function (evt) {
+ return evt.card == event.parent.card;
+ }).length > 0
+ )
+ player.gain(
+ cards.filter(function (card) {
+ return get.type(card, false) != "basic";
+ }),
+ "gain2"
+ );
+ });
+ }
+ }
+ },
+ },
+ //伊座并杏子
+ kyouko_rongzhu: {
+ trigger: { global: "gainEnd" },
+ filter(event, player) {
+ if (player == event.player || event.getParent().name == "kyouko_rongzhu") return false;
+ var evt = event.getl(player);
+ return evt && evt.cards2 && evt.cards2.length > 0;
+ },
+ logTarget: "player",
+ check(event, player) {
+ return get.attitude(player, event.player) > 0;
+ },
+ content() {
+ "step 0";
+ player.draw();
+ "step 1";
+ var target = trigger.player;
+ if (player.countCards("he") > 0 && target.isIn()) {
+ player.chooseCard("he", true, "将一张牌交给" + get.translation(target));
+ } else event.finish();
+ "step 2";
+ if (result.bool) {
+ player.give(result.cards, trigger.player);
+ var target = _status.currentPhase;
+ var name;
+ if (target == player) {
+ name = "kyouko_rongzhu_me";
+ player.addTempSkill(name);
+ player.addMark(name, 1, false);
+ } else if (target == trigger.player) {
+ name = "kyouko_rongzhu_notme";
+ target.addTempSkill(name);
+ target.addMark(name, 1, false);
+ }
+ }
+ },
+ subSkill: {
+ me: {
+ mod: {
+ maxHandcard(player, num) {
+ return num + player.countMark("kyouko_rongzhu_me");
+ },
+ },
+ intro: { content: "手牌上限+#" },
+ onremove: true,
+ },
+ notme: {
+ mod: {
+ cardUsable(card, player, num) {
+ if (card.name == "sha") return num + player.countMark("kyouko_rongzhu_notme");
+ },
+ },
+ intro: { content: "使用杀的次数上限+#" },
+ onremove: true,
+ },
+ },
+ },
+ kyouko_gongmian: {
+ enable: "phaseUse",
+ prompt: "出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。",
+ filter(event, player) {
+ return game.hasPlayer(function (current) {
+ return current != player && lib.skill.kyouko_gongmian.filterTarget(null, player, current);
+ });
+ },
+ filterTarget(card, kyouko, hina) {
+ if (kyouko == hina || kyouko.getStorage("kyouko_gongmian").includes(hina)) return false;
+ var hs = hina.countCards("he");
+ if (hs == 0) return kyouko.countCards("h") == 0;
+ return true;
+ },
+ content() {
+ "step 0";
+ player.markAuto("kyouko_gongmian", targets);
+ var hs = player.countCards("h"),
+ ts = target.countCards("h");
+ player.getHistory("custom").push({ kyouko_gongmian: true });
+ if (hs > ts) {
+ event.utype = 1;
+ target.chooseCard("he", true, "交给" + get.translation(player) + "一张牌");
+ } else if (hs == ts) {
+ game.asyncDraw([player, target]);
+ event.utype = 2;
+ } else {
+ event.utype = 3;
+ player.gainPlayerCard(target, true, "he");
+ }
+ "step 1";
+ if (event.utype == 2) {
+ game.delayx();
+ event.finish();
+ } else if (!result.bool) event.finish();
+ else if (event.utype == 1) target.give(result.cards, player);
+ "step 2";
+ if (player.countCards("he") > 0) {
+ player.chooseCard("he", true, "交给" + get.translation(target) + "一张牌");
+ } else event.finish();
+ "step 3";
+ if (result.bool) player.give(result.cards, target);
+ },
+ intro: {
+ content: "已与$共勉",
+ },
+ group: ["kyouko_gongmian_use", "kyouko_gongmian_discard"],
+ ai: {
+ order: 6,
+ result: {
+ target(player, target) {
+ if (
+ player.getHistory("custom", function (evt) {
+ return evt.kyouko_gongmian == true;
+ }).length
+ )
+ return 0;
+ return 1;
+ },
+ },
+ },
+ },
+ kyouko_gongmian_use: {
+ trigger: { player: "phaseUseEnd" },
+ filter(event, player) {
+ return (
+ player.getHistory("custom", function (evt) {
+ return evt.kyouko_gongmian == true;
+ }).length > 0 &&
+ game.hasPlayer(function (current) {
+ return current != player && current.countGainableCards(player, "hej") > 0;
+ })
+ );
+ },
+ async cost(event, trigger, player) {
+ const num = player.getHistory("custom", function (evt) {
+ return evt.kyouko_gongmian == true;
+ }).length;
+ event.result = await player
+ .chooseTarget(get.prompt("kyouko_gongmian"), "获得一名其他角色的至多" + get.cnNumber(num) + "张牌,然后交给其等量的牌", function (card, player, target) {
+ return target != player && target.countGainableCards(player, "hej") > 0;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player,
+ att = get.attitude(player, target);
+ if (att > 0) return att;
+ var he = player.getCards("he");
+ if (
+ target.countCards("he", function (card) {
+ return get.value(card, target) > 7;
+ }) &&
+ he.length > 0
+ )
+ return (
+ -att +
+ 5 -
+ Math.min.apply(
+ Math,
+ he.map(function (card) {
+ return get.value(card, player);
+ })
+ )
+ );
+ return 0;
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const num = player.getHistory("custom", function (evt) {
+ return evt.kyouko_gongmian == true;
+ }).length,
+ target = event.targets[0];
+ let result = await player.gainPlayerCard(target, "hej", true, [1, num]).forResult();
+ if (target.isIn() && result.bool && result.cards && result.cards.length && player.countCards("he") > 0) {
+ const num = result.cards.length,
+ hs = player.getCards("he");
+ if (hs.length <= num) result = { bool: true, cards: hs };
+ else {
+ result = await player.chooseCard("he", true, num, "交给" + get.translation(target) + get.cnNumber(num) + "张牌").forResult();
+ }
+ if (result.bool && result.cards && result.cards.length) {
+ player.give(result.cards, target);
+ }
+ }
+ },
+ },
+ kyouko_gongmian_discard: {
+ trigger: { player: "phaseDiscardBegin" },
+ filter(event, player) {
+ var hs = player.countCards("h");
+ return (
+ hs > 0 &&
+ player.getHistory("custom", function (evt) {
+ return evt.kyouko_gongmian == true;
+ }).length >= player.hp &&
+ game.hasPlayer(function (current) {
+ return current != player && current.countCards("h") < hs;
+ })
+ );
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget(get.prompt("kyouko_gongmian"), "获得一名其他角色的所有手牌,然后将一半的牌交给该角色(向上取整)", function (card, player, target) {
+ return target != player && target.countCards("h") < player.countCards("h");
+ })
+ .forResult();
+ },
+ content() {
+ "step 0";
+ var target = event.targets[0];
+ event.target = target;
+ var hs = target.getCards("h");
+ if (hs.length > 0) player.gain(hs, target, "giveAuto", "bySelf");
+ "step 1";
+ if (target.isIn() && player.countCards("h") > 0) {
+ var hs = player.getCards("h"),
+ num = Math.ceil(hs.length / 2);
+ if (hs.length <= num) event._result = { bool: true, cards: hs };
+ else player.chooseCard("he", true, num, "交给" + get.translation(target) + get.cnNumber(num) + "张牌");
+ } else event.finish();
+ "step 2";
+ if (result.bool && result.cards && result.cards.length) {
+ player.give(result.cards, target);
+ }
+ },
+ },
+ //冰室忧希
+ yuuki_yicha: {
+ trigger: { player: "phaseUseBegin" },
+ frequent: true,
+ createDialog(id) {
+ var dialog = ui.create.dialog("hidden");
+ (dialog.textPrompt = dialog.add("异插")).style.textAlign = "center";
+ dialog.cards = [];
+ dialog.rawButtons = [];
+ dialog.videoId = id;
+ var cards = [];
+ for (var i = 0; i < 3; i++) {
+ var card = ui.create.card(null, null, true);
+ card.pos = i;
+ card.pos_x = i;
+ card.pos_y = 0;
+ cards.push(card);
+ dialog.rawButtons.push(card);
+ }
+ dialog.add(cards);
+ cards = [];
+ for (var i = 0; i < 3; i++) {
+ var card = ui.create.card(null, null, true);
+ card.pos = i + 3;
+ card.pos_x = i;
+ card.pos_y = 1;
+ cards.push(card);
+ dialog.rawButtons.push(card);
+ }
+ dialog.add(cards);
+ for (var i of dialog.buttons) {
+ i.pos_x = i.link.pos_x;
+ i.pos_y = i.link.pos_y;
+ i.link = i.link.pos;
+ }
+ dialog.open();
+ },
+ addCard(card, id, pos) {
+ var dialog = get.idDialog(id);
+ if (!dialog) return;
+ for (var i = 0; i < dialog.buttons.length; i++) {
+ var button = dialog.buttons[i];
+ if (button.link == pos) {
+ var card2 = ui.create.button(card, "card");
+ card2.pos = button.link;
+ card2.pos_x = button.pos_x;
+ card2.pos_y = button.pos_y;
+ card2.classList.add("noclick");
+ button.parentNode.insertBefore(card2, button);
+ dialog.cards.push(card2);
+ button.remove();
+ dialog.buttons.splice(i, 1);
+ break;
+ }
+ }
+ },
+ changePrompt(str, id) {
+ var dialog = get.idDialog(id);
+ if (!dialog) return;
+ dialog.textPrompt.innerHTML = str;
+ },
+ content() {
+ "step 0";
+ var next = game.createEvent("cardsGotoOrdering");
+ next.cards = [];
+ next.setContent("cardsGotoOrdering");
+ event.videoId = lib.status.videoId++;
+ event.forceDie = true;
+ event.cards = [];
+ event.positions = [0, 1, 2, 3, 4, 5];
+ game.broadcastAll(function (id) {
+ lib.skill.yuuki_yicha.createDialog(id);
+ }, event.videoId);
+ player.judge().set("callback", function () {
+ event.getParent().orderingCards.remove(event.judgeResult.card);
+ event.getParent(2).orderingCards.add(event.judgeResult.card);
+ });
+ "step 1";
+ if (get.position(result.card, true) == "o") {
+ var pos = event.positions.randomRemove();
+ event._first_pos = pos;
+ game.broadcastAll(
+ function (card, id, player, pos) {
+ lib.skill.yuuki_yicha.addCard(card, id, pos);
+ lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id);
+ },
+ result.card,
+ event.videoId,
+ player,
+ pos
+ );
+ cards.push(result.card);
+ game.delay(2);
+ }
+ player.judge().set("callback", function () {
+ event.getParent().orderingCards.remove(event.judgeResult.card);
+ event.getParent(2).orderingCards.add(event.judgeResult.card);
+ });
+ "step 2";
+ if (get.position(result.card, true) == "o") {
+ var list = event.positions;
+ if (get.isLuckyStar(player)) {
+ var index = get.color(cards[0], false) == get.color(result.card, false) ? 0 : 1;
+ list = list.filter(function (i) {
+ return Math.abs((i % 2) - (event._first_pos % 2)) == index;
+ });
+ }
+ var pos = list.randomRemove();
+ game.broadcastAll(
+ function (card, id, player, pos) {
+ lib.skill.yuuki_yicha.addCard(card, id, pos);
+ lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id);
+ },
+ result.card,
+ event.videoId,
+ player,
+ pos
+ );
+ cards.push(result.card);
+ game.delay(2);
+ }
+ if (cards.length) event.count = 4;
+ else {
+ game.broadcastAll("closeDialog", event.videoId);
+ event.finish();
+ }
+ "step 3";
+ event.count--;
+ player.judge().set("callback", function () {
+ event.getParent().orderingCards.remove(event.judgeResult.card);
+ event.getParent(2).orderingCards.add(event.judgeResult.card);
+ });
+ "step 4";
+ var card = result.card;
+ event.card = card;
+ var str = "请选择一个位置放置" + get.translation(card);
+ if (player == game.me || player.isUnderControl()) {
+ lib.skill.yuuki_yicha.changePrompt(str, event.videoId);
+ } else if (player.isOnline()) {
+ player.send(
+ function (str, id) {
+ lib.skill.yuuki_yicha.changePrompt(str, event.videoId);
+ },
+ str,
+ id
+ );
+ }
+ player
+ .chooseButton()
+ .set("dialog", event.videoId)
+ .set("filterButton", function (button) {
+ var posx = button.pos_x,
+ posy = button.pos_y;
+ var list = [],
+ cards = ui.dialog.cards;
+ for (var i of cards) {
+ if (i.pos_x == posx && Math.abs(i.pos_y - posy) == 1) list.push(i.link);
+ if (i.pos_y == posy && Math.abs(i.pos_x - posx) == 1) list.push(i.link);
+ }
+ if (list.length > 0) {
+ var color = get.color(list[0], false);
+ if (list.length > 1) {
+ for (var i = 1; i < list.length; i++) {
+ if (get.color(list[i]) != color) return false;
+ }
+ }
+ return get.color(_status.event.card, false) != color;
+ }
+ return false;
+ })
+ .set("card", card);
+ "step 5";
+ if (result.bool) {
+ cards.push(card);
+ event.positions.remove(result.links[0]);
+ game.broadcastAll(
+ function (card, id, pos, player) {
+ lib.skill.yuuki_yicha.addCard(card, id, pos);
+ lib.skill.yuuki_yicha.changePrompt(get.translation(player) + "放置了" + get.translation(card), id);
+ },
+ card,
+ event.videoId,
+ result.links[0],
+ player
+ );
+ game.delay(2);
+ }
+ if (event.count > 0) event.goto(3);
+ "step 6";
+ game.broadcastAll("closeDialog", event.videoId);
+ player.chooseTarget("令一名角色获得" + get.translation(cards), true).set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ });
+ "step 7";
+ if (result.bool && result.targets && result.targets.length) {
+ var target = result.targets[0];
+ player.line(target, "green");
+ target.gain(cards, "gain2");
+ }
+ },
+ },
+ //库特莉亚芙卡
+ kud_qiaoshou: {
+ enable: "phaseUse",
+ usable: 1,
+ filter(event, player) {
+ return !player.getExpansions("kud_qiaoshou_equip").length && player.countCards("h") > 0;
+ },
+ chooseButton: {
+ dialog() {
+ var list = [];
+ var list2 = ["pyzhuren_heart", "pyzhuren_diamond", "pyzhuren_club", "pyzhuren_spade", "pyzhuren_shandian", "rewrite_zhuge"];
+ list2.addArray(lib.inpile);
+ for (var i of list2) {
+ var sub = get.subtype(i);
+ if (["equip1", "equip4"].includes(sub)) list.push([sub, "", i]);
+ }
+ return ui.create.dialog("巧手:选择一种装备牌", [list, "vcard"], "hidden");
+ },
+ check(button) {
+ var player = _status.event.player;
+ var name = button.link[2];
+ if (get.subtype(name) == "equip4" || player.getEquip(name)) return 0;
+ var sha = player.countCards("h", "sha");
+ switch (name) {
+ case "rewrite_zhuge":
+ return sha - player.getCardUsable("sha");
+ case "guding":
+ if (
+ sha > 0 &&
+ game.hasPlayer(function (current) {
+ return get.attitude(player, current) < 0 && !current.countCards("h") && player.canUse("sha", current) && get.effect(current, { name: "sha" }, player) > 0;
+ })
+ )
+ return 1.4 + Math.random();
+ return 0;
+ case "guanshi":
+ if (sha > 0) return 0.7 + Math.random();
+ return 0;
+ case "qinggang":
+ if (sha > 0) return 0.4 + Math.random();
+ return 0;
+ case "zhuque":
+ if (
+ game.hasPlayer(function (current) {
+ return get.attitude(player, current) < 0 && current.getEquip("tengjia") && get.effect(current, { name: "sha", nature: "fire" }, player) > 0;
+ })
+ )
+ return 1.2 + Math.random();
+ return 0;
+ default:
+ return 0;
+ }
+ },
+ backup(links) {
+ var next = get.copy(lib.skill.kud_qiaoshou_backupx);
+ next.cardname = links[0][2];
+ return next;
+ },
+ prompt(links) {
+ return "将一张手牌置于武将牌上,然后视为装备" + get.translation(links[0][2]);
+ },
+ },
+ group: "kud_qiaoshou_end",
+ ai: {
+ notemp: true,
+ order: 5,
+ result: {
+ player: 1,
+ },
+ },
+ },
+ kud_qiaoshou_backupx: {
+ filterCard: true,
+ discard: false,
+ lose: false,
+ delay: false,
+ check(event, player) {
+ return 6 - get.value(card);
+ },
+ content() {
+ "step 0";
+ player.addToExpansion(cards, player, "give").gaintag.add("kud_qiaoshou_equip");
+ "step 1";
+ if (!player.getExpansions("kud_qiaoshou_equip").length) return;
+ player.addTempSkill("kud_qiaoshou_equip", {
+ player: ["phaseUseEnd", "phaseZhunbeiBegin"],
+ });
+ var name = lib.skill.kud_qiaoshou_backup.cardname;
+ player.storage.kud_qiaoshou_equip2 = name;
+ var info = lib.card[name].skills;
+ if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info);
+ player.draw();
+ game.log(player, "声明了", "#y" + get.translation(name));
+ },
+ ai: {
+ result: {
+ player: 1,
+ },
+ },
+ },
+ kud_qiaoshou_equip: {
+ charlotte: true,
+ mod: {
+ globalFrom(from, to, distance) {
+ var info = lib.card[from.storage.kud_qiaoshou_equip2];
+ if (info && info.distance && info.distance.globalFrom) return distance + info.distance.globalFrom;
+ },
+ globalTo(from, to, distance) {
+ var info = lib.card[to.storage.kud_qiaoshou_equip2];
+ if (info && info.distance && info.distance.globalTo) return distance + info.distance.globalTo;
+ },
+ attackRange(from, distance) {
+ var info = lib.card[from.storage.kud_qiaoshou_equip2];
+ if (info && info.distance && info.distance.attackFrom) return distance - info.distance.attackFrom;
+ },
+ attackTo(from, to, distance) {
+ var info = lib.card[to.storage.kud_qiaoshou_equip2];
+ if (info && info.distance && info.distance.attackTo) return distance + info.distance.attackTo;
+ },
+ },
+ onremove(player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ intro: {
+ markcount: "expansion",
+ mark(dialog, storage, player) {
+ dialog.add(player.getExpansions("kud_qiaoshou_equip"));
+ dialog.addText("当前装备:" + get.translation(player.storage.kud_qiaoshou_equip2));
+ var str2 = lib.translate[player.storage.kud_qiaoshou_equip2 + "_info"];
+ if (str2) {
+ if (str2.length >= 12) dialog.addText(str2, false);
+ else dialog.addText(str2);
+ }
+ },
+ onunmark(storage, player) {
+ player.removeAdditionalSkill("kud_qiaoshou_equip");
+ delete player.storage.kud_qiaoshou_equip2;
+ player.addEquipTrigger();
+ },
+ },
+ },
+ kud_qiaoshou_end: {
+ trigger: { player: "phaseJieshuBegin" },
+ filter(event, player) {
+ return player.countCards("h") > 0 && !player.getExpansions("kud_qiaoshou_equip").length;
+ },
+ cost() {
+ "step 0";
+ var list = [];
+ var list2 = ["rewrite_bagua", "rewrite_renwang", "rewrite_tengjia", "rewrite_baiyin"];
+ list2.addArray(lib.inpile);
+ for (var i of list2) {
+ var sub = get.subtype(i);
+ if (["equip2", "equip3"].includes(sub)) list.push([sub, "", i]);
+ }
+ player.chooseButton([get.prompt("kud_qiaoshou"), [list, "vcard"]]).set("ai", function (button) {
+ var player = _status.event.player;
+ var name = button.link[2];
+ if (get.subtype(name) == "equip3" || player.getEquip(name)) return false;
+ switch (name) {
+ case "yexingyi":
+ if (player.hp > 2 || player.getEquip("bagua") || player.getEquip("tengjia")) return 1.5 + Math.random();
+ return 0.5 + Math.random();
+ case "rewrite_bagua":
+ case "rewrite_renwang":
+ if (player.getEquip("bagua") || player.getEquip("tengjia") || player.getEquip("renwang")) return Math.random();
+ return 1.2 + Math.random();
+ case "rewrite_tengjia":
+ if (player.getEquip("baiyin")) return 1.3 + Math.random();
+ return Math.random();
+ case "rewrite_baiyin":
+ return 0.4 + Math.random();
+ default:
+ return 0;
+ }
+ });
+ "step 1";
+ if (result.bool) {
+ event.cardname = result.links[0][2];
+ player.chooseCard("h", true, "将一张手牌置于武将牌上,然后视为装备" + get.translation(event.cardname));
+ } else event.finish();
+ "step 2";
+ if (result.bool) {
+ event.result = {
+ bool: true,
+ cards: result.cards,
+ cost_data: {
+ cardname: event.cardname,
+ },
+ };
+ }
+ },
+ async content(event, trigger, player) {
+ await player.addToExpansion(event.cards, player, "give").gaintag.add("kud_qiaoshou_equip");
+ if (!player.getExpansions("kud_qiaoshou_equip").length) return;
+ player.addTempSkill("kud_qiaoshou_equip", {
+ player: ["phaseUseEnd", "phaseZhunbeiBegin"],
+ });
+ var name = event.cost_data.cardname;
+ player.storage.kud_qiaoshou_equip2 = name;
+ player.markAuto("kud_qiaoshou_equip", cards);
+ var info = lib.card[name].skills;
+ if (info && info.length) player.addAdditionalSkill("kud_qiaoshou_equip", info);
+ game.log(player, "声明了", "#y" + get.translation(name));
+ await player.draw();
+ },
+ },
+ kud_buhui: {
+ enable: "chooseToUse",
+ filter(event, player) {
+ return event.type == "dying" && player == event.dying && player.getExpansions("kud_qiaoshou_equip").length + player.countCards("e") > 0;
+ },
+ skillAnimation: true,
+ limited: true,
+ animationColor: "gray",
+ content() {
+ "step 0";
+ player.awakenSkill("kud_buhui");
+ var cards = player.getCards("e").concat(player.getExpansions("kud_qiaoshou_equip"));
+ if (cards.length) player.discard(cards);
+ player.removeSkill("kud_qiaoshou_equip");
+ player.draw(cards.length);
+ player.addSkills("kud_chongzhen");
+ "step 1";
+ var num = 2 - player.hp;
+ if (num) player.recover(num);
+ },
+ derivation: "riki_chongzhen",
+ ai: {
+ order: 0.5,
+ result: {
+ player: 1,
+ },
+ save: true,
+ skillTagFilter(player, tag, target) {
+ return player == target;
+ },
+ },
+ },
+ kud_chongzhen: {
+ inherit: "riki_chongzhen",
+ },
+ //神尾观铃
+ misuzu_hengzhou: {
+ trigger: {
+ player: ["phaseJieshuBegin", "recoverEnd", "damageEnd", "phaseDrawBegin2", "phaseZhunbeiBegin"],
+ },
+ forced: true,
+ character: true,
+ filter(event, player) {
+ if (event.name == "phaseZhunbei") return true;
+ if (["damage", "recover"].includes(event.name)) return event.num > 0;
+ var num = player.countMark("misuzu_hengzhou");
+ if (event.name == "phaseDraw") return num > 0 && !event.numFixed;
+ return num > 3;
+ },
+ content() {
+ var num = player.countMark("misuzu_hengzhou");
+ if (trigger.name == "phaseDraw") trigger.num += num;
+ else if (trigger.name == "phaseJieshu") {
+ player.removeMark("misuzu_hengzhou", num);
+ player.loseHp();
+ } else player.addMark("misuzu_hengzhou", trigger.num || 1);
+ },
+ intro: {
+ name: "诅咒",
+ name2: "诅咒",
+ content: "mark",
+ },
+ marktext: "诅",
+ mod: {
+ maxHandcard(player, num) {
+ return num + player.countMark("misuzu_hengzhou");
+ },
+ },
+ ai: {
+ notemp: true,
+ },
+ },
+ misuzu_nongyin: {
+ enable: "chooseToUse",
+ viewAs: {
+ name: "tao",
+ isCard: true,
+ },
+ viewAsFilter(player) {
+ return (
+ !player.hasJudge("lebu") &&
+ player.countCards("hes", function (card) {
+ return get.color(card) == "red" && get.type(card, "trick") != "trick";
+ })
+ );
+ },
+ filterCard(card) {
+ return get.color(card) == "red" && get.type(card, "trick") != "trick";
+ },
+ check(card) {
+ return 7 + (_status.event.dying || _status.event.player).getDamagedHp() - get.value(card);
+ },
+ ignoreMod: true,
+ position: "hes",
+ precontent() {
+ player.logSkill("misuzu_nongyin");
+ player.$throw(event.result.cards);
+ player.addJudge({ name: "lebu" }, event.result.cards);
+ event.result.card.cards = [];
+ event.result.cards = [];
+ delete event.result.skill;
+ delete event.result.card.suit;
+ delete event.result.card.number;
+ },
+ ai: {
+ result: 0.5,
+ },
+ },
+ misuzu_zhongxing: {
+ trigger: {
+ player: "loseAfter",
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ filter(event, player) {
+ var evt = event.getl(player);
+ return evt && evt.js && evt.js.length > 0 && !player.hasSkill("misuzu_zhongxing_haruko");
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget(get.prompt("misuzu_zhongxing"), "令一名角色选择摸两张牌或回复1点体力")
+ .set("ai", function (card) {
+ return get.attitude(_status.event.player, card);
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ var target = event.targets[0];
+ player.logSkill("misuzu_zhongxing", target);
+ player.addTempSkill("misuzu_zhongxing_haruko");
+ target.chooseDrawRecover(2, true);
+ },
+ },
+ misuzu_zhongxing_haruko: { charlotte: true },
+ //久岛鸥
+ kamome_suitcase: {
+ trigger: {
+ player: ["phaseJudgeBefore", "phaseDiscardBefore", "turnOverBefore"],
+ },
+ forced: true,
+ popup: false,
+ equipSkill: true,
+ content() {
+ trigger.cancel();
+ },
+ },
+ kamome_yangfan: {
+ trigger: {
+ player: ["loseAfter", "enterGame"],
+ global: ["equipAfter", "addJudgeAfter", "phaseBefore", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ forced: true,
+ filter(event, player) {
+ if (typeof event.getl != "function") return event.name != "phase" || game.phaseNumber == 0;
+ var evt = event.getl(player);
+ return evt && evt.player == player && evt.es && evt.es.length;
+ },
+ content() {
+ if (trigger.getl) player.draw(2 * trigger.getl(player).es.length);
+ else player.equip(game.createCard2("kamome_suitcase", "spade", 1));
+ },
+ ai: {
+ noe: true,
+ reverseEquip: true,
+ effect: {
+ target(card, player, target, current) {
+ if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3];
+ },
+ },
+ },
+ },
+ kamome_huanmeng: {
+ trigger: { player: "phaseZhunbeiBegin" },
+ frequent: true,
+ content() {
+ "step 0";
+ var num = 1 + player.countCards("e");
+ 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,
+ },
+ },
+ kamome_jieban: {
+ trigger: {
+ player: "damageEnd",
+ source: "damageSource",
+ },
+ zhuanhuanji: true,
+ marktext: "☯",
+ mark: true,
+ intro: {
+ content(storage, player) {
+ return "转换技。每回合限一次,当你受到或造成伤害后," + (!storage ? "你可将两张牌交给一名其他角色,然后其交给你一张牌。" : "你可将一张牌交给一名其他角色,然后其交给你两张牌。");
+ },
+ },
+ filter(event, player) {
+ var num = player.storage.kamome_jieban ? 1 : 2;
+ return player.countCards("he") >= num && !player.hasSkill("kamome_jieban_phase");
+ },
+ async cost(event, trigger, player) {
+ event.num = player.storage.kamome_jieban ? 1 : 2;
+ event.result = await player
+ .chooseCardTarget({
+ position: "he",
+ filterCard: true,
+ filterTarget: lib.filter.notMe,
+ selectCard: event.num,
+ prompt: get.prompt("kamome_jieban"),
+ prompt2: event.num == 2 ? "将两张牌交给一名其他角色,然后其交给你一张牌。" : "将一张牌交给一名其他角色,然后其交给你两张牌。",
+ ai1(card) {
+ if (card.name == "du") return 20;
+ var val = get.value(card);
+ var player = _status.event.player;
+ if (get.position(card) == "e") {
+ if (val <= 0) return 10;
+ return 10 / val;
+ }
+ return 6 - val;
+ },
+ ai2(target) {
+ var player = _status.event.player;
+ var att = get.attitude(player, target);
+ if (ui.selected.cards[0].name == "du") return -2 * att;
+ if (att > 0) return 1.5 * att;
+ var num = get.select(_status.event.selectCard)[1];
+ if (att < 0 && num == 1) return -0.7 * att;
+ return att;
+ },
+ })
+ .forResult();
+ },
+ content() {
+ "step 0";
+ event.num = player.storage.kamome_jieban ? 1 : 2;
+ var target = targets[0];
+ event.target = target;
+ player.addTempSkill("kamome_jieban_phase");
+ player.give(cards, target);
+ player.changeZhuanhuanji("kamome_jieban");
+ "step 1";
+ var num = 3 - event.num;
+ var hs = target.getCards("he");
+ if (hs.length) {
+ if (hs.length <= num) event._result = { bool: true, cards: hs };
+ else {
+ target.chooseCard("he", true, "交给" + get.translation(player) + get.cnNumber(num) + "张牌", num).set("ai", function (card) {
+ var player = _status.event.player;
+ var target = _status.event.getParent().player;
+ if (get.attitude(player, target) > 0) {
+ if (!target.hasShan() && card.name == "shan") return 10;
+ if (get.type(card) == "equip" && !get.cardtag(card, "gifts") && target.hasUseTarget(card)) return 10 - get.value(card);
+ return 6 - get.value(card);
+ }
+ return -get.value(card);
+ });
+ }
+ } else event.finish();
+ "step 2";
+ target.give(result.cards, player);
+ },
+ },
+ kamome_jieban_phase: { charlotte: true },
+ //友利奈绪
+ nao_duyin: {
+ trigger: { global: "phaseBegin" },
+ filter(event, player) {
+ return event.player != player && (!player.storage.nao_duyin || !player.storage.nao_duyin.includes(event.player));
+ },
+ logTarget: "player",
+ charlotte: true,
+ check() {
+ return false;
+ },
+ content() {
+ "step 0";
+ player.chooseToDiscard("he", "弃置一张牌,或将武将牌翻面").set("ai", function (card) {
+ if (_status.event.player.isTurnedOver()) return 0;
+ return 6 - get.value(card);
+ });
+ "step 1";
+ if (!result.bool) player.turnOver();
+ player.addTempSkill("nao_duyin2", { player: "phaseAfter" });
+ if (!player.storage.nao_duyin) player.storage.nao_duyin = [];
+ player.storage.nao_duyin.push(trigger.player);
+ if (!player.storage.nao_duyin2) player.storage.nao_duyin2 = [];
+ player.storage.nao_duyin2.push(trigger.player);
+ player.markSkill("nao_duyin2");
+ },
+ },
+ nao_duyin2: {
+ intro: {
+ content: "$不能使用牌指定你为目标,对$使用牌没有距离和次数限制",
+ },
+ mod: {
+ targetEnabled(card, player, target) {
+ if (target.storage.nao_duyin2 && target.storage.nao_duyin2.includes(player)) return false;
+ },
+ targetInRange(card, player, target) {
+ if (player.storage.nao_duyin2 && player.storage.nao_duyin2.includes(target)) return true;
+ },
+ },
+ trigger: { player: "useCardEnd" },
+ firstDo: true,
+ silent: true,
+ onremove: true,
+ filter(event, player) {
+ if (player.storage.nao_duyin2) {
+ for (var i of player.storage.nao_duyin2) {
+ if (event.targets.includes(i)) return true;
+ }
+ }
+ return false;
+ },
+ content() {
+ if (trigger.addCount !== false) {
+ trigger.addCount = false;
+ var stat = player.getStat();
+ if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--;
+ }
+ },
+ },
+ nao_wanxin: {
+ trigger: { global: "phaseEnd" },
+ hasHistory(player) {
+ return player.getHistory("damage").length > 0;
+ },
+ filter(event, player) {
+ return game.hasPlayer(function (current) {
+ return lib.skill.nao_wanxin.hasHistory(current);
+ });
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget(get.prompt2("nao_wanxin"), function (card, player, target) {
+ return _status.event.yuus.includes(target);
+ })
+ .set(
+ "yuus",
+ game.filterPlayer(function (current) {
+ return lib.skill.nao_wanxin.hasHistory(current);
+ })
+ )
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ await target.draw(2);
+ await player.turnOver(false);
+ await player.link(false);
+ if (target == player) return;
+ await target.turnOver(false);
+ await target.link(false);
+ },
+ },
+ nao_shouqing: {
+ global: "nao_shouqing2",
+ },
+ nao_shouqing2: {
+ enable: "phaseUse",
+ viewAs() {
+ return { name: "tao" };
+ },
+ filterCard: { name: "tao" },
+ ignoreMod: true,
+ filterTarget(card, player, target) {
+ return target != player && target.isDamaged() && target.hasSkill("nao_shouqing");
+ },
+ selectTarget() {
+ return game.countPlayer(function (current) {
+ return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current);
+ }) > 1
+ ? 1
+ : -1;
+ },
+ filter(event, player) {
+ return (
+ player.countCards("hs", "tao") &&
+ game.hasPlayer(function (current) {
+ return lib.skill.nao_shouqing2.filterTarget(null, player, current);
+ })
+ );
+ },
+ position: "hs",
+ onuse(links, player) {
+ player.addSkill("nao_shouqing3");
+ player.addMark("nao_shouqing3", 1, false);
+ },
+ prompt() {
+ var list = game.filterPlayer(function (current) {
+ return lib.skill.nao_shouqing2.filterTarget(null, _status.event.player, current);
+ });
+ var str = "对" + get.translation(list);
+ if (list.length > 1) str += "中的一名角色";
+ str += "使用一张【桃】";
+ return str;
+ },
+ },
+ nao_shouqing3: {
+ intro: {
+ content: "手牌上限+#",
+ },
+ mod: {
+ maxHandcard(player, num) {
+ return num + player.countMark("nao_shouqing3");
+ },
+ },
+ trigger: { player: "useCardAfter" },
+ forced: true,
+ popup: false,
+ filter(event, player) {
+ return event.skill == "nao_shouqing2";
+ },
+ content() {
+ player.draw();
+ },
+ },
+ //远野美凪&远野小满
+ minagi_peiquan: {
+ enable: "phaseUse",
+ filter(event, player) {
+ return player.hasCard(card => card.hasGaintag("minagi_tag"), "h");
+ },
+ filterCard(card) {
+ return card.hasGaintag("minagi_tag");
+ },
+ position: "h",
+ filterTarget: lib.filter.notMe,
+ discard: false,
+ lose: false,
+ delay: false,
+ promptfunc: () => "出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。",
+ check: card => {
+ const player = _status.event.player;
+ return get.type(card, false) == "equip" && game.hasPlayer(current => player.canGift(card, current, true) && !current.refuseGifts(card, player) && get.effect(current, card, player, player) > 0) ? 2 : 1 + Math.random();
+ },
+ content() {
+ "step 0";
+ player.gift(cards, target);
+ "step 1";
+ var list = player.getStorage("minagi_peiquan_yukito");
+ if (list.length >= 4) event.finish();
+ else {
+ var yukito = get.translation(target);
+ player
+ .chooseButton(
+ [
+ "配券:请选择一项执行",
+ [
+ [
+ ["damage", "选项一:对" + yukito + "造成1点伤害"],
+ ["draw", "选项二:摸两张牌"],
+ ["discard", "选项三:弃置" + yukito + "的两张牌"],
+ ["use", "选项四:亮出牌堆顶的一张牌,然后可以使用之"],
+ ],
+ "textbutton",
+ ],
+ ],
+ true
+ )
+ .set("list", list)
+ .set("filterButton", function (button) {
+ return !_status.event.list.includes(button.link);
+ })
+ .set("ai", function (button) {
+ var player = _status.event.player,
+ target = _status.event.getParent().target;
+ switch (button.link) {
+ case "damage":
+ return get.damageEffect(target, player, player);
+ case "draw":
+ return 2 * get.effect(player, { name: "draw" }, player, player);
+ case "discard":
+ return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(1.6, target.countCards("he"));
+ case "use":
+ return _status.event.getRand("minagi_peiquan") * 4;
+ }
+ });
+ }
+ "step 2";
+ player.markAuto("minagi_peiquan_yukito", result.links);
+ player.addTempSkill("minagi_peiquan_yukito");
+ switch (result.links[0]) {
+ case "damage":
+ target.damage("nocard");
+ break;
+ case "draw":
+ player.draw(2);
+ break;
+ case "discard":
+ player.discardPlayerCard(target, 2, "he", true);
+ break;
+ }
+ if (result.links[0] != "use") event.finish();
+ "step 3";
+ var card = get.cards()[0];
+ game.cardsGotoOrdering(card);
+ player.showCards(card);
+ player.chooseUseTarget(card, "是否使用" + get.translation(card) + "?");
+ },
+ ai: {
+ order: 4,
+ result: {
+ player: (player, target) => {
+ const giftEffects = ui.selected.cards.map(value => player.getGiftEffect(value, target));
+ const baseEffect = Math.min(3, giftEffects.reduce((previousValue, currentValue) => previousValue + currentValue, 0) / giftEffects.length);
+ const choices = ["damage", "draw", "discard", "use"];
+ choices.removeArray(player.getStorage("minagi_peiquan_yukito"));
+ if (choices.length <= 0) return baseEffect;
+ return (
+ baseEffect +
+ Math.max(
+ ...choices.map(choice => {
+ switch (choice) {
+ case "damage":
+ return get.damageEffect(target, player, player);
+ case "draw":
+ return 2 * get.effect(player, { name: "draw" }, player, player);
+ case "discard":
+ return get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(1.6, target.countCards("he"));
+ case "use":
+ return _status.event.getRand("minagi_peiquan") * 4;
+ }
+ })
+ )
+ );
+ },
+ },
+ },
+ group: "minagi_peiquan_umareta",
+ subSkill: {
+ yukito: { charlotte: true, onremove: true },
+ umareta: {
+ trigger: {
+ global: "phaseBefore",
+ player: "enterGame",
+ },
+ forced: true,
+ filter(event, player) {
+ return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0;
+ },
+ content() {
+ var hs = player.getCards("h");
+ player.addGaintag(hs, "minagi_tag");
+ },
+ },
+ },
+ },
+ minagi_huanliu: {
+ trigger: { player: "phaseZhunbeiBegin" },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget(lib.filter.notMe, get.prompt("minagi_huanliu"), "和一名其他角色进行“协力”,并获得“远野小满”的所有对应技能")
+ .set("ai", function (target) {
+ return get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1);
+ })
+ .forResult();
+ },
+ content() {
+ "step 0";
+ var target = targets[0];
+ player.chooseCooperationFor(target, "minagi_huanliu").set("ai", function (button) {
+ var base = 0;
+ switch (button.link) {
+ case "cooperation_damage":
+ base = 0.1;
+ break;
+ case "cooperation_draw":
+ base = 0.6;
+ break;
+ case "cooperation_discard":
+ base = 0.1;
+ break;
+ case "cooperation_use":
+ base = 0.3;
+ break;
+ }
+ return base + Math.random();
+ });
+ player.addAdditionalSkill("cooperation", ["minagi_huanliu_effect", "michiru_sheyuan"]);
+ "step 1";
+ game.delayx();
+ },
+ subSkill: {
+ effect: {
+ charlotte: true,
+ trigger: { global: "phaseJieshuBegin" },
+ forced: true,
+ logTarget: "player",
+ filter(event, player) {
+ return player.checkCooperationStatus(event.player, "minagi_huanliu") && player.countCards("h") > 0;
+ },
+ content() {
+ game.log(player, "和", trigger.player, "的协力成功");
+ var hs = player.getCards("h");
+ player.addGaintag(hs, "minagi_tag");
+ game.delayx();
+ },
+ },
+ },
+ derivation: "michiru_sheyuan",
+ },
+ michiru_sheyuan: {
+ charlotte: true,
+ enable: "chooseToUse",
+ filter(event, player) {
+ if (player.hasSkill("michiru_sheyuan_round")) return false;
+ var hs = player.getCards("h");
+ if (!hs.length) return false;
+ for (var i of hs) {
+ if (i.hasGaintag("minagi_tag")) return false;
+ if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false;
+ }
+ for (var name of lib.inpile) {
+ var type = get.type(name);
+ if (type != "basic" && type != "trick") return false;
+ var card = get.autoViewAs({ name: name }, hs);
+ if (event.filterCard(card, player, event)) return true;
+ if (name == "sha") {
+ for (var nature of lib.inpile_nature) {
+ card.nature = nature;
+ if (event.filterCard(card, player, event)) return true;
+ }
+ }
+ }
+ return false;
+ },
+ hiddenCard(player, name) {
+ var type = get.type(name);
+ if (type != "basic" && type != "trick") return false;
+ if (player.hasSkill("michiru_sheyuan_round")) return false;
+ var hs = player.getCards("h");
+ if (!hs.length) return false;
+ if (_status.connectMode) return true;
+ for (var i of hs) {
+ if (i.hasGaintag("minagi_tag")) return false;
+ if (!game.checkMod(i, player, "unchanged", "cardEnabled2", player)) return false;
+ }
+ return true;
+ },
+ chooseButton: {
+ dialog(event, player) {
+ var list = [],
+ hs = player.getCards("h");
+ for (var name of lib.inpile) {
+ var type = get.type(name);
+ if (type != "basic" && type != "trick") continue;
+ var card = get.autoViewAs({ name: name }, hs);
+ if (event.filterCard(card, player, event)) list.push([type, "", name]);
+ if (name == "sha") {
+ for (var nature of lib.inpile_nature) {
+ card.nature = nature;
+ if (event.filterCard(card, player, event)) list.push([type, "", name, nature]);
+ }
+ }
+ }
+ return ui.create.dialog("舍愿", [list, "vcard"], "hidden");
+ },
+ check(button) {
+ var player = _status.event.player;
+ var card = {
+ name: button.link[2],
+ nature: button.link[3],
+ };
+ if (_status.event.getParent().type == "phase") return player.getUseValue(card, null, true);
+ return 1;
+ },
+ backup(links, player) {
+ return {
+ viewAs: {
+ name: links[0][2],
+ nature: links[0][3],
+ },
+ filterCard: true,
+ position: "h",
+ selectCard: -1,
+ onuse(result, player) {
+ player.addTempSkill("michiru_sheyuan_round", "roundStart");
+ },
+ };
+ },
+ prompt(links, player) {
+ return "将所有手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用,然后摸等量的牌";
+ },
+ },
+ ai: {
+ respondSha: true,
+ respondShan: true,
+ skillTagFilter(player, tag, arg) {
+ return lib.skill.michiru_sheyuan.hiddenCard(player, "s" + tag.slice(8));
+ },
+ order: 1,
+ result: {
+ player(player) {
+ if (_status.event.dying) return get.attitude(player, _status.event.dying);
+ return 1;
+ },
+ },
+ },
+ subSkill: {
+ round: {
+ charlotte: true,
+ trigger: { player: "useCardAfter" },
+ forced: true,
+ popup: false,
+ filter(event, player) {
+ return event.skill == "michiru_sheyuan_backup";
+ },
+ content() {
+ player.draw(trigger.cards.length);
+ },
+ },
+ backup: {},
+ },
+ },
+ //坂上智代
+ tomoyo_wuwei: {
+ enable: ["chooseToUse", "chooseToRespond"],
+ viewAs: { name: "sha" },
+ viewAsFilter(player) {
+ var storage = player.getStorage("tomoyo_wuwei_mark");
+ return player.hasCard(function (card) {
+ return !storage.includes(get.suit(card));
+ }, "hs");
+ },
+ position: "hs",
+ filterCard(card, player) {
+ var storage = player.getStorage("tomoyo_wuwei_mark");
+ return !storage.includes(get.suit(card));
+ },
+ check(card) {
+ return 5 - get.value(card);
+ },
+ onuse(result, player) {
+ player.markAuto("tomoyo_wuwei_mark", [get.suit(result.card, false)]);
+ player.addTempSkill("tomoyo_wuwei_mark");
+ },
+ onrespond(event, player) {
+ player.markAuto("tomoyo_wuwei_mark", [get.suit(event.card, false)]);
+ player.addTempSkill("tomoyo_wuwei_mark");
+ },
+ group: "tomoyo_wuwei_combo",
+ subSkill: {
+ mark: {
+ charlotte: true,
+ onremove: true,
+ },
+ combo: {
+ trigger: { global: "useCardAfter" },
+ direct: true,
+ //chooseToUse类技能暂时没办法改
+ filter(event, player) {
+ return event.card.name == "shan" && player.inRangeOf(event.player) && player.canUse("sha", event.player, false);
+ },
+ content() {
+ player
+ .chooseToUse(
+ "武威:是否对" + get.translation(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 = "tomoyo_wuwei_combo";
+ },
+ },
+ },
+ },
+ tomoyo_zhengfeng: {
+ dutySkill: true,
+ trigger: { player: "phaseZhunbeiBegin" },
+ filter(event, player) {
+ return game.hasPlayer(current => player.inRange(current));
+ },
+ derivation: "tomoyo_changshi",
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget(get.prompt("tomoyo_zhengfeng"), "令一名攻击范围内的角色进行判定。其于你的下回合开始前使用与判定结果颜色相同的牌时,你摸一张牌。", function (card, player, target) {
+ return player.inRange(target);
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ if (player.hp <= 1 && !player.countCards("h")) return 0;
+ var hs = target.countCards("h"),
+ thr = get.threaten(target);
+ if (target.hasJudge("lebu")) return 0;
+ return Math.sqrt(1 + hs) * Math.sqrt(Math.max(1, 1 + thr));
+ })
+ .forResult();
+ },
+ content() {
+ "step 0";
+ var target = targets[0];
+ event.target = target;
+ target.judge();
+ "step 1";
+ player.addTempSkill("tomoyo_zhengfeng_tomoyo", {
+ player: "phaseBeginStart",
+ });
+ player.markAuto("tomoyo_zhengfeng_tomoyo", [
+ {
+ target: target,
+ color: result.color,
+ },
+ ]);
+ },
+ group: "tomoyo_zhengfeng_after",
+ subSkill: {
+ tomoyo: {
+ charlotte: true,
+ onremove: true,
+ mod: {
+ inRangeOf(source, player) {
+ var list = player.getStorage("tomoyo_zhengfeng_tomoyo");
+ for (var obj of list) {
+ if (obj.target == source) return true;
+ }
+ },
+ },
+ trigger: { global: "useCard" },
+ forced: true,
+ filter(event, player) {
+ var color = get.color(event.card);
+ if (color == "none") return false;
+ var list = player.getStorage("tomoyo_zhengfeng_tomoyo");
+ for (var obj of list) {
+ if (obj.target == event.player && color == obj.color) return true;
+ }
+ return false;
+ },
+ content() {
+ player.draw();
+ },
+ intro: {
+ mark(dialog, students, player) {
+ if (!students || !students.length) return "全校风纪良好!";
+ var str = "";
+ for (var i of students) {
+ if (str.length > 0) str += "
";
+ str += get.translation(i.target);
+ str += ":";
+ str += get.translation(i.color);
+ }
+ dialog.addText(str);
+ },
+ },
+ },
+ after: {
+ trigger: { player: "phaseJieshuBegin" },
+ filter(event, player) {
+ return !player.hasHistory("useSkill", function (evt) {
+ return evt.skill == "tomoyo_zhengfeng";
+ });
+ },
+ prompt: "整风:是否放弃使命?",
+ prompt2: "你可以减1点体力上限并失去〖武威〗,摸两张牌并回复1点体力,然后获得技能〖长誓〗。",
+ skillAnimation: true,
+ animationColor: "gray",
+ check(event, player) {
+ return player.hp * 1.1 + player.countCards("h") < 3;
+ },
+ content() {
+ "step 0";
+ game.log(player, "放弃了身为学生会长的使命");
+ player.awakenSkill("tomoyo_zhengfeng");
+ player.loseMaxHp();
+ "step 1";
+ player.removeSkills("tomoyo_wuwei");
+ "step 2";
+ player.draw(2);
+ player.recover();
+ "step 3";
+ player.addSkills("tomoyo_changshi");
+ },
+ },
+ },
+ },
+ tomoyo_changshi: {
+ trigger: {
+ global: ["gainAfter", "loseAsyncAfter"],
+ },
+ forced: true,
+ filter(event, player) {
+ return game.hasPlayer(function (current) {
+ return current != player && event.getg(current).length > 1 && player.inRangeOf(current);
+ });
+ },
+ content() {
+ player.draw();
+ },
+ group: "tomoyo_changshi_recover",
+ subSkill: {
+ recover: {
+ trigger: { global: "recoverAfter" },
+ forced: true,
+ filter(event, player) {
+ return event.player.isAlive() && player.inRangeOf(event.player);
+ },
+ content() {
+ player.changeHujia(1);
+ },
+ },
+ },
+ },
+ //天宫希优
+ kiyu_yuling: {
+ mod: {
+ targetEnabled(card) {
+ var info = get.info(card);
+ if (!info || (info.type != "trick" && info.type != "delay")) return;
+ if (info.range) return false;
+ },
+ },
+ trigger: { target: "useCardToTargeted" },
+ forced: true,
+ charlotte: true,
+ filter(event, player) {
+ return event.card.name == "sha" && event.player.countCards("he") > 0;
+ },
+ logTarget: "player",
+ content() {
+ trigger.player.chooseToDiscard("he", true, get.distance(trigger.player, player));
+ },
+ ai: {
+ threaten: 0.7,
+ effect: {
+ target(card, player, target, current) {
+ if (card.name == "sha") return 0.7;
+ },
+ },
+ },
+ },
+ kiyu_rexianyu: {
+ trigger: { player: "phaseUseEnd" },
+ charlotte: true,
+ unique: true,
+ filter(event, player) {
+ return (
+ !player.hasSkill("kiyu_rexianyu_round", null, null, false) &&
+ player.hasHistory("useCard", function (evt) {
+ var type = get.type(evt.card);
+ if (type != "basic" && type != "trick") return false;
+ return evt.getParent("phaseUse") == event;
+ })
+ );
+ },
+ async cost(event, trigger, player) {
+ const history = player.getHistory("useCard", function (evt) {
+ var type = get.type(evt.card);
+ if (type != "basic" && type != "trick") return false;
+ return evt.getParent("phaseUse") == trigger;
+ });
+ const list = [];
+ for (var i = 0; i < Math.min(history.length, 3); i++) {
+ var card = history[i].card;
+ list.push({ name: card.name, isCard: true });
+ if (card.nature) list[i].nature = card.nature;
+ }
+ const { result } = await player
+ .chooseTarget(get.prompt("kiyu_rexianyu"), "将以下使用结果告知于一名其他角色:" + get.translation(list), function (card, player, target) {
+ return target != player && !target.hasSkill("kiyu_rexianyu_lastrun", null, null, false);
+ })
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target) * get.threaten(target) * Math.sqrt(1 + target.countCards("h")) * (target.isTurnedOver() || target.hasJudge("lebu") ? 0.1 : 1);
+ });
+ if (result.bool) {
+ event.result = {
+ bool: result.bool,
+ targets: result.targets,
+ cost_data: { list },
+ };
+ }
+ },
+ async content(event, trigger, player) {
+ player.addTempSkill("kiyu_rexianyu_round", "roundStart");
+ const tabito = targets[0];
+ tabito.storage.kiyu_rexianyu_lastrun = event.cost_data.list;
+ tabito.storage.amamiya_kiyu = player;
+ tabito.addTempSkill("kiyu_rexianyu_lastrun", {
+ player: ["phaseUseAfter"],
+ global: ["roundStart"],
+ });
+ await game.asyncDelayx();
+ },
+ subSkill: {
+ round: { charlotte: true },
+ lastrun: {
+ enable: "chooseToUse",
+ onChooseToUse(event) {
+ if (!game.online && event.type == "phase") {
+ var evtx = event.getParent();
+ var num = event.player.getHistory("useCard", function (evt) {
+ return evt.getParent("phaseUse") == evtx;
+ }).length;
+ event.set("rexianyu_num", num);
+ }
+ },
+ filter(event, player) {
+ if (!player.countCards("hs")) return false;
+ var num = event.rexianyu_num,
+ list = player.storage.kiyu_rexianyu_lastrun;
+ if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return false;
+ var card = get.copy(list[num]);
+ delete card.isCard;
+ card = get.autoViewAs(card, "unsure");
+ if (event.filterCard(card, player, event)) return true;
+ return false;
+ },
+ onremove: true,
+ viewAs(cards, player) {
+ var num = _status.event.rexianyu_num,
+ list = player.storage.kiyu_rexianyu_lastrun;
+ if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return { name: "sha" };
+ var card = get.copy(list[num]);
+ delete card.isCard;
+ return card;
+ },
+ prompt() {
+ var player = _status.event.player;
+ var num = _status.event.rexianyu_num,
+ list = player.storage.kiyu_rexianyu_lastrun;
+ if (!Array.isArray(list) || typeof num != "number" || list.length <= num) return "无可用牌";
+ var card = list[num];
+ var str = "将一张牌当做" + get.translation(card);
+ var kiyu = player.storage.amamiya_kiyu;
+ if (kiyu && kiyu.isAlive()) str += ";然后" + get.translation(kiyu) + "摸一张牌,且你本回合的手牌上限+1";
+ return str;
+ },
+ filterCard: true,
+ position: "h",
+ popname: true,
+ check(card) {
+ var player = _status.event.player;
+ var num = _status.event.rexianyu_num,
+ list = player.storage.kiyu_rexianyu_lastrun;
+ return player.getUseValue(list[num], null, true) - player.getUseValue(card, null, true);
+ },
+ group: "kiyu_rexianyu_earthbound",
+ mark: true,
+ intro: { content: "已记录:$" },
+ ai: {
+ order: 12,
+ result: {
+ player(player) {
+ var lunarq = player.storage.amamiya_kiyu;
+ if (lunarq && get.attitude(player, lunarq) <= 0) return -1;
+ return 1;
+ },
+ },
+ },
+ },
+ earthbound: {
+ trigger: { player: "useCardAfter" },
+ forced: true,
+ charlotte: true,
+ filter(event, player) {
+ if (event.skill != "kiyu_rexianyu_lastrun") return false;
+ var lunarq = player.storage.amamiya_kiyu;
+ return get.itemtype(lunarq) == "player" && lunarq.isAlive();
+ },
+ content() {
+ var lunarq = player.storage.amamiya_kiyu;
+ lunarq.draw();
+ player.addTempSkill("kiyu_rexianyu_wolf");
+ player.addMark("kiyu_rexianyu_wolf", 1, false);
+ },
+ },
+ wolf: {
+ charlotte: true,
+ onremove: true,
+ mod: {
+ maxHandcard(player, num) {
+ return num + player.countMark("kiyu_rexianyu_wolf");
+ },
+ },
+ markimage: "image/card/handcard.png",
+ intro: { content: "手牌上限+#" },
+ },
+ },
+ },
+ kiyu_xianyu: {
+ trigger: { global: "phaseUseBegin" },
+ charlotte: true,
+ round: 1,
+ filter(event, player) {
+ return event.player.countCards("h") > 0;
+ },
+ logTarget: "player",
+ check(event, player) {
+ var target = event.player;
+ var next = target.next;
+ if (target.getSeatNum() > next.getSeatNum()) return true;
+ if (
+ target.countCards("h") < 4 &&
+ target.countCards("h", function (card) {
+ return target.hasUseTarget(card, null, true);
+ }) < 2
+ )
+ return false;
+ return true;
+ },
+ content() {
+ "step 0";
+ var target = trigger.player,
+ cards = target.getCards("h");
+ var next = player.chooseToMove("先预:预测" + get.translation(target) + "使用牌的顺序", true);
+ next.set("list", [[get.translation(target) + "的手牌", cards]]);
+ next.set("processAI", function (list) {
+ var cards = list[0][1].slice(0);
+ var target = _status.event.getTrigger().player;
+ cards.sort(function (a, b) {
+ return get.order(b, target) - get.order(a, target);
+ });
+ return [cards];
+ });
+ "step 1";
+ if (result.bool) {
+ var list = result.moved[0];
+ player.storage.kiyu_xianyu_lastrun = list;
+ player.addTempSkill("kiyu_xianyu_lastrun", list);
+ }
+ },
+ subSkill: {
+ lastrun: {
+ trigger: { global: "phaseUseAfter" },
+ forced: true,
+ charlotte: true,
+ onremove: true,
+ content() {
+ var num = 0,
+ index = -1,
+ target = trigger.player;
+ var cards = player.getStorage("kiyu_xianyu_lastrun");
+ var history = target.getHistory("useCard", function (event) {
+ return event.getParent("phaseUse") == trigger;
+ });
+ for (var evt of history) {
+ var goon = false;
+ for (var card of evt.cards) {
+ var index2 = cards.indexOf(card);
+ if (index2 > index) {
+ goon = true;
+ index = index2;
+ }
+ }
+ if (goon) num++;
+ }
+ if (num > 0) {
+ num = Math.min(3, num);
+ player.draw(num);
+ if (target.isIn()) {
+ target.addTempSkill("kiyu_xianyu_effect");
+ target.addMark("kiyu_xianyu_effect", num, false);
+ }
+ }
+ },
+ },
+ effect: {
+ charlotte: true,
+ onremove: true,
+ mod: {
+ maxHandcard(player, num) {
+ return num + player.countMark("kiyu_xianyu_effect");
+ },
+ },
+ },
+ },
+ },
+ //樱庭星罗
+ seira_xinghui: {
+ trigger: { player: "phaseZhunbeiBegin" },
+ check(event, player) {
+ return !player.getExpansions("seira_xinghui").length;
+ },
+ content() {
+ "step 0";
+ game.delayx();
+ "step 1";
+ if (get.isLuckyStar(player)) {
+ event.num = 6;
+ player.throwDice(6);
+ } else player.throwDice();
+ "step 2";
+ var cards = get.cards(num);
+ event.cards = cards;
+ game.cardsGotoOrdering(cards);
+ var next = player.chooseToMove();
+ next.set("prompt", "星辉:选择要作为“星屑”的牌(先选择的在上)");
+ next.set("list", [["置于武将牌上", cards], ["置入弃牌堆"]]);
+ 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 3";
+ if (result.bool && result.moved && result.moved[0].length) {
+ event.cards = result.moved[0];
+ player
+ .chooseTarget(true, "将以下牌置于一名角色的武将牌上", get.translation(event.cards), function (card, player, target) {
+ return !target.getExpansions("seira_xinghui").length;
+ })
+ .set("ai", function (target) {
+ return target == _status.event.player ? 1 : 0;
+ });
+ event.cards.reverse();
+ } else event.finish();
+ "step 4";
+ var target = result.targets[0];
+ player.line(target, { color: [253, 153, 182] });
+ target.addToExpansion(cards).gaintag.add("seira_xinghui");
+ game.log(player, "将" + get.cnNumber(cards.length) + "张牌置于", target, "的武将牌上");
+ target.addSkill("seira_xinghui_hoshikuzu");
+ },
+ intro: {
+ markcount: "expansion",
+ content(storage, player) {
+ return "共有" + get.cnNumber(player.getExpansions("seira_xinghui").length) + "张牌";
+ },
+ onunmark(storage, player) {
+ player.removeSkill("seira_xinghui_hoshikuzu");
+ },
+ },
+ subSkill: {
+ hoshikuzu: {
+ trigger: { source: "damageBegin1" },
+ forced: true,
+ charlotte: true,
+ filter(event, player) {
+ return player.getExpansions("seira_xinghui").length > 0;
+ },
+ content() {
+ trigger.num++;
+ game.log(player, "造成了", "#y暴击伤害");
+ },
+ group: ["seira_xinghui_draw", "seira_xinghui_judge"],
+ },
+ draw: {
+ trigger: { player: "drawBefore" },
+ forced: true,
+ filter(event, player) {
+ return player.getExpansions("seira_xinghui").length > 0;
+ },
+ content() {
+ var cards = player.getExpansions("seira_xinghui");
+ var num = Math.min(cards.length, trigger.num);
+ trigger.num -= num;
+ player.gain(cards.slice(0, num), "draw");
+ if (trigger.num == 0) trigger.cancel();
+ },
+ },
+ judge: {
+ trigger: { player: "judgeBegin" },
+ forced: true,
+ filter(event, player) {
+ return player.getExpansions("seira_xinghui").length > 0;
+ },
+ content() {
+ trigger.directresult = player.getExpansions("seira_xinghui")[0];
+ },
+ },
+ },
+ },
+ seira_yuanying: {
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: true,
+ selectTarget: 2,
+ multitarget: true,
+ multiline: true,
+ line: { color: [253, 153, 182] },
+ content() {
+ game.filterPlayer()
+ .sortBySeat()
+ .forEach(function (current) {
+ if (!targets.includes(current)) {
+ current.removeSkills("seira_yinyuan");
+ } else {
+ current.addSkills("seira_yinyuan");
+ }
+ });
+ game.delayx();
+ },
+ ai: {
+ order: 1,
+ result: { target: 1 },
+ expose: 0.1,
+ },
+ derivation: "seira_yinyuan",
+ },
+ seira_yinyuan: {
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget(card, player, target) {
+ return target != player && target.hasSkill("seira_yinyuan", null, null, false) && target.countCards("hej") > 0;
+ },
+ content() {
+ player.gainPlayerCard(target, true, "hej");
+ target.recover();
+ },
+ mark: true,
+ intro: {
+ content: "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。",
+ },
+ ai: {
+ order: 9,
+ viewHandcard: true,
+ skillTagFilter(player, tag, arg) {
+ if (player == arg) return false;
+ return player.hasSkill("seira_yinyuan") && arg.hasSkill("seira_yinyuan");
+ },
+ result: {
+ player(player, target) {
+ var effect = get.effect(target, { name: "shunshou_copy" }, player, player);
+ if (target.isDamaged()) {
+ if (effect < 0) effect /= 2;
+ effect += get.recoverEffect(target, player, player);
+ }
+ return effect;
+ },
+ },
+ },
+ },
+ //佐藤雏
+ hina_shenshi: {
+ groupSkill: true,
+ trigger: { player: ["phaseUseBegin", "phaseUseEnd"] },
+ frequent: true,
+ filter(event, player) {
+ return player.group == "shen";
+ },
+ content() {
+ "step 0";
+ player.draw(2).gaintag = ["hina_shenshi"];
+ player.addSkill("hina_shenshi_yingbian");
+ "step 1";
+ var cards = player.getCards("h", function (card) {
+ return card.hasGaintag("hina_shenshi");
+ });
+ if (!cards.length) event.finish();
+ else if (cards.length == 1) event._result = { bool: true, cards: cards };
+ else
+ player.chooseCard("h", true, "将一张“神视”牌置于牌堆顶", function (card) {
+ return card.hasGaintag("hina_shenshi");
+ });
+ "step 2";
+ if (result.bool) {
+ game.log(player, "将一张牌置于了牌堆顶");
+ player.lose(result.cards, ui.cardPile, "insert");
+ player.$throw(1, 1000);
+ } else event.finish();
+ "step 3";
+ game.delayx();
+ },
+ onremove(player) {
+ player.removeGaintag("hina_shenshi");
+ },
+ group: "hina_shenshi_yingbian",
+ },
+ hina_shenshi_yingbian: {
+ trigger: { player: "yingbian" },
+ forced: true,
+ filter: (event, player) => event.card.isCard && player.hasHistory("lose", evt => evt.getParent() == event && Object.values(evt.gaintag_map).some(value => value.includes("hina_shenshi"))),
+ content: () => {
+ if (!Array.isArray(trigger.temporaryYingbian)) trigger.temporaryYingbian = [];
+ trigger.temporaryYingbian.add("force");
+ trigger.temporaryYingbian.addArray(get.yingbianEffects());
+ },
+ },
+ hina_xingzhi: {
+ groupSkill: true,
+ trigger: { player: "yingbian" },
+ usable: 1,
+ filter: (event, player) => player.group == "key" && !event.card.yingbian && lib.yingbian.condition.complex.has("zhuzhan"),
+ content: () => {
+ "step 0";
+ trigger.yingbianZhuzhanAI = (player, card, source, targets) => cardx => {
+ if (get.attitude(player, source) <= 0) return 0;
+ var info = get.info(card),
+ num = 0;
+ if (info && info.ai && info.ai.yingbian) {
+ var ai = info.ai.yingbian(card, source, targets, player);
+ if (ai) num = ai;
+ }
+ return Math.max(num, 6) - get.value(cardx);
+ };
+ trigger.afterYingbianZhuzhan = event => event.zhuzhanresult.draw(2);
+ lib.yingbian.condition.complex.get("zhuzhan")(trigger);
+ "step 1";
+ if (!result.bool) return;
+ trigger.card.yingbian = true;
+ lib.yingbian.effect.forEach(value => game.yingbianEffect(trigger, value));
+ player.addTempSkill("yingbian_changeTarget");
+ },
+ },
+ //神山识
+ shiki_omusubi: {
+ audio: 2,
+ trigger: { global: "roundStart" },
+ direct: true,
+ content() {
+ "step 0";
+ player.chooseTarget(get.prompt2("shiki_omusubi"), lib.filter.notMe).set("ai", function (target) {
+ var player = _status.event.player;
+ if (player.isHealthy()) return 0;
+ if (player.hp < 3 && player.getDamagedHp() < 2) return 0;
+ var list = [];
+ if (lib.character[target.name]) list.addArray(lib.character[target.name][3]);
+ if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]);
+ if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]);
+ list = list.filter(function (i) {
+ return !player.hasSkill(i);
+ });
+ if (!list.length) return 0;
+ return 1 + Math.random();
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("shiki_omusubi", target);
+ player.loseMaxHp();
+ var list = [];
+ if (lib.character[target.name]) list.addArray(lib.character[target.name][3]);
+ if (lib.character[target.name1]) list.addArray(lib.character[target.name1][3]);
+ if (lib.character[target.name2]) list.addArray(lib.character[target.name2][3]);
+ player.addSkills(list);
+ game.broadcastAll(function (list) {
+ lib.character.key_shiki[3].addArray(list);
+ game.expandSkills(list);
+ for (var i of list) {
+ var info = lib.skill[i];
+ if (!info) continue;
+ if (!info.audioname2) info.audioname2 = {};
+ info.audioname2.key_shiki = "shiki_omusubi";
+ }
+ }, list);
+ }
+ },
+ },
+ //篝
+ kagari_zongsi: {
+ enable: "phaseUse",
+ usable: 1,
+ content() {
+ "step 0";
+ var controls = [];
+ if (ui.cardPile.hasChildNodes()) controls.push("选择牌堆中的一张牌");
+ if (ui.discardPile.hasChildNodes()) controls.push("选择弃牌堆中的一张牌");
+ if (
+ game.hasPlayer(function (current) {
+ return current.countCards("hej") > 0;
+ })
+ )
+ controls.push("选择一名角色区域内的一张牌");
+ if (!controls.length) {
+ event.finish();
+ return;
+ }
+ event.controls = controls;
+ var next = player.chooseControl();
+ next.set("choiceList", controls);
+ next.set("prompt", "请选择要移动的卡牌的来源");
+ next.ai = function () {
+ return 0;
+ };
+ "step 1";
+ result.control = event.controls[result.index];
+ var list = ["弃牌堆", "牌堆", "角色"];
+ for (var i = 0; i < list.length; i++) {
+ if (result.control.indexOf(list[i]) != -1) {
+ event.index = i;
+ break;
+ }
+ }
+ if (event.index == 2) {
+ player.chooseTarget("请选择要移动的卡牌的来源", true, function (card, kagari, target) {
+ return target.countCards("hej") > 0;
+ });
+ } else {
+ var source = ui[event.index == 0 ? "discardPile" : "cardPile"].childNodes;
+ var list = [];
+ for (var i = 0; i < source.length; i++) list.push(source[i]);
+ player.chooseButton(["请选择要移动的卡牌", list], true).ai = get.buttonValue;
+ }
+ "step 2";
+ if (event.index == 2) {
+ player.line(result.targets[0]);
+ event.target1 = result.targets[0];
+ player.choosePlayerCard(result.targets[0], true, "hej").set("visible", true);
+ } else {
+ event.card = result.links[0];
+ }
+ "step 3";
+ if (event.index == 2) event.card = result.cards[0];
+ var controls = ["将这张牌移动到牌堆的顶部或者底部", "将这张牌移动到弃牌堆的顶部或者底部", "将这张牌移动到一名角色对应的区域里"];
+ event.controls = controls;
+ var next = player.chooseControl();
+ next.set("prompt", "要对" + get.translation(event.card) + "做什么呢?");
+ next.set("choiceList", controls);
+ next.ai = function () {
+ return 2;
+ };
+ "step 4";
+ result.control = event.controls[result.index];
+ var list = ["弃牌堆", "牌堆", "角色"];
+ for (var i = 0; i < list.length; i++) {
+ if (result.control.indexOf(list[i]) != -1) {
+ event.index2 = i;
+ break;
+ }
+ }
+ if (event.index2 == 2) {
+ player.chooseTarget("要将" + get.translation(card) + "移动到哪一名角色的对应区域呢", true).ai = function (target) {
+ return target == _status.event.player ? 1 : 0;
+ };
+ } else {
+ player.chooseControl("顶部", "底部").set("prompt", "把" + get.translation(card) + "移动到" + (event.index2 == 0 ? "弃" : "") + "牌堆的...");
+ }
+ "step 5";
+ if (event.index2 != 2) {
+ //if(event.target1) event.target1.lose(card,ui.special);
+ //else card.goto(ui.special);
+ event.way = result.control;
+ } else {
+ event.target2 = result.targets[0];
+ var list = ["手牌区"];
+ if (lib.card[card.name].type == "equip" && event.target2.canEquip(card)) list.push("装备区");
+ if (lib.card[card.name].type == "delay" && !event.target2.isDisabledJudge() && !event.target2.hasJudge(card.name)) list.push("判定区");
+ if (list.length == 1) event._result = { control: list[0] };
+ else {
+ player.chooseControl(list).set("prompt", "把" + get.translation(card) + "移动到" + get.translation(event.target2) + "的...").ai = function () {
+ return 0;
+ };
+ }
+ }
+ "step 6";
+ if (event.index2 != 2) {
+ var node = ui[event.index == 0 ? "discardPile" : "cardPile"];
+ if (event.target1) {
+ var next = event.target1.lose(card, event.position);
+ if (event.way == "顶部") next.insert_card = true;
+ } else {
+ if (event.way == "底部") node.appendChild(card);
+ else node.insertBefore(card, node.firstChild);
+ }
+ game.updateRoundNumber();
+ event.finish();
+ } else {
+ if (result.control == "手牌区") {
+ var next = event.target2.gain(card);
+ if (event.target1) {
+ next.source = event.target1;
+ next.animate = "giveAuto";
+ } else next.animate = "draw";
+ } else if (result.control == "装备区") {
+ if (event.target1) event.target1.$give(card, event.target2);
+ event.target2.equip(card);
+ } else {
+ if (event.target1) event.target1.$give(card, event.target2);
+ event.target2.addJudge(card);
+ }
+ }
+ "step 7";
+ game.updateRoundNumber();
+ },
+ ai: {
+ order: 10,
+ result: { player: 1 },
+ },
+ },
//伊吹风子
fuuko_xingdiao: {
trigger: {
diff --git a/character/key/sort.js b/character/key/sort.js
index e784705ca..3a526530f 100644
--- a/character/key/sort.js
+++ b/character/key/sort.js
@@ -1,18 +1,18 @@
const characterSort = {
key_one: ["key_rumi"],
key_kanon: ["key_shiori", "key_kaori", "key_akiko"],
- key_air: ["key_haruko", "key_yukito", "key_crow", "key_kano"],
- key_clannad: ["key_yukine", "key_sunohara", "key_tomoya", "key_nagisa", "key_kotomi", "key_fuuko"],
- key_littlebusters: ["key_kyousuke", "key_komari", "key_masato", "key_kengo", "key_saya", "key_harukakanata", "key_rin", "key_sasami", "key_doruji", "key_yuiko", "key_riki", "key_mio", "key_midori"],
- key_rewrite: ["key_lucia", "key_akane", "key_shizuru", "key_kotori", "key_sakuya", "key_chihaya", "key_asara"],
+ key_air: ["key_haruko", "key_yukito", "key_crow", "key_kano", "key_misuzu", "key_minagi", "key_michiru"],
+ key_clannad: ["key_yukine", "key_sunohara", "key_tomoya", "key_nagisa", "key_kotomi", "key_fuuko", "key_kyou", "key_tomoyo"],
+ key_littlebusters: ["key_kyousuke", "key_komari", "key_masato", "key_kengo", "key_saya", "key_harukakanata", "key_rin", "key_sasami", "key_doruji", "key_yuiko", "key_riki", "key_mio", "key_midori", "key_kud", "key_yuuki"],
+ key_rewrite: ["key_lucia", "key_akane", "key_shizuru", "key_kotori", "key_sakuya", "key_chihaya", "key_asara", "key_kagari", "key_kotarou"],
key_angelbeats: ["sp_key_yuri", "key_yuri", "key_iwasawa", "key_yoshino", "key_yui", "key_shiina", "key_hisako", "key_hinata", "key_noda", "key_ayato", "key_yuzuru", "sp_key_kanade", "key_shiorimiyuki", "key_abyusa", "key_godan"],
- key_charlotte: ["key_yusa", "key_misa", "key_yuu", "key_jojiro"],
+ key_charlotte: ["key_yusa", "key_misa", "key_yuu", "key_jojiro", "key_nao"],
key_harmonia: ["key_rei"],
- key_kamisamaninattahi: ["key_hiroto", "key_youta"],
- key_summerpockets: ["key_umi", "key_umi2", "key_tsumugi", "key_inari", "key_ao", "key_kyoko", "key_miki", "key_ryoichi", "key_shiroha", "key_shizuku"],
+ key_summerpockets: ["key_umi", "key_umi2", "key_tsumugi", "key_inari", "key_ao", "key_kyoko", "key_miki", "key_ryoichi", "key_shiroha", "key_shizuku", "key_shiki", "key_kamome", "key_tenzen"],
+ key_kamisamaninattahi: ["key_hiroto", "key_youta", "db_key_hina", "key_kyouko"],
key_loopers: ["key_mia"],
- key_lunaria: ["key_iriya"],
- key_heavenburnsred: ["db_key_liyingxia", "key_erika", "key_satomi"],
+ key_lunaria: ["key_iriya", "key_kiyu"],
+ key_heavenburnsred: ["db_key_liyingxia", "key_erika", "key_satomi", "key_seira"],
};
const characterSortTranslate = {
diff --git a/character/key/translate.js b/character/key/translate.js
index aff3e6bb0..4b37805c7 100644
--- a/character/key/translate.js
+++ b/character/key/translate.js
@@ -456,6 +456,119 @@ const translates = {
fuuko_xingdiao_info: "锁定技。游戏开始时,你将手牌摸至8张,然后将所有手牌明置(称为“星”,不计入手牌上限)。每名其他角色限一次,其可以于出牌阶段选择获得你的一张“星”,然后你摸一张牌。",
fuuko_chuanyuan: "传愿",
fuuko_chuanyuan_info: "锁定技。当你失去一张“星”后,你回复1点体力,然后从牌堆中获得一张和“星”花色点数相同的牌(没有则改为摸一张牌,且使用此牌无距离和次数限制)。",
+
+ key_kagari: "篝",
+ kagari_zongsi: "纵丝",
+ kagari_zongsi_info: "出牌阶段限一次,你可以选择一张不在游戏外的牌,然后将其置于牌堆/弃牌堆的顶部/底部或一名角色的对应区域内。",
+ key_shiki: "神山识",
+ key_shiki_ab: "神山识",
+ shiki_omusubi: "御结",
+ shiki_omusubi_info: "一轮游戏开始时,你可以减1点体力上限,然后将一名其他角色武将牌上的技能加入到你的武将牌上。",
+ shiki_omusubi_append: '来吧,羽依里。用你的手,让我变成那只真正的鬼吧!',
+ db_key_hina: "佐藤雏",
+ hina_shenshi: "神视",
+ hina_shenshi_yingbian: "神视",
+ hina_shenshi_info: "神势力技。出牌阶段开始时/结束时,你可摸两张牌,然后将其中一张牌置于牌堆顶。你以此法得到的牌视为拥有全部应变效果,且可以无条件发动。",
+ hina_xingzhi: "幸凪",
+ hina_xingzhi_info: "键势力技。每回合限一次,你可以通过“助战”触发一张牌的全部应变效果,且响应助战的角色摸两张牌。",
+
+
+ key_kud: "库特莉亚芙卡",
+ kud_qiaoshou: "巧手",
+ kud_qiaoshou_equip: "巧手",
+ kud_qiaoshou_end: "巧手",
+ kud_qiaoshou_backup: "巧手",
+ kud_qiaoshou_info: "出牌阶段/结束阶段,若你没有“巧”,则你可以将一张手牌作为“巧”置于武将牌上并摸一张牌,且视为装备了一张你选择的武器牌或进攻坐骑/防具牌或防御坐骑直到“巧”进入弃牌堆。出牌阶段结束时/准备阶段开始时,你将“巧”置入弃牌堆。",
+ kud_buhui: "不悔",
+ kud_buhui_info: "限定技,当你进入濒死状态时,你可以弃置“巧”和装备区内的所有牌(至少一张)并摸等量的牌,将体力回复至2点,获得技能〖重振〗。",
+ key_misuzu: "神尾观铃",
+ misuzu_hengzhou: "恒咒",
+ misuzu_hengzhou_info: "锁定技,准备阶段开始时,或当你受到1点伤害或回复1点体力后,你获得一个“诅咒”标记。你的手牌上限和摸牌阶段的额定摸牌数+X。结束阶段开始时,若X大于3,则你移去所有“诅咒”标记并失去1点体力。(X为“诅咒”标记数)",
+ misuzu_nongyin: "浓饮",
+ misuzu_nongyin_info: "当你需要使用【桃】时,你可将一张红色非锦囊牌当做【乐不思蜀】置入自己的判定区,然后视为使用一张【桃】。",
+ misuzu_zhongxing: "终幸",
+ misuzu_zhongxing_info: "每回合限一次,当你判定区的牌移动到其他区域后,你可令一名角色回复1点体力或摸两张牌。",
+ key_kamome: "久岛鸥",
+ kamome_yangfan: "扬帆",
+ kamome_yangfan_info: "锁定技,游戏开始时,你将一张【旅行箱】置入你的装备区。当你失去装备区内的一张牌后,你摸两张牌。",
+ kamome_huanmeng: "幻梦",
+ kamome_huanmeng_info: "准备阶段开始时,你可以观看牌堆顶的X+1张牌并可以按任意顺序置于牌堆顶或牌堆底。(X为你装备区内的牌数)",
+ kamome_jieban: "结伴",
+ kamome_jieban_info: "转换技。每回合限一次,当你受到或造成伤害后,阴:你可将两张牌交给一名其他角色,然后其交给你一张牌。阳:你可将一张牌交给一名其他角色,然后其交给你两张牌。",
+ kamome_suitcase: "旅行箱",
+ kamome_suitcase_info: "锁定技,你跳过你的判定阶段和弃牌阶段;当你即将翻面时,取消之。",
+ key_nao: "友利奈绪",
+ nao_duyin: "独隐",
+ nao_duyin2: "独隐",
+ nao_duyin_info: "一名其他角色的回合开始时,若你本局游戏内未对其发动过〖独隐〗,则你可以弃置一张牌或将武将牌翻面。若如此做,你不能成为其使用牌的目标,且对其使用牌没有距离限制且不计入使用次数直到你的下回合结束。",
+ nao_wanxin: "挽心",
+ nao_wanxin_info: "一名角色的回合结束时,你可以令一名本回合内受到过伤害的角色摸两张牌,然后你与其将武将牌重置。",
+ nao_shouqing: "守情",
+ nao_shouqing2: "守情",
+ nao_shouqing3: "守情",
+ nao_shouqing_info: "其他角色的出牌阶段内可以对你使用【桃】。若如此做,其摸一张牌且本局游戏内的手牌上限+1。",
+ key_yuuki: "冰室忧希",
+ yuuki_yicha: "异插",
+ yuuki_yicha_info: "出牌阶段开始时,你可依次进行两次判定并将判定牌依次置入两行三列方阵的两个随机位置中。然后你依次进行四次判定,每次可将当前判定牌置入空方格,且须与相邻方格的牌颜色均不同。若如此做,你令一名角色获得方阵内的所有牌。",
+ key_kyouko: "伊座并杏子",
+ kyouko_rongzhu: "容助",
+ kyouko_rongzhu_info: "其他角色不因此技能而得到你的牌后,你可摸一张牌,然后交给其一张牌。若其是当前回合角色,则其本回合使用【杀】的次数上限+1;若你是当前回合角色,则你本回合的手牌上限+1。",
+ kyouko_gongmian: "共勉",
+ kyouko_gongmian_use: "共勉",
+ kyouko_gongmian_exchange: "共勉",
+ kyouko_gongmian_info: "①出牌阶段,你可以选择一名未以此法选择过的角色,若其手牌:大于你,你获得其一张牌,然后交给其一张牌;小于你,其交给你一张牌,然后你交给其一张牌;等于你,你与其各摸一张牌。②出牌阶段结束时,你可以获得一名其他角色区域内的至多X张牌,然后交给其等量的牌。③弃牌阶段开始时,若X不小于你的体力值,你可以获得一名手牌数少于你的角色的所有手牌,然后将手牌数的一半(向上取整)交给该角色。(X为你本回合内发动过〖共勉①〗的次数)",
+ key_tenzen: "加纳天善",
+ tenzen_yixing: "弈兴",
+ tenzen_yixing_info: "当有角色因【杀】或【决斗】而受到伤害后,若其在你的攻击范围内或你在伤害来源的攻击范围内,你可以摸一张牌,然后将一张牌置于武将牌上,称为“兴”。当你成为其他角色使用【杀】或普通锦囊牌的唯一目标后,你可以获得一张“兴”,并可于此牌结算完成后弃置两张牌,视为对其使用一张名称相同的牌。",
+ //若对方为水织静久则无法触发〖弈兴〗
+ tenzen_lingyu: "领域",
+ tenzen_lingyu_info: "觉醒技,准备阶段,若你的“兴”不小于你的体力值,则你减1点体力上限并获得技能〖天全〗。若你以此法失去了体力,则你摸两张牌。",
+ tenzen_tianquan: "天全",
+ tenzen_tianquan_info: "每回合限一次,当你使用【杀】或【决斗】指定唯一目标后,你可以移去两张“兴”并亮出牌堆顶的五张牌。这些牌中每有一张基本牌,响应此牌需要的【闪】/【杀】的数量便+1。此牌结算完成后,若此牌造成过伤害,则你获得这些牌中的非基本牌。",
+ key_kotarou: "天王寺瑚太朗",
+ kotarou_aurora: "丝刃",
+ kotarou_aurora_info: "锁定技,当扣减体力或增加体力上限后,若你的装备区内:有武器牌,你视为使用一张【杀】;没有武器牌,你使用牌堆中的一张不为赠物的武器牌。",
+ kotarou_rewrite: "改写",
+ kotarou_rewrite_damage: "改写",
+ kotarou_rewrite_recover: "改写",
+ kotarou_rewrite_sha: "改写",
+ kotarou_rewrite_block: "改写",
+ kotarou_rewrite_info: "出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加1点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。",
+ key_kyou: "藤林杏",
+ kyou_zhidian: "掷典",
+ kyou_zhidian_info: "你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。",
+ kyou_duanfa: "断发",
+ kyou_duanfa_info: "限定技,当你受到伤害时,若伤害值不小于你的体力值,则你可弃置所有手牌,防止此伤害并回复1点体力;且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后,你摸一张牌。",
+ key_seira: "樱庭星罗",
+ seira_xinghui: "星辉",
+ seira_xinghui_info: "准备阶段,你可以投掷一枚骰子,观看牌堆顶的X张牌(X为投掷点数)并以任意顺序扣置于一名没有“星屑”的角色的武将牌上,称为“星屑”。有“星屑”的角色造成的伤害+1,且当其从牌堆顶摸牌或取得判定牌时,改为从“星屑”中获取。",
+ seira_yuanying: "缘映",
+ seira_yuanying_info: "出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。",
+ seira_yinyuan: "姻缘",
+ seira_yinyuan_info: "你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。",
+ key_kiyu: "露娜Q",
+ kiyu_yuling: "玉灵",
+ kiyu_yuling_info: "锁定技。你不是有距离限制的锦囊牌的合法目标;你成为【杀】的目标后,使用者需弃置X张牌(X为其至你的距离)。",
+ kiyu_xianyu: "先预",
+ kiyu_xianyu_info: "每轮限一次。一名角色的出牌阶段开始时,你可观看其手牌并预测其使用这些牌的顺序。此出牌阶段结束时,你摸X张牌,且其本回合的手牌上限+X(X为你的预测与其实际使用顺序的吻合数且至多为3)。",
+ kiyu_rexianyu: "先预",
+ kiyu_rexianyu_info: "每轮限一次。出牌阶段结束时,你可以选择一名其他角色。该角色于下个出牌阶段内使用第X张牌时,其可以将一张牌当做你本阶段内使用的第X张基本牌或普通锦囊牌使用(X至多为3);若如此做,你摸一张牌,且其本回合的手牌上限+1。",
+ key_tomoyo: "坂上智代",
+ tomoyo_wuwei: "武威",
+ tomoyo_wuwei_info: "①每回合每种花色限一次。你可以将一张手牌当做【杀】使用或打出。②当有角色使用【闪】后,若你在其攻击范围内,你可以对其使用一张【杀】(无距离限制)。",
+ tomoyo_zhengfeng: "整风",
+ tomoyo_zhengfeng_info: "使命技。①准备阶段,你可以令攻击范围内的一名角色进行判定。若如此做,你获得如下效果直到下回合开始:你视为在该角色的攻击范围内,且当该角色使用与判定牌颜色相同的牌时,你摸一张牌。②失败:结束阶段,若你于本回合内未发动过〖整风①〗,则你可以减1点体力上限。你失去〖武威〗,摸两张牌并回复1点体力,然后获得〖长誓〗。",
+ tomoyo_changshi: "长誓",
+ tomoyo_changshi_info: "锁定技。一名攻击范围内包含你的角色回复体力后,你获得1点护甲;一名攻击范围内包含你的角色一次性获得至少两张牌后,你摸一张牌。",
+ key_minagi: "远野美凪",
+ minagi_peiquan: "配券",
+ minagi_peiquan_info: "锁定技。①游戏开始时,你将你所有的手牌记录为“米券”。②出牌阶段,你可以赠予一张“米券”,然后执行一项本回合内未被选择过的效果:⒈对其造成1点伤害;⒉摸两张牌;⒊弃置其的两张牌;⒋亮出牌堆顶的一张牌,然后你可以使用之。",
+ minagi_huanliu: "幻流",
+ minagi_huanliu_info: "准备阶段开始时,你可与一名其他角色进行协力,并获得“远野小满”的所有技能直到目标角色的结束阶段开始。若“协力”成功,则你可以将所有手牌记录为“米券”。",
+ key_michiru: "远野小满",
+ michiru_sheyuan: "舍愿",
+ michiru_sheyuan_info: "每轮限一次。若你没有“米券”,则你可以将所有手牌当做任意基本牌或普通锦囊牌使用,然后摸等量的牌。",
+ minagi_tag: "米券",
};
export default translates;
diff --git a/character/mobile/characterFilter.js b/character/mobile/characterFilter.js
index d3db292b7..919e57da4 100644
--- a/character/mobile/characterFilter.js
+++ b/character/mobile/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
simashi(mode) {
if (["boss", "chess", "tafang", "stone"].includes(mode)) return false;
diff --git a/character/offline/characterFilter.js b/character/offline/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/offline/characterFilter.js
+++ b/character/offline/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/old/characterFilter.js b/character/old/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/old/characterFilter.js
+++ b/character/old/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/onlyOL/characterFilter.js b/character/onlyOL/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/onlyOL/characterFilter.js
+++ b/character/onlyOL/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/rank.js b/character/rank.js
index 3a6a16ba6..80a7fce4a 100644
--- a/character/rank.js
+++ b/character/rank.js
@@ -1422,6 +1422,7 @@ window.noname_character_rank = {
"xia_shie",
"clan_wangmingshan",
"yj_simafu",
+ "dc_wuyi",
],
bm: [
"kongrong",
@@ -1728,6 +1729,7 @@ window.noname_character_rank = {
],
rarity: {
legend: [
+ "dc_wuyi",
"sp_sunce",
"star_caoren",
"dc_zhaoyun",
diff --git a/character/refresh.js b/character/refresh.js
deleted file mode 100755
index c057302ed..000000000
--- a/character/refresh.js
+++ /dev/null
@@ -1,18876 +0,0 @@
-import { lib, game, ui, get, ai, _status } from "../noname.js";
-game.import("character", function () {
- return {
- name: "refresh",
- characterSort: {
- refresh: {
- refresh_standard: [
- "re_caocao",
- "re_simayi",
- "re_guojia",
- "re_zhangliao",
- "re_xuzhu",
- "re_xiahoudun",
- "re_zhangfei",
- "re_zhaoyun",
- "re_guanyu",
- "re_machao",
- "re_zhouyu",
- "re_lvmeng",
- "re_ganning",
- "re_luxun",
- "re_daqiao",
- "re_huanggai",
- "re_lvbu",
- "re_huatuo",
- "re_liubei",
- "re_diaochan",
- "re_huangyueying",
- "re_sunquan",
- "re_sunshangxiang",
- "re_zhenji",
- "re_zhugeliang",
- "re_huaxiong",
- "re_gongsunzan",
- "re_lidian",
- "re_xushu",
- ],
- refresh_feng: [
- "caoren",
- "ol_xiahouyuan",
- "ol_weiyan",
- "ol_xiaoqiao",
- "zhoutai",
- "re_zhangjiao",
- "xin_yuji",
- "ol_huangzhong",
- ],
- refresh_huo: [
- "ol_sp_zhugeliang",
- "ol_xunyu",
- "ol_dianwei",
- "ol_yanwen",
- "ol_pangtong",
- "ol_yuanshao",
- "ol_pangde",
- "re_taishici",
- ],
- refresh_lin: [
- "re_menghuo",
- "ol_sunjian",
- "re_caopi",
- "ol_xuhuang",
- "ol_dongzhuo",
- "ol_zhurong",
- "re_jiaxu",
- "ol_lusu",
- ],
- refresh_shan: [
- "ol_jiangwei",
- "ol_caiwenji",
- "ol_liushan",
- "ol_zhangzhang",
- "re_zuoci",
- "re_sunce",
- "ol_dengai",
- "re_zhanghe",
- ],
- refresh_yijiang1: [
- "xin_wuguotai",
- "xin_gaoshun",
- "dc_caozhi",
- "yujin_yujin",
- "re_masu",
- "xin_xusheng",
- "re_fazheng",
- "xin_lingtong",
- "re_zhangchunhua",
- "dc_xushu",
- "re_chengong",
- ],
- refresh_yijiang2: [
- "re_madai",
- "re_wangyi",
- "xin_handang",
- "xin_zhonghui",
- "re_liaohua",
- "re_chengpu",
- "re_caozhang",
- "dc_bulianshi",
- "xin_liubiao",
- "re_xunyou",
- "re_guanzhang",
- ],
- refresh_yijiang3: [
- "re_jianyong",
- "re_guohuai",
- "re_zhuran",
- "re_panzhangmazhong",
- "xin_yufan",
- "dc_liru",
- "re_manchong",
- "re_fuhuanghou",
- "re_guanping",
- "re_liufeng",
- "re_caochong",
- ],
- refresh_yijiang4: [
- "re_sunluban",
- "re_wuyi",
- "re_hanhaoshihuan",
- "re_caozhen",
- "re_zhoucang",
- "dc_chenqun",
- "re_caifuren",
- "re_guyong",
- "re_jushou",
- "re_zhuhuan",
- "re_zhangsong",
- ],
- refresh_yijiang5: [
- "re_zhangyi",
- "re_quancong",
- "re_caoxiu",
- "re_sunxiu",
- "re_gongsunyuan",
- "re_guotufengji",
- "re_xiahoushi",
- "re_liuchen",
- "re_zhuzhi",
- "re_caorui",
- "re_zhongyao",
- ],
- refresh_yijiang6: ["re_guohuanghou", "re_sundeng"],
- refresh_xinghuo: [
- "xin_zhangliang",
- "re_zhugedan",
- "re_simalang",
- "re_duji",
- "dc_gongsunzan",
- "re_sp_taishici",
- "re_caiyong",
- "re_mazhong",
- "re_wenpin",
- "re_jsp_huangyueying",
- ],
- },
- },
- connect: true,
- character: {
- re_xushu: ["male", "shu", 4, ["zhuhai", "qianxin"]],
- re_lidian: ["male", "wei", 3, ["xunxun", "xinwangxi"]],
- re_zhongyao: ["male", "wei", 3, ["rehuomo", "zuoding"], ["clan:颍川钟氏"]],
- xin_zhangliang: ["male", "qun", 4, ["rejijun", "refangtong"]],
- re_simalang: ["male", "wei", 3, ["requji", "rejunbing"]],
- re_zhugedan: ["male", "wei", 4, ["regongao", "rejuyi"]],
- re_caorui: ["male", "wei", 3, ["huituo", "remingjian", "rexingshuai"], ["zhu"]],
- re_caochong: ["male", "wei", 3, ["rechengxiang", "renxin"]],
- ol_zhangzhang: ["male", "wu", 3, ["olzhijian", "olguzheng"]],
- re_jsp_huangyueying: ["female", "qun", 3, ["rejiqiao", "relinglong"]],
- re_zhangsong: ["male", "shu", 3, ["qiangzhi", "rexiantu"]],
- re_zhuzhi: ["male", "wu", 4, ["reanguo"]],
- dc_caozhi: ["male", "wei", 3, ["reluoying", "dcjiushi"]],
- ol_huangzhong: ["male", "shu", 4, ["xinliegong", "remoshi"]],
- re_wenpin: ["male", "wei", 5, ["rezhenwei"]],
- re_guanzhang: ["male", "shu", 4, ["fuhun", "retongxin"]],
- re_mazhong: ["male", "shu", 4, ["refuman"]],
- dc_chenqun: ["male", "wei", 3, ["repindi", "dcfaen"]],
- re_sundeng: ["male", "wu", 4, ["rekuangbi"]],
- re_caiyong: ["male", "qun", 3, ["rebizhuan", "retongbo"]],
- re_chengong: ["male", "qun", 3, ["remingce", "zhichi"]],
- re_xunyou: ["male", "wei", 3, ["reqice", "rezhiyu"], ["clan:颍川荀氏"]],
- dc_liru: ["male", "qun", 3, ["xinjuece", "dcmieji", "dcfencheng"]],
- re_zhuhuan: ["male", "wu", 4, ["refenli", "repingkou"]],
- ol_dianwei: ["male", "wei", 4, ["olqiangxi", "olningwu"]],
- re_sp_taishici: ["male", "qun", 4, ["rejixu"]],
- re_liufeng: ["male", "shu", 4, ["rexiansi"]],
- ol_xunyu: ["male", "wei", 3, ["quhu", "oljieming"], ["clan:颍川荀氏"]],
- re_liuchen: ["male", "shu", 4, ["rezhanjue", "reqinwang"], ["zhu"]],
- dc_gongsunzan: ["male", "qun", 4, ["dcyicong", "dcqiaomeng"]],
- re_duji: ["male", "wei", 3, ["reandong", "reyingshi"]],
- re_jushou: ["male", "qun", 3, ["dcjianying", "dcshibei"]],
- re_zhanghe: ["male", "wei", 4, ["reqiaobian"]],
- dc_xushu: ["male", "shu", 4, ["rezhuhai", "xsqianxin"]],
- xin_gaoshun: ["male", "qun", 4, ["decadexianzhen", "decadejinjiu"]],
- re_guohuanghou: ["female", "wei", 3, ["rejiaozhao", "redanxin"]],
- re_xiahoushi: ["female", "shu", 3, ["reqiaoshi", "reyanyu"]],
- ol_lusu: ["male", "wu", 3, ["olhaoshi", "oldimeng"]],
- re_jiaxu: ["male", "qun", 3, ["rewansha", "reluanwu", "reweimu"]],
- re_guyong: ["male", "wu", 3, ["reshenxing", "rebingyi"]],
- xin_zhonghui: ["male", "wei", 4, ["xinquanji", "xinzili"], ["clan:颍川钟氏"]],
- re_caifuren: ["female", "qun", 3, ["reqieting", "rexianzhou"]],
- re_guanping: ["male", "shu", 4, ["relongyin", "jiezhong"]],
- re_guotufengji: ["male", "qun", 3, ["rejigong", "shifei"]],
- re_zhoucang: ["male", "shu", 4, ["rezhongyong"]],
- ol_zhurong: ["female", "shu", 4, ["juxiang", "lieren", "changbiao"]],
- re_zhangchunhua: ["female", "wei", 3, ["rejueqing", "reshangshi"]],
- re_gongsunyuan: ["male", "qun", 4, ["rehuaiyi"]],
- re_caozhen: ["male", "wei", 4, ["residi"]],
- re_fuhuanghou: ["female", "qun", 3, ["rezhuikong", "reqiuyuan"]],
- re_fazheng: ["male", "shu", 3, ["reenyuan", "rexuanhuo"]],
- xin_lingtong: ["male", "wu", 4, ["decadexuanfeng", "yongjin"]],
- xin_liubiao: ["male", "qun", 3, ["decadezishou", "decadezongshi"]],
- re_caoxiu: ["male", "wei", 4, ["qianju", "reqingxi"]],
- re_sunxiu: ["male", "wu", 3, ["reyanzhu", "rexingxue", "zhaofu"], ["zhu"]],
- ol_dengai: ["male", "wei", 4, ["oltuntian", "olzaoxian"]],
- re_gongsunzan: ["male", "qun", 4, ["reqiaomeng", "reyicong"]],
- re_manchong: ["male", "wei", 3, ["rejunxing", "yuce"]],
- xin_yufan: ["male", "wu", 3, ["xinzhiyan", "xinzongxuan"]],
- dc_bulianshi: ["female", "wu", 3, ["dcanxu", "dczhuiyi"]],
- re_hanhaoshihuan: ["male", "wei", 4, ["reshenduan", "reyonglve"]],
- re_panzhangmazhong: ["male", "wu", 4, ["reduodao", "reanjian"]],
- re_wangyi: ["female", "wei", 4, ["zhenlie", "miji"]],
- re_madai: ["male", "shu", 4, ["mashu", "reqianxi"]],
- xin_xusheng: ["male", "wu", 4, ["decadepojun"]],
- re_taishici: ["male", "wu", 4, ["tianyi", "hanzhan"]],
- re_masu: ["male", "shu", 3, ["resanyao", "rezhiman"]],
- re_sunluban: ["female", "wu", 3, ["rechanhui", "rejiaojin"]],
- xin_handang: ["male", "wu", 4, ["xingongji", "xinjiefan"]],
- yujin_yujin: ["male", "wei", 4, ["decadezhenjun"]],
- re_caozhang: ["male", "wei", 4, ["xinjiangchi"]],
- re_chengpu: ["male", "wu", 4, ["ollihuo", "rechunlao"]],
- re_quancong: ["male", "wu", 4, ["xinyaoming"]],
- re_liaohua: ["male", "shu", 4, ["xindangxian", "xinfuli"]],
- re_guohuai: ["male", "wei", 4, ["decadejingce"]],
- re_wuyi: ["male", "shu", 4, ["xinbenxi"], ["clan:陈留吴氏"]],
- re_zhuran: ["male", "wu", 4, ["xindanshou"]],
- ol_pangtong: ["male", "shu", 3, ["ollianhuan", "olniepan"], []],
- re_zhangyi: ["male", "shu", 5, ["rewurong", "reshizhi"]],
- xin_wuguotai: ["female", "wu", 3, ["xinganlu", "xinbuyi"]],
- re_caocao: ["male", "wei", 4, ["new_rejianxiong", "rehujia"], ["zhu"]],
- re_simayi: ["male", "wei", 3, ["refankui", "reguicai"]],
- re_guojia: ["male", "wei", 3, ["tiandu", "new_reyiji"]],
- re_zhangliao: ["male", "wei", 4, ["new_retuxi"]],
- re_xuzhu: ["male", "wei", 4, ["new_reluoyi"]],
- re_xiahoudun: ["male", "wei", 4, ["reganglie", "new_qingjian"]],
- re_zhangfei: ["male", "shu", 4, ["olpaoxiao", "oltishen"]],
- re_zhaoyun: ["male", "shu", 4, ["ollongdan", "olyajiao"]],
- re_guanyu: ["male", "shu", 4, ["new_rewusheng", "new_yijue"]],
- re_machao: ["male", "shu", 4, ["mashu", "retieji"]],
- re_zhouyu: ["male", "wu", 3, ["reyingzi", "refanjian"]],
- re_lvmeng: ["male", "wu", 4, ["keji", "qinxue", "rebotu"]],
- re_ganning: ["male", "wu", 4, ["qixi", "fenwei"]],
- re_luxun: ["male", "wu", 3, ["reqianxun", "relianying"]],
- re_daqiao: ["female", "wu", 3, ["reguose", "liuli"]],
- re_huanggai: ["male", "wu", 4, ["rekurou", "zhaxiang"]],
- re_lvbu: ["male", "qun", 5, ["wushuang", "new_liyu"]],
- re_huatuo: ["male", "qun", 3, ["jijiu", "new_reqingnang"]],
- re_liubei: ["male", "shu", 4, ["rerende", "rejijiang"], ["zhu"]],
- re_diaochan: ["female", "qun", 3, ["lijian", "rebiyue"]],
- re_huangyueying: ["female", "shu", 3, ["rejizhi", "reqicai"]],
- re_sunquan: ["male", "wu", 4, ["rezhiheng", "rejiuyuan"], ["zhu"]],
- re_sunshangxiang: ["female", "wu", 3, ["xiaoji", "rejieyin"]],
- re_zhenji: ["female", "wei", 3, ["reluoshen", "reqingguo"]],
- re_zhugeliang: ["male", "shu", 3, ["reguanxing", "kongcheng"]],
- re_huaxiong: ["male", "qun", 6, ["reyaowu", "shizhan"]],
-
- re_zhangjiao: ["male", "qun", 3, ["xinleiji", "xinguidao", "xinhuangtian"], ["zhu"]],
- xin_yuji: ["male", "qun", 3, ["reguhuo"]],
- re_zuoci: ["male", "qun", 3, ["rehuashen", "rexinsheng"]],
-
- ol_xiahouyuan: ["male", "wei", 4, ["xinshensu", "shebian"]],
- caoren: ["male", "wei", 4, ["xinjushou", "xinjiewei"]],
- ol_weiyan: ["male", "shu", 4, ["xinkuanggu", "reqimou"]],
- ol_xiaoqiao: ["female", "wu", 3, ["oltianxiang", "olhongyan", "piaoling"]],
- zhoutai: ["male", "wu", 4, ["buqu", "fenji"]],
- ol_pangde: ["male", "qun", 4, ["mashu", "rejianchu"]],
- ol_xuhuang: ["male", "wei", 4, ["olduanliang", "oljiezi"]],
- ol_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "olhuoji", "olkanpo", "cangzhuo"], []],
- ol_yanwen: ["male", "qun", 4, ["olshuangxiong"], []],
- ol_yuanshao: ["male", "qun", 4, ["olluanji", "olxueyi"], ["zhu"]],
- re_menghuo: ["male", "shu", 4, ["huoshou", "rezaiqi"]],
- ol_dongzhuo: ["male", "qun", 8, ["oljiuchi", "roulin", "benghuai", "olbaonue"], ["zhu"]],
- ol_sunjian: ["male", "wu", "4/5", ["gzyinghun", "wulie"]],
- re_caopi: ["male", "wei", 3, ["rexingshang", "refangzhu", "songwei"], ["zhu"]],
- ol_jiangwei: ["male", "shu", 4, ["oltiaoxin", "olzhiji"]],
- ol_caiwenji: ["female", "qun", 3, ["olbeige", "duanchang"]],
- ol_liushan: ["male", "shu", 3, ["xiangle", "olfangquan", "olruoyu"], ["zhu"]],
-
- re_sunce: ["male", "wu", 4, ["oljiang", "olhunzi", "olzhiba"], ["zhu"]],
- re_jianyong: ["male", "shu", 3, ["reqiaoshui", "jyzongshi"]],
- },
- characterIntro: {
- jsp_huangyueying:
- "荆州沔南白水人,沔阳名士黄承彦之女,诸葛亮之妻,诸葛瞻之母。容貌甚丑,而有奇才:上通天文,下察地理,韬略近于诸书无所不晓,诸葛亮在南阳闻其贤而迎娶。",
- re_gongsunzan:
- "群雄之一。出身贵族,因母地位卑贱,只当了郡中小吏。他貌美,声音洪亮,机智善辩。后随卢植于缑氏山中读书,粗通经传。",
- re_lidian:
- "字曼成,曹操麾下将领。李典深明大义,不与人争功,崇尚学习与高贵儒雅,尊重博学之士,在军中被称为长者。李典有长者之风,官至破虏将军,三十六岁去世。魏文帝曹丕继位后追谥号为愍侯。",
- sunben: " ",
- },
- characterFilter: {
- re_zuoci: function (mode) {
- return mode != "guozhan";
- },
- },
- perfectPair: {
- sunben: ["zhouyu", "taishici", "daqiao"],
- re_xushu: ["zhaoyun", "sp_zhugeliang"],
- re_guohuai: ["xiahouyuan", "zhanghe"],
- },
- skill: {
- ollianhuan: {
- audio: "xinlianhuan",
- audioname: ["ol_pangtong"],
- hiddenCard: (player, name) => {
- return name == "tiesuo" && player.hasCard((card) => get.suit(card) == "club", "she");
- },
- filter: function (event, player) {
- if (!player.hasCard((card) => get.suit(card) == "club", "she")) return false;
- return event.type == "phase" || event.filterCard({ name: "tiesuo" }, player, event);
- },
- position: "hes",
- inherit: "lianhuan",
- group: "ollianhuan_add",
- subSkill: {
- add: {
- audio: "xinlianhuan",
- audioname: ["ol_pangtong"],
- trigger: { player: "useCard2" },
- filter: function (event, player) {
- if (event.card.name != "tiesuo") return false;
- var info = get.info(event.card);
- if (info.allowMultiple == false) return false;
- if (event.targets && !info.multitarget) {
- if (
- game.hasPlayer((current) => {
- return (
- !event.targets.includes(current) &&
- lib.filter.targetEnabled2(event.card, player, current)
- );
- })
- )
- return true;
- }
- return false;
- },
- charlotte: true,
- forced: true,
- popup: false,
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("ollianhuan"),
- "为" + get.translation(trigger.card) + "额外指定一个目标",
- (card, player, target) => {
- return (
- !_status.event.sourcex.includes(target) &&
- lib.filter.targetEnabled2(_status.event.card, player, target)
- );
- }
- )
- .set("sourcex", trigger.targets)
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, _status.event.card, player, player);
- })
- .set("card", trigger.card);
- "step 1";
- if (result.bool) {
- if (!event.isMine() && !event.isOnline()) game.delayex();
- } else event.finish();
- "step 2";
- if (result.bool) {
- var targets = result.targets;
- player.logSkill("ollianhuan_add", targets);
- trigger.targets.addArray(targets);
- game.log(targets, "也成为了", trigger.card, "的目标");
- }
- },
- },
- },
- },
- rehuomo: {
- audio: "huomo",
- audioname: ["huzhao", "re_zhongyao"],
- enable: "chooseToUse",
- hiddenCard: function (player, name) {
- if (get.type(name) != "basic") return false;
- const list = player.getStorage("rehuomo");
- if (list.includes(name)) return false;
- return player.hasCard(function (card) {
- return get.color(card) == "black" && get.type(card) != "basic";
- }, "eh");
- },
- filter: function (event, player) {
- if (
- event.type == "wuxie" ||
- !player.hasCard(function (card) {
- return get.color(card) == "black" && get.type(card) != "basic";
- }, "eh")
- )
- return false;
- const list = player.getStorage("rehuomo");
- for (let name of lib.inpile) {
- if (get.type(name) != "basic" || list.includes(name)) continue;
- let card = { name: name, isCard: true };
- if (event.filterCard(card, player, event)) return true;
- if (name == "sha") {
- for (let nature of lib.inpile_nature) {
- card.nature = nature;
- if (event.filterCard(card, player, event)) return true;
- }
- }
- }
- return false;
- },
- chooseButton: {
- dialog: function (event, player) {
- const vcards = [];
- const list = player.getStorage("rehuomo");
- for (let name of lib.inpile) {
- if (get.type(name) != "basic" || list.includes(name)) continue;
- let card = { name: name, isCard: true };
- if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]);
- if (name == "sha") {
- for (let nature of lib.inpile_nature) {
- card.nature = nature;
- if (event.filterCard(card, player, event))
- vcards.push(["基本", "", name, nature]);
- }
- }
- }
- return ui.create.dialog("活墨", [vcards, "vcard"], "hidden");
- },
- check: function (button) {
- const player = _status.event.player;
- const card = { name: button.link[2], nature: button.link[3] };
- if (
- game.hasPlayer(function (current) {
- return (
- player.canUse(card, current) &&
- get.effect(current, card, player, player) > 0
- );
- })
- ) {
- switch (button.link[2]) {
- case "tao":
- return 5;
- case "jiu":
- return 3.01;
- case "sha":
- if (button.link[3] == "fire") return 2.95;
- else if (button.link[3] == "thunder") return 2.92;
- else return 2.9;
- case "shan":
- return 1;
- }
- }
- return 0;
- },
- backup: function (links, player) {
- return {
- check: function (card) {
- return 1 / Math.max(0.1, get.value(card));
- },
- filterCard: function (card) {
- return get.type(card) != "basic" && get.color(card) == "black";
- },
- viewAs: {
- name: links[0][2],
- nature: links[0][3],
- suit: "none",
- number: null,
- isCard: true,
- },
- position: "he",
- popname: true,
- ignoreMod: true,
- precontent: function () {
- player.logSkill("rehuomo");
- var card = event.result.cards[0];
- game.log(player, "将", card, "置于牌堆顶");
- player.loseToDiscardpile(card, ui.cardPile, "visible", "insert").log = false;
- var viewAs = {
- name: event.result.card.name,
- nature: event.result.card.nature,
- };
- event.result.card = viewAs;
- event.result.cards = [];
- if (!player.storage.rehuomo) {
- player.when({ global: "phaseAfter" }).then(() => {
- player.unmarkSkill("rehuomo");
- });
- }
- player.markAuto("rehuomo", viewAs.name);
- },
- };
- },
- prompt: function (links, player) {
- return (
- "将一张黑色非基本牌置于牌堆顶并视为使用一张" +
- get.translation(links[0][3] || "") +
- get.translation(links[0][2])
- );
- },
- },
- marktext: "墨",
- intro: {
- content: "本回合已因〖活墨〗使用过$",
- onunmark: true,
- },
- ai: {
- order: function () {
- var player = _status.event.player;
- var event = _status.event;
- var list = player.getStorage("rehuomo");
- if (
- !list.includes("jiu") &&
- event.filterCard({ name: "jiu" }, player, event) &&
- get.effect(player, { name: "jiu" }) > 0
- ) {
- return 3.1;
- }
- return 2.9;
- },
- respondSha: true,
- fireAttack: true,
- respondShan: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag == "fireAttack") return true;
- if (
- player.hasCard(function (card) {
- return get.color(card) == "black" && get.type(card) != "basic";
- }, "he")
- ) {
- var list = player.getStorage("rehuomo");
- if (tag == "respondSha") {
- if (arg != "use") return false;
- if (list.includes("sha")) return false;
- } else if (tag == "respondShan") {
- if (list.includes("shan")) return false;
- }
- } else {
- return false;
- }
- },
- result: {
- player: 1,
- },
- },
- },
- //界张梁
- rejijun: {
- audio: 2,
- trigger: { player: "useCardAfter" },
- filter: function (event, player) {
- return event.targets && event.targets.includes(player);
- },
- frequent: true,
- content: function () {
- player.judge((card) => 1).callback = lib.skill.rejijun.callback;
- },
- callback: function () {
- if (typeof card.number == "number")
- player.addToExpansion(card, "gain2").gaintag.add("rejijun");
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- marktext: "方",
- ai: { combo: "refangtong" },
- },
- refangtong: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- filter: function (event, player) {
- return player.countCards("h");
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseCard(
- get.prompt2("refangtong"),
- (card, player) => typeof card.number == "number"
- )
- .set("ai", (card) => {
- var player = _status.event.player;
- if (
- !game.hasPlayer(
- (target) =>
- target != player &&
- get.damageEffect(target, player, player, "thunder") > 0
- )
- )
- return 0;
- if (
- player.getExpansions("rejijun").reduce(function (num, card) {
- return num + get.number(card, false);
- }, 0) > 36
- )
- return 1 / (get.value(card) || 0.5);
- else {
- if (lib.skill.refangtong.thunderEffect(card, player))
- return 10 - get.value(card);
- return 5 - get.value(card);
- }
- });
- "step 1";
- if (result.bool) {
- player.logSkill("refangtong");
- player.addToExpansion(result.cards, player, "give").gaintag.add("rejijun");
- } else event.finish();
- "step 2";
- player
- .chooseButton(
- [
- "###是否移去任意张“方”,对一名其他角色造成1点雷属性伤害?###若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害",
- player.getExpansions("rejijun"),
- ],
- [1, player.getExpansions("rejijun").length]
- )
- .set("ai", (button) => {
- var player = _status.event.player;
- var cards = player.getExpansions("rejijun");
- if (
- cards.reduce(function (num, card) {
- return num + get.number(card, false);
- }, 0) <= 36
- ) {
- if (!ui.selected.buttons.length) return 1 / get.number(button.link, false);
- return 0;
- } else {
- var num = 0,
- list = [];
- cards.sort((a, b) => get.number(b, false) - get.number(a, false));
- for (var i = 0; i < cards.length; i++) {
- list.push(cards[i]);
- num += get.number(cards[i], false);
- if (num > 36) break;
- }
- return list.includes(button.link) ? 1 : 0;
- }
- });
- "step 3";
- if (result.bool) {
- var bool =
- result.links.reduce(function (num, card) {
- return num + get.number(card, false);
- }, 0) > 36;
- event.bool = bool;
- player.loseToDiscardpile(result.links);
- player
- .chooseTarget(
- "请选择一名其他角色",
- "对其造成" + (bool ? 3 : 1) + "点雷属性伤害",
- lib.filter.notMe
- )
- .set("ai", (target) =>
- get.damageEffect(
- target,
- _status.event.player,
- _status.event.player,
- "thunder"
- )
- );
- } else event.finish();
- "step 4";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target);
- target.damage(event.bool ? 3 : 1, "thunder");
- }
- },
- thunderEffect: function (card, player) {
- var cards = player.getExpansions("rejijun"),
- num = 0;
- cards.push(card);
- if (
- cards.reduce(function (num, card) {
- return num + get.number(card, false);
- }, 0) <= 36
- )
- return false;
- cards.sort((a, b) => get.number(b, false) - get.number(a, false));
- var bool = false;
- for (var i = 0; i < cards.length; i++) {
- if (cards[i] == card) bool = true;
- num += get.number(cards[i], false);
- if (num > 36) break;
- }
- return bool;
- },
- ai: { combo: "rejijun" },
- },
- //界司马朗
- requji: {
- inherit: "quji",
- content: function () {
- "step 0";
- target.recover();
- "step 1";
- if (target.isDamaged()) target.draw();
- "step 2";
- if (
- target == targets[targets.length - 1] &&
- cards.some((card) => get.color(card, player) == "black")
- )
- player.loseHp();
- },
- },
- rejunbing: {
- audio: 2,
- trigger: { global: "phaseJieshuBegin" },
- filter: function (event, player) {
- return event.player.countCards("h") < event.player.getHp();
- },
- direct: true,
- content: function () {
- "step 0";
- var target = trigger.player;
- event.player = player;
- event.target = target;
- target
- .chooseBool(
- target == player
- ? get.prompt("rejunbing")
- : "是否响应" + get.translation(player) + "的【郡兵】?",
- "摸一张牌" +
- (target == player
- ? ""
- : ",将所有手牌交给" +
- get.translation(player) +
- ",然后其可以交给你等量张牌")
- )
- .set("choice", get.attitude(target, player) > 0);
- "step 1";
- if (result.bool) {
- player.logSkill("rejunbing", target);
- if (target != player) game.log(target, "响应了", player, "的", "#g【郡兵】");
- target.draw();
- } else event.finish();
- "step 2";
- var cards = target.getCards("h");
- if (target == player || !cards.length) {
- event.finish();
- return;
- }
- target.give(cards, player);
- event.num = cards.length;
- "step 3";
- if (player.countCards("he") < num) event.finish();
- else
- player
- .chooseCard(
- "郡兵:是否还给" + get.translation(target) + get.translation(num) + "张牌?",
- "he",
- num
- )
- .set("ai", (card) => {
- var player = _status.event.player;
- var target = _status.event.target;
- if (get.attitude(player, target) <= 0) {
- if (card.name == "du") return 1145141919810;
- return -get.value(card);
- }
- return 6 - get.value(card);
- })
- .set("target", target);
- "step 4";
- if (result.bool) player.give(result.cards, target);
- },
- },
- //界诸葛诞
- regongao: {
- audio: 2,
- trigger: { global: "dying" },
- filter: function (event, player) {
- if (player == event.player) return false;
- return !player.getAllHistory(
- "useSkill",
- (evt) => evt.skill == "regongao" && evt.targets[0] == event.player
- ).length;
- },
- forced: true,
- logTarget: "player",
- content: function () {
- player.gainMaxHp();
- player.recover();
- },
- },
- rejuyi: {
- unique: true,
- audio: 2,
- derivation: ["benghuai", "reweizhong"],
- trigger: { player: "phaseZhunbeiBegin" },
- filter: function (event, player) {
- return player.maxHp > game.countPlayer() && player.isDamaged();
- },
- forced: true,
- juexingji: true,
- skillAnimation: true,
- animationColor: "thunder",
- content: function () {
- "step 0";
- player.awakenSkill("rejuyi");
- "step 1";
- player.drawTo(player.maxHp);
- "step 2";
- player.addSkills(["benghuai", "reweizhong"]);
- },
- },
- reweizhong: {
- audio: 2,
- inherit: "weizhong",
- content: function () {
- player.draw(2);
- },
- },
- //堪比界曹冲的界曹叡
- remingjian: {
- inherit: "mingjian",
- content: function () {
- player.give(cards, target);
- target.addTempSkill("remingjian_buff", { player: "phaseAfter" });
- if (!target.storage.remingjian_buff) target.storage.remingjian_buff = [];
- target.storage.remingjian_buff.push(player);
- target.markSkill("remingjian_buff");
- },
- subSkill: {
- buff: {
- charlotte: true,
- mark: true,
- marktext: "鉴",
- intro: {
- content: (storage, player) => {
- const num = storage.length;
- return `被${get.translation(
- storage.toUniqued()
- )}鉴识手牌上限+${num},出杀次数+${num}`;
- },
- },
- onremove: true,
- trigger: {
- source: "damageSource",
- },
- filter: function (event, player) {
- if (_status.currentPhase != player) return false;
- return (
- player.getHistory("sourceDamage").indexOf(event) == 0 &&
- player.getStorage("remingjian_buff").some((i) => i.isIn())
- );
- },
- content: function* (event, map) {
- const player = map.player;
- const masters = player
- .getStorage("remingjian_buff")
- .filter((i) => i.isIn())
- .toUniqued()
- .sortBySeat(_status.currentPhase);
- while (masters.length) {
- const master = masters.shift();
- if (!master.isIn()) continue;
- const result = yield player
- .chooseBool(`是否令${get.translation(master)}发动一次〖恢拓〗?`)
- .set("choice", get.attitude(player, master) > 0);
- if (!result.bool) continue;
- if (!player.isUnderControl(true) && !event.isOnline()) game.delayx();
- player.logSkill("remingjian_buff", master);
- const next = game.createEvent("huituo");
- next.setContent(lib.skill.huituo.content);
- next.player = master;
- next.forced = true;
- next._trigger = map.trigger;
- yield next;
- }
- },
- mod: {
- maxHandcard: function (player, num) {
- return num + player.getStorage("remingjian_buff").length;
- },
- cardUsable: function (card, player, num) {
- if (card.name == "sha")
- return num + player.getStorage("remingjian_buff").length;
- },
- },
- },
- },
- },
- rexingshuai: {
- audio: 2,
- skillAnimation: true,
- animationColor: "thunder",
- trigger: { player: "dying" },
- zhuSkill: true,
- filter: function (event, player) {
- if (player.hp > 0) return false;
- if (!player.hasZhuSkill("rexingshuai")) return false;
- return game.hasPlayer(function (current) {
- return current != player && current.group == "wei";
- });
- },
- limited: true,
- mark: true,
- content: function () {
- "step 0";
- player.awakenSkill("rexingshuai");
- var targets = game.filterPlayer();
- targets.sortBySeat(_status.currentPhase);
- targets.remove(player);
- event.targets = targets;
- event.damages = [];
- player.addSkill("rexingshuai_restore");
- "step 1";
- if (event.targets.length) {
- var current = event.targets.shift();
- if (current.group == "wei") {
- current
- .chooseBool("是否令" + get.translation(player) + "回复1点体力?")
- .set("ai", function () {
- return get.attitude(_status.event.player, _status.event.target) > 2;
- })
- .set("target", player);
- event.current = current;
- } else {
- event.redo();
- }
- } else {
- event.goto(3);
- }
- "step 2";
- if (result.bool) {
- event.damages.push(event.current);
- event.current.line(player, "green");
- game.log(event.current, "令", player, "回复1点体力");
- player.recover();
- }
- if (event.targets.length) {
- event.goto(1);
- }
- "step 3";
- if (event.damages.length) {
- var next = game.createEvent("rexingshuai_next");
- event.next.remove(next);
- trigger.after.push(next);
- next.targets = event.damages;
- next.setContent(function () {
- targets.shift().damage();
- if (targets.length) event.redo();
- });
- }
- },
- subSkill: {
- restore: {
- trigger: {
- global: "dieAfter",
- },
- charlotte: true,
- forced: true,
- filter: function (event, player) {
- return event.source && event.source.isIn() && event.source.hasSkill("mingjian2");
- },
- content: function () {
- player.restoreSkill("rexingshuai");
- game.log(player, "重置了", "#g【兴衰】");
- },
- },
- },
- },
- //不想突破可以不突破的界曹冲
- rechengxiang: {
- audio: 2,
- group: "rechengxiang_gain",
- trigger: {
- player: "rechengxiang_gainEnd",
- },
- direct: true,
- subfrequent: ["gain"],
- filter: function (event, player) {
- return (
- event.cards2 &&
- event.cards2
- .map((card) => {
- return get.number(card);
- })
- .reduce((sum, num) => {
- return (sum += num);
- }, 0) == 13
- );
- },
- content: function () {
- "step 0";
- player.link(false);
- "step 1";
- player.turnOver(false);
- },
- subSkill: {
- gain: {
- inherit: "chengxiang",
- audio: "rechengxiang",
- },
- },
- },
- //OL界二张
- olzhijian: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return player.countCards("he", { type: "equip" }) > 0;
- },
- filterCard: function (card) {
- return get.type(card) == "equip";
- },
- position: "he",
- check: function (card) {
- var player = _status.currentPhase;
- if (player.countCards("he", { subtype: get.subtype(card) }) > 1) {
- return 11 - get.equipValue(card);
- }
- return 6 - get.value(card);
- },
- filterTarget: function (card, player, target) {
- if (target.isMin()) return false;
- return player != target && target.canEquip(card, true);
- },
- content: function () {
- target.equip(cards[0]);
- player.draw();
- },
- discard: false,
- lose: false,
- prepare: function (cards, player, targets) {
- player.$give(cards, targets[0], false);
- },
- ai: {
- basic: {
- order: 10,
- },
- result: {
- target: function (player, target) {
- var card = ui.selected.cards[0];
- if (card) return get.effect(target, card, target, target);
- return 0;
- },
- },
- threaten: 1.35,
- },
- },
- olguzheng: {
- audio: 2,
- trigger: {
- global: ["loseAfter", "loseAsyncAfter"],
- },
- filter: function (event, player) {
- if (event.type != "discard") return false;
- if (player.hasSkill("olguzheng_used")) return false;
- var phaseName;
- for (var name of lib.phaseName) {
- var evt = event.getParent(name);
- if (!evt || evt.name != name) continue;
- phaseName = name;
- break;
- }
- if (!phaseName) return false;
- return game.hasPlayer((current) => {
- if (current == player) return false;
- var evt = event.getl(current);
- if (!evt || !evt.cards2 || evt.cards2.filterInD("d").length < 2) return false;
- return true;
- });
- },
- checkx: function (event, player, cards) {
- if (cards.length > 2 || get.attitude(player, event.player) > 0) return true;
- for (var i = 0; i < cards.length; i++) {
- if (get.value(cards[i], event.player, "raw") < 0) return true;
- }
- return false;
- },
- direct: true,
- preHidden: true,
- content: function () {
- "step 0";
- var targets = [],
- cardsList = [];
- var players = game.filterPlayer().sortBySeat(_status.currentPhase);
- for (var current of players) {
- if (current == player) continue;
- var cards = [];
- var evt = trigger.getl(current);
- if (!evt || !evt.cards2) continue;
- var cardsx = evt.cards2.filterInD("d");
- cards.addArray(cardsx);
- if (cards.length) {
- targets.push(current);
- cardsList.push(cards);
- }
- }
- event.targets = targets;
- event.cardsList = cardsList;
- "step 1";
- var target = targets.shift();
- var cards = event.cardsList.shift();
- event.target = target;
- event.cards = cards;
- player
- .chooseButton(2, [
- get.prompt("olguzheng", target),
- '被选择的牌将成为对方收回的牌',
- cards,
- [["获得剩余的牌", "放弃剩余的牌"], "tdnodes"],
- ])
- .set("filterButton", function (button) {
- var type = typeof button.link;
- if (ui.selected.buttons.length && type == typeof ui.selected.buttons[0].link)
- return false;
- return true;
- })
- .set("check", lib.skill.olguzheng.checkx(trigger, player, cards))
- .set("ai", function (button) {
- if (typeof button.link == "string") {
- return button.link == "获得剩余的牌" ? 1 : 0;
- }
- if (_status.event.check) {
- return 20 - get.value(button.link, _status.event.getTrigger().player);
- }
- return 0;
- })
- .setHiddenSkill("olguzheng");
- "step 2";
- if (result.bool) {
- player.logSkill("olguzheng", target);
- player.addTempSkill("olguzheng_used", [
- "phaseZhunbeiAfter",
- "phaseDrawAfter",
- "phaseJudgeAfter",
- "phaseUseAfter",
- "phaseDiscardAfter",
- "phaseJieshuAfter",
- ]);
- if (typeof result.links[0] != "string") result.links.reverse();
- var card = result.links[1];
- target.gain(card, "gain2");
- event.cards.remove(card);
- if (result.links[0] != "获得剩余的牌") event.finish();
- } else if (event.targets.length) event.goto(1);
- else event.finish();
- "step 3";
- var cards = cards.filterInD("d");
- if (cards.length > 0) player.gain(cards, "gain2");
- },
- ai: {
- threaten: 1.3,
- expose: 0.2,
- },
- subSkill: {
- used: {
- charlotte: true,
- },
- },
- },
- //SP黄月英
- rejiqiao: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- filter: function (event, player) {
- return player.countCards("he") > 0;
- },
- content: function () {
- "step 0";
- player
- .chooseToDiscard(get.prompt2("rejiqiao"), [1, player.countCards("he")], "he")
- .set("ai", function (card) {
- if (card.name == "bagua") return 10;
- return 7 - get.value(card);
- })
- .set("logSkill", "rejiqiao");
- "step 1";
- if (result.bool) {
- var num = result.cards.length;
- for (var i of result.cards) {
- if (get.type(i, false) == "equip") num++;
- }
- event.cards = game.cardsGotoOrdering(get.cards(num)).cards;
- player.showCards(event.cards);
- } else {
- event.finish();
- }
- "step 2";
- var gained = [];
- var tothrow = [];
- for (var i = 0; i < event.cards.length; i++) {
- if (get.type(event.cards[i]) != "equip") {
- gained.push(event.cards[i]);
- } else {
- tothrow.push(event.cards[i]);
- }
- }
- player.gain(gained, "gain2");
- },
- ai: {
- threaten: 1.6,
- },
- },
- relinglong: {
- audio: 2,
- trigger: {
- player: ["loseAfter", "disableEquipAfter", "enableEquipAfter"],
- global: [
- "equipAfter",
- "addJudgeAfter",
- "gainAfter",
- "loseAsyncAfter",
- "addToExpansionAfter",
- "phaseBefore",
- ],
- },
- forced: true,
- onremove: true,
- derivation: "reqicai",
- filter: function (event, player) {
- if (event.name == "disableEquip" || event.name == "enableEquip") {
- if (!event.slots.includes("equip5")) return false;
- } else if (event.name != "phase" && (event.name != "equip" || event.player != player)) {
- var evt = event.getl(player);
- if (!evt || !evt.es || !evt.es.some((i) => get.subtypes(i).includes("equip5")))
- return false;
- }
- var skills = player.additionalSkills["relinglong"];
- return (skills && skills.length > 0) != player.hasEmptySlot(5);
- },
- direct: true,
- content: function () {
- player.removeAdditionalSkill("relinglong");
- if (player.hasEmptySlot(5)) {
- player.addAdditionalSkill("relinglong", ["reqicai"]);
- }
- },
- group: ["linglong_bagua", "relinglong_directhit"],
- mod: {
- maxHandcard: function (player, num) {
- if (!player.hasEmptySlot(3) || !player.hasEmptySlot(4)) return;
- return num + 2;
- },
- },
- subSkill: {
- directhit: {
- audio: "relinglong",
- trigger: { player: "useCard" },
- forced: true,
- filter: function (event, player) {
- if (event.card.name != "sha" && get.type(event.card, false) != "trick")
- return false;
- for (var i = 2; i < 6; i++) {
- if (!player.hasEmptySlot(i)) return false;
- }
- return true;
- },
- content: function () {
- trigger.directHit.addArray(game.players);
- game.log(trigger.card, "不可被响应");
- },
- ai: {
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- if (
- !arg ||
- !arg.card ||
- !arg.target ||
- (arg.card.name != "sha" && get.type(arg.card, false) != "trick")
- )
- return false;
- for (var i = 2; i < 6; i++) {
- if (!player.hasEmptySlot(i)) return false;
- }
- return true;
- },
- },
- },
- },
- },
- //张松
- rexiantu: {
- audio: 2,
- trigger: { global: "phaseUseBegin" },
- filter: function (event, player) {
- return event.player != player;
- },
- logTarget: "player",
- check: function (event, player) {
- if (get.attitude(_status.event.player, event.player) < 1) return false;
- return (
- player.hp > 1 ||
- player.hasCard(
- (card) =>
- (get.name(card) === "tao" || get.name(card) === "jiu") &&
- lib.filter.cardEnabled(card, player),
- "hs"
- )
- );
- },
- content: function () {
- "step 0";
- if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2);
- player.draw(2);
- "step 1";
- var cards = player.getCards("he");
- if (!cards.length) event.finish();
- else if (cards.length <= 2) event._result = { cards: cards };
- else
- player
- .chooseCard(2, "he", true, "交给" + get.translation(trigger.player) + "两张牌")
- .set("ai", function (card) {
- if (ui.selected.cards.length && card.name == ui.selected.cards[0].name)
- return -1;
- if (get.tag(card, "damage")) return 1;
- if (get.type(card) == "equip") return 1;
- return 0;
- });
- "step 2";
- player.give(result.cards, trigger.player);
- trigger.player.addTempSkill("rexiantu_check", "phaseUseAfter");
- trigger.player.markAuto("rexiantu_check", [player]);
- },
- ai: {
- threaten: function (player, target) {
- return (
- 1 +
- game.countPlayer((current) => {
- if (current != target && get.attitude(target, current) > 0) return 0.5;
- return 0;
- })
- );
- },
- expose: 0.3,
- },
- subSkill: {
- check: {
- charlotte: true,
- trigger: { player: "phaseUseEnd" },
- forced: true,
- popup: false,
- onremove: true,
- filter: function (event, player) {
- return !player.getHistory("sourceDamage", (evt) => {
- return evt.getParent("phaseUse") == event;
- }).length;
- },
- content: function () {
- var targets = player.getStorage("rexiantu_check");
- targets.sortBySeat();
- for (var i of targets) {
- if (i.isIn()) {
- i.loseHp();
- }
- }
- player.removeSkill("rexiantu_check");
- },
- },
- },
- },
- //新服公孙瓒
- dcyicong: {
- trigger: {
- player: ["changeHp"],
- },
- audio: 2,
- forced: true,
- filter: function (event, player) {
- return (
- get.sgn(player.getDamagedHp() - 1.5) !=
- get.sgn(player.getDamagedHp() - 1.5 + event.num)
- );
- },
- content: function () {},
- mod: {
- globalFrom: function (from, to, current) {
- return current - 1;
- },
- globalTo: function (from, to, current) {
- if (to.getDamagedHp() >= 2) return current + 1;
- },
- },
- ai: {
- threaten: 0.8,
- },
- },
- //朱治
- reanguo: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: lib.filter.notMe,
- content: function () {
- "step 0";
- if (target.isMinHandcard()) {
- target.draw();
- event.h = true;
- }
- "step 1";
- if (target.isMinHp() && target.isDamaged()) {
- target.recover();
- event.hp = true;
- }
- "step 2";
- var equip = get.cardPile(function (card) {
- return get.type(card) == "equip" && target.hasUseTarget(card);
- });
- if (target.isMinEquip() && equip) {
- target.chooseUseTarget(equip, "nothrow", "nopopup", true);
- event.e = true;
- }
- "step 3";
- game.updateRoundNumber();
- if (!event.h && player.isMinHandcard()) {
- player.draw();
- event.h = true;
- }
- "step 4";
- if (!event.hp && player.isMinHp() && player.isDamaged()) {
- player.recover();
- event.hp = true;
- }
- "step 5";
- if (!event.e && player.isMinEquip()) {
- var equip = get.cardPile(function (card) {
- return get.type(card) == "equip" && player.hasUseTarget(card);
- });
- if (equip) {
- player.chooseUseTarget(equip, "nothrow", "nopopup", true);
- event.e = true;
- }
- }
- "step 6";
- if (event.h && event.hp && event.e) {
- player
- .chooseCard(
- "安国:是否重铸任意张牌?",
- [1, Infinity],
- lib.filter.cardRecastable,
- "he"
- )
- .set("ai", (card) => {
- return 6 - get.value(card);
- });
- } else event.finish();
- "step 7";
- if (result.bool) {
- player.recast(result.cards);
- }
- },
- ai: {
- threaten: 1.65,
- order: 9,
- result: {
- player: function (player, target) {
- if (get.attitude(player, target) <= 0) {
- if (target.isMinHandcard() || target.isMinEquip() || target.isMinHp())
- return -1;
- }
- var num = 0;
- if (player.isMinHandcard() || target.isMinHandcard()) num++;
- if (player.isMinEquip() || target.isMinEquip()) num++;
- if (
- (player.isMinHp() && player.isDamaged()) ||
- (target.isMinHp() && target.isDamaged())
- )
- num += 2.1;
- return num;
- },
- },
- },
- },
- //颜良文丑
- olshuangxiong: {
- audio: 2,
- trigger: { player: "phaseDrawEnd" },
- direct: true,
- filter: (event, player) => player.countCards("he") > 0,
- content: function () {
- "step 0";
- player
- .chooseToDiscard(
- "he",
- get.prompt("olshuangxiong"),
- "弃置一张牌,然后你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用"
- )
- .set("ai", function (card) {
- let player = _status.event.player;
- if (!_status.event.goon || player.skipList.includes("phaseUse"))
- return -get.value(card);
- let color = get.color(card),
- effect = 0,
- cards = player.getCards("hes"),
- sha = false;
- for (var cardx of cards) {
- if (cardx == card || get.color(cardx) == color) continue;
- var cardy = get.autoViewAs({ name: "juedou" }, [cardx]),
- eff1 = player.getUseValue(cardy);
- if (get.position(cardx) == "e") {
- var eff2 = get.value(cardx);
- if (eff1 > eff2) effect += eff1 - eff2;
- continue;
- } else if (get.name(cardx) == "sha") {
- if (sha) {
- effect += eff1;
- continue;
- } else sha = true;
- }
- var eff2 = player.getUseValue(cardx, null, true);
- if (eff1 > eff2) effect += eff1 - eff2;
- }
- return effect - get.value(card);
- })
- .set(
- "goon",
- player.hasValueTarget({ name: "juedou" }) &&
- !player.hasSkill("olshuangxiong_effect")
- ).logSkill = "olshuangxiong";
- "step 1";
- if (result.bool) {
- var color = get.color(result.cards[0], player);
- player.markAuto("olshuangxiong_effect", [color]);
- player.addTempSkill("olshuangxiong_effect");
- }
- },
- group: "olshuangxiong_jianxiong",
- subSkill: {
- effect: {
- audio: "olshuangxiong",
- enable: "chooseToUse",
- viewAs: { name: "juedou" },
- position: "hes",
- viewAsFilter: function (player) {
- return player.hasCard(
- (card) => lib.skill.olshuangxiong_effect.filterCard(card, player),
- "hes"
- );
- },
- filterCard: function (card, player) {
- var color = get.color(card),
- colors = player.getStorage("olshuangxiong_effect");
- for (var i of colors) {
- if (color != i) return true;
- }
- return false;
- },
- prompt: function () {
- var colors = _status.event.player.getStorage("olshuangxiong_effect");
- var str = "将一张颜色";
- for (var i = 0; i < colors.length; i++) {
- if (i > 0) str += "或";
- str += "不为";
- str += get.translation(colors[i]);
- }
- str += "的牌当做【决斗】使用";
- return str;
- },
- check: function (card) {
- var player = _status.event.player;
- if (get.position(card) == "e") {
- var raw = get.value(card);
- var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card]));
- return eff - raw;
- }
- var raw = player.getUseValue(card, null, true);
- var eff = player.getUseValue(get.autoViewAs({ name: "juedou" }, [card]));
- return eff - raw;
- },
- onremove: true,
- charlotte: true,
- ai: { order: 7 },
- },
- jianxiong: {
- audio: "olshuangxiong",
- trigger: { player: "phaseJieshuBegin" },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return player.hasHistory("damage", function (evt) {
- //Disable Umi Kato's chaofan
- return (
- evt.card &&
- evt.cards &&
- evt.cards.some((card) => get.position(card, true))
- );
- });
- },
- content: function () {
- var cards = [];
- player.getHistory("damage", function (evt) {
- if (evt.card && evt.cards)
- cards.addArray(evt.cards.filter((card) => get.position(card, true)));
- });
- if (cards.length) player.gain(cards, "gain2");
- },
- },
- },
- },
- //新李典
- xinwangxi: {
- audio: "wangxi",
- trigger: { player: "damageEnd", source: "damageSource" },
- filter: function (event) {
- if (event._notrigger.includes(event.player)) return false;
- return (
- event.num &&
- event.source &&
- event.player &&
- event.player.isIn() &&
- event.source.isIn() &&
- event.source != event.player
- );
- },
- check: function (event, player) {
- if (player.isPhaseUsing()) return true;
- if (event.player == player) return get.attitude(player, event.source) > -5;
- return get.attitude(player, event.player) > -5;
- },
- logTarget: function (event, player) {
- if (event.player == player) return event.source;
- return event.player;
- },
- preHidden: true,
- content: function () {
- "step 0";
- event.count = trigger.num;
- event.target = lib.skill.xinwangxi.logTarget(trigger, player);
- "step 1";
- player.draw(2);
- event.count--;
- "step 2";
- var cards = player.getCards("he");
- if (cards.length > 0 && target.isIn()) {
- if (cards.length == 1) event._result = { bool: true, cards: cards };
- else player.chooseCard("he", "忘隙:交给" + get.translation(target) + "一张牌", true);
- } else event.goto(4);
- "step 3";
- if (result.bool) {
- player.give(result.cards, target);
- }
- "step 4";
- if (event.count && target.isIn() && player.hasSkill("xinwangxi")) {
- player.chooseBool(get.prompt2("xinwangxi", target));
- } else event.finish();
- "step 5";
- if (result.bool) {
- player.logSkill("xinwangxi", target);
- event.goto(1);
- }
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- },
- },
- //OL界火诸葛
- olhuoji: {
- audio: "rehuoji",
- audioname: ["ol_sp_zhugeliang"],
- trigger: { player: "huogongBegin" },
- forced: true,
- locked: false,
- popup: false,
- group: "olhuoji_viewAs",
- content: function () {
- trigger.setContent(lib.skill.olhuoji.huogongContent);
- },
- huogongContent: function () {
- "step 0";
- if (target.countCards("h") == 0) {
- event.finish();
- return;
- }
- event._result = { cards: target.getCards("h").randomGets(1) };
- "step 1";
- target.showCards(result.cards).setContent(function () {});
- event.dialog = ui.create.dialog(get.translation(target) + "展示的手牌", result.cards);
- event.videoId = lib.status.videoId++;
-
- game.broadcast(
- "createDialog",
- event.videoId,
- get.translation(target) + "展示的手牌",
- result.cards
- );
- game.addVideo("cardDialog", null, [
- get.translation(target) + "展示的手牌",
- get.cardsInfo(result.cards),
- event.videoId,
- ]);
- event.card2 = result.cards[0];
- game.log(target, "展示了", event.card2);
- event._result = {};
- player
- .chooseToDiscard({ color: get.color(event.card2) }, "he", function (card) {
- var evt = _status.event.getParent();
- if (get.damageEffect(evt.target, evt.player, evt.player, "fire") > 0) {
- return 7 - get.value(card, evt.player);
- }
- return -1;
- })
- .set("prompt", false);
- game.delay(2);
- "step 2";
- if (result.bool) {
- target.damage("fire");
- } else {
- target.addTempSkill("huogong2");
- }
- event.dialog.close();
- game.addVideo("cardDialog", null, event.videoId);
- game.broadcast("closeDialog", event.videoId);
- },
- subSkill: { viewAs: { inherit: "rehuoji", audio: "rehuoji" } },
- },
- olkanpo: {
- audio: "rekanpo",
- audioname: ["ol_sp_zhugeliang", "ol_pangtong"],
- trigger: { player: "useCard" },
- forced: true,
- locked: false,
- popup: false,
- group: "olkanpo_viewAs",
- filter: function (event, player) {
- return event.card.name == "wuxie";
- },
- content: function () {
- trigger.directHit.addArray(game.players);
- },
- subSkill: { viewAs: { inherit: "rekanpo", audio: "rekanpo" } },
- },
- //新杀界曹植
- dcjiushi: {
- audio: 2,
- trigger: {
- player: "useCardAfter",
- },
- filter: function (event, player) {
- return event.card.name == "jiu";
- },
- forced: true,
- locked: false,
- content: function () {
- player.addTempSkill("dcjiushi_sha", { player: "phaseEnd" });
- player.addMark("dcjiushi_sha", 1, false);
- },
- group: ["dcjiushi_use", "dcjiushi_record", "dcjiushi_damage"],
- subSkill: {
- use: {
- audio: "dcjiushi",
- enable: "chooseToUse",
- hiddenCard: function (player, name) {
- if (name == "jiu") return !player.isTurnedOver();
- return false;
- },
- filter: function (event, player) {
- if (player.isTurnedOver()) return false;
- return event.filterCard({ name: "jiu", isCard: true }, player, event);
- },
- content: function () {
- if (_status.event.getParent(2).type == "dying") {
- event.dying = player;
- event.type = "dying";
- }
- player.turnOver();
- player.useCard({ name: "jiu", isCard: true }, player);
- },
- ai: {
- order: 5,
- result: {
- player: function (player) {
- if (_status.event.parent.name == "phaseUse") {
- if (player.countCards("h", "jiu") > 0) return 0;
- if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1)
- return 0;
- if (!player.countCards("h", "sha")) return 0;
- var targets = [];
- var target;
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (get.attitude(player, players[i]) < 0) {
- if (player.canUse("sha", players[i], true, true)) {
- targets.push(players[i]);
- }
- }
- }
- if (targets.length) {
- target = targets[0];
- } else {
- return 0;
- }
- var num = get.effect(target, { name: "sha" }, player, player);
- for (var i = 1; i < targets.length; i++) {
- var num2 = get.effect(
- targets[i],
- { name: "sha" },
- player,
- player
- );
- if (num2 > num) {
- target = targets[i];
- num = num2;
- }
- }
- if (num <= 0) return 0;
- var e2 = target.getEquip(2);
- if (e2) {
- if (e2.name == "tengjia") {
- if (
- !player.countCards("h", {
- name: "sha",
- nature: "fire",
- }) &&
- !player.getEquip("zhuque")
- )
- return 0;
- }
- if (e2.name == "renwang") {
- if (!player.countCards("h", { name: "sha", color: "red" }))
- return 0;
- }
- if (e2.name == "baiyin") return 0;
- }
- if (player.getEquip("guanshi") && player.countCards("he") > 2)
- return 1;
- return target.countCards("h") > 3 ? 0 : 1;
- }
- if (player == _status.event.dying || player.isTurnedOver()) return 3;
- },
- },
- effect: {
- target: function (card, player, target) {
- if (card.name == "guiyoujie") return [0, 0.5];
- if (target.isTurnedOver()) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- if (target.hp == 1) return;
- return [1, target.countCards("h") / 2];
- }
- }
- },
- },
- },
- },
- record: {
- trigger: { player: "damageBegin3" },
- silent: true,
- firstDo: true,
- filter: function (event, player) {
- return player.isTurnedOver();
- },
- content: function () {
- trigger.dcjiushi = true;
- },
- },
- damage: {
- audio: "dcjiushi",
- trigger: { player: "damageEnd" },
- check: function (event, player) {
- return player.isTurnedOver();
- },
- prompt: "是否发动【酒诗】,将武将牌翻面?",
- filter: function (event, player) {
- if (event.dcjiushi) {
- return true;
- }
- return false;
- },
- content: function () {
- delete trigger.dcjiushi;
- player.turnOver();
- },
- },
- sha: {
- charlotte: true,
- onremove: true,
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return num + player.countMark("dcjiushi_sha");
- },
- },
- },
- },
- },
- //OL界黄忠
- remoshi: {
- audio: 2,
- trigger: { source: "damageSource" },
- forced: true,
- filter: function (event, player) {
- return (
- event.player.isIn() &&
- event.card &&
- event.card.name == "sha" &&
- event.cards.filterInD("od").length &&
- event.notLink() &&
- [2, 3, 4].some((i) => event.player.getEquips(i).length > 0)
- );
- },
- group: "remoshi_retrieve",
- content: function () {
- trigger.player.addSkill("remoshi_stuck");
- trigger.player
- .addToExpansion(trigger.cards.filterInD("od"), "gain2")
- .gaintag.add("remoshi_stuck");
- },
- subSkill: {
- retrieve: {
- audio: "remoshi",
- trigger: {
- global: [
- "loseAfter",
- "equipAfter",
- "addJudgeAfter",
- "gainAfter",
- "loseAsyncAfter",
- "addToExpansionAfter",
- ],
- },
- filter: function (event, player) {
- var keys = ["equip2", "equip3", "equip4"];
- return game.hasPlayer((current) => {
- if (event.name == "gain" && current == player) return false;
- var cards = current.getExpansions("remoshi_stuck");
- if (!cards.length) return false;
- var evt = event.getl(current);
- if (
- evt &&
- evt.cards2 &&
- evt.cards2.some((i) =>
- get.subtypes(i).some((slot) => keys.includes(slot))
- )
- )
- return true;
- });
- },
- direct: true,
- forced: true,
- content: function () {
- "step 0";
- var keys = ["equip2", "equip3", "equip4"];
- var targets = game.filterPlayer((current) => {
- var cards = current.getExpansions("remoshi_stuck");
- if (!cards.length) return false;
- var evt = trigger.getl(current);
- if (
- evt &&
- evt.cards2 &&
- evt.cards2.some((i) =>
- get.subtypes(i).some((slot) => keys.includes(slot))
- )
- )
- return true;
- });
- event.targets = targets;
- "step 1";
- var target = targets.shift();
- var cards = target.getExpansions("remoshi_stuck");
- if (cards.length) {
- player.logSkill("remoshi_retrieve", target);
- player.gain(cards, target, "give", "bySelf");
- game.delayx();
- }
- if (targets.length) event.redo();
- },
- },
- stuck: {
- marktext: "矢",
- charlotte: true,
- intro: {
- name: "没矢",
- name2: "矢",
- content: "expansion",
- markcount: "expansion",
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- },
- },
- },
- //界文聘
- rezhenwei: {
- audio: "zhenwei",
- inherit: "zhenwei",
- filter: function (event, player) {
- if (player == event.target) return false;
- if (!player.countCards("he")) return false;
- if (event.targets.length > 1) return false;
- if (!event.target) return false;
- if (event.target.hp > player.hp) return false;
- var card = event.card;
- if (card.name == "sha") return true;
- if (get.color(card) == "black" && get.type(card, "trick") == "trick") return true;
- return false;
- },
- },
- //界关张……
- retongxin: {
- mod: {
- attackRange: (player, num) => num + 2,
- },
- },
- //马忠
- refuman: {
- audio: 2,
- enable: "phaseUse",
- filterTarget: function (card, player, target) {
- if (target == player) return false;
- var stat = player.getStat("skill").refuman_targets;
- return !stat || !stat.includes(target);
- },
- filter: function (event, player) {
- return (
- player.countCards("h") > 0 &&
- game.hasPlayer((current) => lib.skill.refuman.filterTarget(null, player, current))
- );
- },
- filterCard: true,
- content: function () {
- var card = get.discardPile((card) => card.name == "sha");
- if (card) {
- target.gain(card, "gain2").gaintag.add("refuman");
- target.addTempSkill("refuman2", { player: "phaseAfter" });
- player.addSkill("refuman_draw");
- }
- var stat = player.getStat("skill");
- if (!stat.refuman_targets) stat.refuman_targets = [];
- stat.refuman_targets.push(target);
- },
- check: function (card) {
- return get.discardPile((card) => card.name == "sha") ? 6 - get.value(card) : 0;
- },
- ai: {
- order: 2,
- result: {
- target: function (player, target) {
- if (!target.hasSha()) return 1.2;
- return 1;
- },
- },
- },
- subSkill: {
- draw: {
- trigger: { global: ["useCard", "respond"] },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- return event.player.hasHistory("lose", function (evt) {
- if (evt.getParent() != event) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("refuman")) return true;
- }
- return false;
- });
- },
- logTarget: "player",
- content: function () {
- game.asyncDraw([trigger.player, player]);
- },
- },
- },
- },
- refuman2: {
- onremove: function (player) {
- player.removeGaintag("refuman");
- },
- mod: {
- aiOrder: function (player, card, num) {
- if (get.itemtype(card) == "card" && card.hasGaintag("refuman")) return num + 1;
- },
- },
- },
- //十周年陈群
- repindi: {
- audio: 2,
- enable: "phaseUse",
- filterTarget: function (card, player, target) {
- return !player.getStorage("repindi_target").includes(target);
- },
- filterCard: function (card, player) {
- return !player.getStorage("repindi_type").includes(get.type2(card));
- },
- check: function (card) {
- var num = _status.event.player.getStat("skill").repindi || 0;
- return 6 + num - get.value(card);
- },
- position: "he",
- content: function () {
- "step 0";
- player.addTempSkill("repindi_clear", ["phaseUseAfter", "phaseAfter"]);
- player.markAuto("repindi_target", [target]);
- player.markAuto("repindi_type", [
- get.type2(cards[0], cards[0].original == "h" ? player : false),
- ]);
- event.num = player.getStat("skill").repindi;
- player.syncStorage();
- if (target.countCards("he") == 0) event._result = { index: 0 };
- else {
- player
- .chooseControlList(
- [
- "令" + get.translation(target) + "摸" + get.cnNumber(event.num) + "张牌",
- "令" +
- get.translation(target) +
- "弃置" +
- get.cnNumber(event.num) +
- "张牌",
- ],
- function () {
- return _status.event.choice;
- }
- )
- .set("choice", get.attitude(player, target) > 0 ? 0 : 1);
- }
- "step 1";
- if (result.index == 0) {
- target.draw(event.num);
- } else {
- target.chooseToDiscard(event.num, "he", true);
- }
- "step 2";
- if (target.isDamaged()) {
- player.link();
- }
- },
- subSkill: {
- clear: {
- trigger: { player: "phaseAfter" },
- charlotte: true,
- silent: true,
- onremove: function (player) {
- delete player.storage.repindi_target;
- delete player.storage.repindi_type;
- },
- },
- },
- ai: {
- order: 8,
- threaten: 1.9,
- result: {
- target: function (player, target) {
- var att = get.attitude(player, target);
- var num = (player.getStat("skill").repindi || 0) + 1;
- if (att <= 0 && target.countCards("he") < num) return 0;
- return get.sgn(att);
- },
- },
- },
- },
- //十周年孙登
- rekuangbi: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt2("rekuangbi"), (card, player, target) => {
- return target.countCards("he") > 0 && target != player;
- })
- .set("ai", (target) => {
- var player = _status.event.player;
- if (_status.event.goon)
- return get.attitude(player, target) * Math.sqrt(target.countCards("he"));
- return (-get.attitude(player, target) / (target.countCards("he") + 1)) * 10;
- })
- .set("goon", player.countCards("hs", (card) => player.hasValueTarget(card)) >= 2);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("rekuangbi", target);
- target
- .chooseCard(
- "匡弼:将至多三张牌置于" + get.translation(player) + "的武将牌上",
- "he",
- [1, 3],
- true
- )
- .set("ai", (card) => {
- if (
- get.attitude(_status.event.player, _status.event.getParent().player) > 0
- ) {
- return 7 - get.value(card);
- }
- return -get.value(card);
- });
- } else event.finish();
- "step 2";
- if (result.bool) {
- player.addToExpansion(result.cards, target, "give").gaintag.add("rekuangbi_effect");
- player.addTempSkill("rekuangbi_effect", "phaseUseEnd");
- player.markAuto("rekuangbi_effect", [target]);
- }
- },
- subSkill: {
- effect: {
- trigger: { player: "useCard" },
- charlotte: true,
- forced: true,
- filter: function (event, player) {
- return player.getExpansions("rekuangbi_effect").length > 0;
- },
- content: function () {
- "step 0";
- var cards = player.getExpansions("rekuangbi_effect");
- var suit = get.suit(trigger.card),
- cardsx = cards.filter((card) => get.suit(card) == suit);
- var len = cardsx.length;
- if (len > 1) {
- player
- .chooseButton(["匡弼:移去一张同花色的“匡弼”牌", cards], true)
- .set("filterButton", (button) => {
- return get.suit(button.link) == _status.event.suit;
- })
- .set("suit", suit);
- } else if (len == 1) {
- event._result = { bool: true, links: cardsx };
- } else {
- event._result = { bool: false, links: [cards.randomGet()] };
- }
- "step 1";
- if (result.links && result.links.length) {
- player.loseToDiscardpile(result.links);
- game.delayx();
- }
- if (result.bool) {
- player.draw("nodelay");
- var target = player.getStorage("rekuangbi_effect")[0];
- if (target && target.isIn()) target.draw();
- } else {
- player.draw();
- }
- },
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- delete player.storage[skill];
- },
- },
- },
- },
- //十周年蔡邕
- rebizhuan: {
- audio: 2,
- trigger: {
- player: "useCard",
- target: "useCardToTargeted",
- },
- filter: function (event, player) {
- if (event.name != "useCard" && event.player == event.target) return false;
- var num = 4 + Math.min(player.countMark("retongbo"), game.countPlayer());
- if (player.getExpansions("rebizhuan").length >= num) return false;
- return get.suit(event.card) == "spade";
- },
- marktext: "书",
- intro: {
- name: "辟撰(书)",
- name2: "书",
- content: "expansion",
- markcount: "expansion",
- },
- frequent: true,
- locked: false,
- content: function () {
- player.addToExpansion(get.cards(), "gain2").gaintag.add("rebizhuan");
- },
- mod: {
- maxHandcard: function (player, num) {
- return num + player.getExpansions("rebizhuan").length;
- },
- },
- },
- retongbo: {
- audio: 2,
- trigger: { player: "phaseDrawAfter" },
- direct: true,
- filter: function (event, player) {
- return player.getExpansions("rebizhuan").length > 0 && player.countCards("he") > 0;
- },
- content: function () {
- "step 0";
- var next = player.chooseToMove("通博:是否交换“书”和手牌?");
- next.set("list", [
- [get.translation(player) + "(你)的“书”", player.getExpansions("rebizhuan")],
- ["你的牌", player.getCards("he")],
- ]);
- next.set("filterMove", function (from, to) {
- return typeof to != "number";
- });
- next.set("processAI", function (list) {
- var player = _status.event.player,
- cards = list[0][1].concat(list[1][1]),
- cards2 = [];
- cards.sort((a, b) => {
- return get.useful(a) - get.useful(b);
- });
- cards2 = cards.splice(0, player.getExpansions("rebizhuan").length);
- return [cards2, cards];
- });
- "step 1";
- if (result.bool) {
- var pushs = result.moved[0],
- gains = result.moved[1];
- pushs.removeArray(player.getExpansions("rebizhuan"));
- gains.removeArray(player.getCards("he"));
- if (!pushs.length || pushs.length != gains.length) {
- event.finish();
- return;
- }
- player.logSkill("retongbo");
- player.addToExpansion(pushs, "give", player).gaintag.add("rebizhuan");
- player.gain(gains, "gain2");
- }
- "step 2";
- event.cards = player.getExpansions("rebizhuan").slice(0);
- if (event.cards.length < 4) event.finish();
- else {
- event.given = [];
- var list = [];
- event.cards.forEach((i) => list.add(get.suit(i)));
- if (list.length >= 4 && player.hp <= 2) event.four = true;
- }
- "step 3";
- if (event.given.length < 4) {
- player
- .chooseCardButton(
- "是否将" +
- get.cnNumber(4 - event.given.length) +
- "张“书”交给任意名其他角色?",
- event.cards,
- [1, 4 - event.given.length],
- event.given.length > 0
- )
- .set("ai", function (button) {
- if (!_status.event.goon) return 0;
- var four = _status.event.getParent().four,
- given = _status.event.getParent().given;
- if (four)
- return (
- get.value(button.link) +
- (given.map((i) => get.suit(i)).includes(get.suit(button.link))
- ? 0
- : 10)
- );
- if (ui.selected.buttons.length == 0) return get.value(button.link);
- return 0;
- })
- .set(
- "goon",
- game.hasPlayer(
- (current) => current != player && get.attitude(player, current) > 0
- )
- );
- } else {
- event.goto(6);
- }
- "step 4";
- if (result.bool) {
- for (var i = 0; i < result.links.length; i++) {
- event.cards.remove(result.links[i]);
- }
- event.togive = result.links.slice(0);
- event.given.addArray(event.togive);
- player
- .chooseTarget(
- "将" + get.translation(result.links) + "交给一名其他角色",
- true,
- function (card, player, target) {
- return target != player;
- }
- )
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- if (_status.event.enemy) {
- return -att;
- } else if (att > 0) {
- return att / (1 + target.countCards("h"));
- } else {
- return att / 100;
- }
- })
- .set("enemy", get.value(event.togive[0], player, "raw") < 0);
- } else {
- event.finish();
- }
- "step 5";
- if (result.targets.length) {
- result.targets[0].gain(event.togive, "draw").giver = player;
- player.line(result.targets[0], "green");
- game.log(
- result.targets[0],
- "获得了" + get.cnNumber(event.togive.length) + "张",
- "#g“书”"
- );
- if (event.given.length < 4) event.goto(3);
- }
- "step 6";
- if (event.given.length == 4) {
- var suits = lib.suit.slice(0);
- event.given.forEach((i) => suits.remove(get.suit(i, player)));
- if (suits.length == 0) {
- player.recover();
- player.addMark("retongbo", 1, false);
- }
- }
- },
- marktext: "博",
- intro: {
- content: function (storage, player) {
- var num = 4 + Math.min(storage, game.countPlayer());
- return "“书”的上限+" + num;
- },
- },
- ai: {
- combo: "rebizhuan",
- },
- },
- //十周年陈宫
- remingce: {
- enable: "phaseUse",
- usable: 1,
- audio: 2,
- position: "he",
- filterCard: function (card) {
- return get.name(card) == "sha" || get.type(card) == "equip";
- },
- filter: function (event, player) {
- return (
- player.countCards("h", "sha") > 0 || player.countCards("he", { type: "equip" }) > 0
- );
- },
- check: function (card) {
- return 8 - get.value(card);
- },
- selectTarget: 2,
- multitarget: true,
- discard: false,
- lose: false,
- targetprompt: ["得到牌", "出杀目标"],
- filterTarget: function (card, player, target) {
- if (ui.selected.targets.length == 0) {
- return player != target;
- }
- return true;
- },
- delay: false,
- content: function () {
- "step 0";
- player.give(cards, targets[0], "visible");
- "step 1";
- if (!targets[0].canUse({ name: "sha", isCard: true }, targets[1], false, false))
- event._result = { control: "选项二" };
- else
- targets[0]
- .chooseControl()
- .set("ai", function () {
- var player = _status.event.player,
- target = _status.event.target;
- return get.effect(target, { name: "sha", isCard: true }, player, player) > 0
- ? 0
- : 1;
- })
- .set("choiceList", [
- "视为对" +
- get.translation(targets[1]) +
- "使用一张【杀】,若此杀造成伤害则执行选项二",
- "你与" + get.translation(player) + "各摸一张牌",
- ])
- .set("target", targets[1])
- .set("prompt", "对" + get.translation(targets[1]) + "使用一张杀,或摸一张牌");
- "step 2";
- if (result.control == "选项二") {
- game.asyncDraw([player, targets[0]]);
- event.finish();
- } else {
- targets[0].useCard({ name: "sha", isCard: true }, targets[1]);
- }
- "step 3";
- if (
- targets[0].hasHistory("useCard", (evt) => {
- return (
- evt.getParent() == event &&
- targets[0].hasHistory("sourceDamage", (evtx) => evt.card == evtx.card)
- );
- })
- ) {
- game.asyncDraw([player, targets[0]]);
- }
- },
- ai: {
- result: {
- player: function (player) {
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (
- players[i] != player &&
- get.attitude(player, players[i]) > 1 &&
- get.attitude(players[i], player) > 1
- ) {
- return 1;
- }
- }
- return 0;
- },
- target: function (player, target) {
- if (ui.selected.targets.length) {
- return -0.1;
- }
- return 1;
- },
- },
- order: 8.5,
- expose: 0.2,
- },
- },
- // 界荀攸
- reqice: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- const hs = player.getCards("h");
- if (!hs.length) return false;
- if ((player.getStat("skill").reqice || 0) >= player.countMark("reqice_mark") + 1)
- return false;
- if (
- hs.some((card) => {
- const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
- return mod2 === false;
- })
- )
- return false;
- return lib.inpile.some((name) => {
- if (get.type(name) != "trick") return false;
- const card = get.autoViewAs({ name }, hs);
- return event.filterCard(card, player, event);
- });
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = [];
- for (var i = 0; i < lib.inpile.length; i++) {
- if (get.type(lib.inpile[i]) == "trick") list.push(["锦囊", "", lib.inpile[i]]);
- }
- return ui.create.dialog(get.translation("reqice"), [list, "vcard"]);
- },
- filter: function (button, player) {
- const event = _status.event.getParent(),
- card = get.autoViewAs(
- {
- name: button.link[2],
- },
- player.getCards("h")
- );
- return event.filterCard(card, player, event);
- },
- check: function (button) {
- var player = _status.event.player;
- var effect = player.getUseValue(button.link[2]);
- if (player.countCards("hs", button.link[2]) > 0) return 0;
- if ((player.getStat("skill").reqice || 0) < player.countMark("reqice_mark") + 1) {
- if (["draw", "gain"].some((i) => get.tag(button.link[2], i) >= 1))
- return effect * 5;
- }
- if (effect > 0) return effect;
- return 0;
- },
- backup: function (links, player) {
- return {
- filterCard: true,
- selectCard: -1,
- position: "h",
- audio: "reqice",
- popname: true,
- viewAs: { name: links[0][2] },
- };
- },
- prompt: function (links, player) {
- return "将所有手牌当【" + get.translation(links[0][2]) + "】使用";
- },
- },
- ai: {
- order: 1,
- result: {
- player: function (player) {
- var num = 0;
- var cards = player.getCards("h");
- if (cards.length >= 3 && player.hp >= 3 && player.countMark("reqice_mark") < 2)
- return 0;
- for (var i = 0; i < cards.length; i++) {
- num += Math.max(0, get.value(cards[i], player, "raw"));
- }
- num /= cards.length;
- num /= (player.countMark("reqice_mark") + 1) * 1.3;
- num *= Math.min(cards.length, player.hp);
- return 13 - num;
- },
- },
- nokeep: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag === "nokeep")
- return (
- (!arg || (arg.card && get.name(arg.card) === "tao")) &&
- player.isPhaseUsing() &&
- !player.getStat("skill").reqice &&
- player.hasCard((card) => get.name(card) != "tao", "h")
- );
- },
- threaten: 1.7,
- },
- subSkill: {
- bakcup: {},
- mark: {
- charlotte: true,
- onremove: true,
- intro: {
- name2: "奇策",
- content: "mark",
- },
- },
- },
- },
- rezhiyu: {
- audio: 2,
- trigger: { player: "damageEnd" },
- content: function () {
- "step 0";
- player.draw();
- "step 1";
- if (!player.countCards("h")) event.finish();
- else player.showHandcards();
- "step 2";
- if (!trigger.source || !trigger.source.isIn()) event._result = { bool: false, cards: [] };
- else trigger.source.chooseToDiscard("智愚:请弃置一张手牌", true);
- "step 3";
- var cards = player.getCards("h");
- var color = get.color(cards[0], player);
- var bool = true;
- for (var i = 1; i < cards.length; i++) {
- if (get.color(cards[i], player) != color) {
- bool = false;
- break;
- }
- }
- if (bool) {
- var cards = result.cards.filterInD("d");
- if (cards.length) {
- player.gain(cards, "gain2");
- }
- player.addMark("reqice_mark", 1);
- player.addTempSkill("reqice_mark", { player: "phaseAfter" });
- }
- },
- ai: {
- maixie_defend: true,
- threaten: 0.85,
- },
- },
- oljiang: {
- audio: "jiang",
- inherit: "jiang",
- group: "oljiang_gain",
- subSkill: {
- gain: {
- audio: "jiang",
- audioname: ["sp_lvmeng", "re_sunben", "re_sunce"],
- trigger: { global: ["loseAfter", "loseAsyncAfter"] },
- usable: 1,
- filter: function (event, player) {
- if (player.hp < 1 || event.type != "discard" || event.position != ui.discardPile)
- return false;
- var filter = (card) =>
- card.name == "juedou" ||
- (card.name == "sha" && get.color(card, false) == "red");
- var cards = event.getd().filter(filter);
- if (!cards.filter((card) => get.position(card, true) == "d").length) return false;
- var searched = false;
- if (
- game.getGlobalHistory("cardMove", function (evt) {
- if (searched || evt.type != "discard" || evt.position != ui.discardPile)
- return false;
- var evtx = evt;
- if (evtx.getlx === false) evtx = evt.getParent();
- var cards = evtx.getd().filter(filter);
- if (!cards.length) return false;
- searched = true;
- return evtx != event;
- }).length > 0
- )
- return false;
- return true;
- },
- prompt2: function (event, player) {
- var cards = event.getd().filter(function (card) {
- return (
- (card.name == "juedou" ||
- (card.name == "sha" && get.color(card, false) == "red")) &&
- get.position(card, true) == "d"
- );
- });
- return "失去1点体力并获得" + get.translation(cards);
- },
- check: function (event, player) {
- return player.hp > 1 && !player.storage.olhunzi;
- },
- content: function () {
- player.loseHp();
- var cards = trigger.getd().filter(function (card) {
- return (
- (card.name == "juedou" ||
- (card.name == "sha" && get.color(card, false) == "red")) &&
- get.position(card, true) == "d"
- );
- });
- if (cards.length > 0) player.gain(cards, "gain2");
- },
- },
- },
- },
- //李儒
- dcmieji: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.hasCard(lib.skill.dcmieji.filterCard, "eh");
- },
- position: "he",
- filterCard: function (card) {
- if (get.subtype(card) == "equip1") return true;
- return get.color(card) == "black" && get.type(card, "trick") == "trick";
- },
- filterTarget: function (card, player, target) {
- return target != player && target.countCards("h") > 0;
- },
- discard: false,
- delay: false,
- check: function (card) {
- return 8 - get.value(card);
- },
- loseTo: "cardPile",
- insert: true,
- visible: true,
- content: function () {
- "step 0";
- player.showCards(cards);
- "step 1";
- target
- .chooseToDiscard("he", true)
- .set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。");
- "step 2";
- if (
- (!result.cards ||
- get.type(
- result.cards[0],
- "trick",
- result.cards[0].original == "h" ? target : false
- ) != "trick") &&
- target.countCards("he", function (card) {
- return get.type(card, "trick") != "trick";
- })
- ) {
- target
- .chooseToDiscard("he", true, function (card) {
- return get.type(card, "trick") != "trick";
- })
- .set("prompt", "请弃置第二张非锦囊牌");
- }
- },
- ai: {
- order: 9,
- result: {
- target: -1,
- },
- },
- },
- dcfencheng: {
- skillAnimation: "epic",
- animationColor: "fire",
- audio: 2,
- enable: "phaseUse",
- filterTarget: function (card, player, target) {
- return player != target;
- },
- limited: true,
- line: "fire",
- content: function () {
- "step 0";
- player.awakenSkill("dcfencheng");
- event.num = 1;
- event.targets = game.filterPlayer((current) => current != player);
- event.targets.sortBySeat(target);
- "step 1";
- if (event.targets.length) {
- var target = event.targets.shift();
- if (!target.isIn()) {
- event.redo();
- return;
- }
- event.target = target;
- player.line(target, "fire");
- var res = get.damageEffect(target, player, target, "fire");
- target
- .chooseToDiscard(
- "he",
- "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害",
- [num, Infinity]
- )
- .set("ai", function (card) {
- if (ui.selected.cards.length >= _status.event.getParent().num) return -1;
- if (_status.event.player.hasSkillTag("nofire")) return -1;
- if (_status.event.res >= 0) return 6 - get.value(card);
- if (get.type(card) != "basic") {
- return 10 - get.value(card);
- }
- return 8 - get.value(card);
- })
- .set("res", res);
- } else {
- event.finish();
- }
- "step 2";
- if (!result.bool) {
- event.target.damage(2, "fire");
- event.num = 1;
- } else {
- event.num = result.cards.length + 1;
- event.goto(1);
- }
- "step 3";
- game.delayx();
- event.goto(1);
- },
- ai: {
- order: 1,
- result: {
- player: function (player, target) {
- if (player.hasUnknown(2)) return 0;
- var num = 0,
- eff = 0,
- players = game
- .filterPlayer(function (current) {
- return current != player;
- })
- .sortBySeat(target);
- for (var target of players) {
- if (get.damageEffect(target, player, target, "fire") >= 0) {
- num = 0;
- continue;
- }
- var shao = false;
- num++;
- if (
- target.countCards("he", function (card) {
- if (get.type(card) != "basic") {
- return get.value(card) < 10;
- }
- return get.value(card) < 8;
- }) < num
- )
- shao = true;
- if (shao) {
- eff -= 4 * (get.realAttitude || get.attitude)(player, target);
- num = 0;
- } else eff -= (num * (get.realAttitude || get.attitude)(player, target)) / 4;
- }
- if (eff < 4) return 0;
- return eff;
- },
- },
- },
- },
- //朱桓
- refenli: {
- audio: 2,
- group: ["refenli_draw", "refenli_use", "refenli_discard"],
- subfrequent: ["discard"],
- subSkill: {
- draw: {
- audio: "refenli",
- trigger: { player: "phaseJudgeBefore" },
- prompt: "是否发动【奋励】跳过判定和摸牌阶段?",
- filter: function (event, player) {
- return player.isMaxHandcard();
- },
- check: function (event, player) {
- if (player.hasJudge("lebu") || player.hasJudge("bingliang")) return true;
- if (player.getHistory("skipped").length > 0) return false;
- return game.hasPlayer(function (current) {
- return (
- get.attitude(player, current) < 0 &&
- current.hp == 1 &&
- get.damageEffect(current, player, player) > 0
- );
- });
- },
- content: function () {
- trigger.cancel();
- player.skip("phaseDraw");
- },
- },
- use: {
- audio: "refenli",
- trigger: { player: "phaseUseBefore" },
- prompt: "是否发动【奋励】跳过出牌阶段?",
- filter: function (event, player) {
- return player.isMaxHp();
- },
- check: function (event, player) {
- if (!player.needsToDiscard() || (player.countCards("e") && player.isMaxEquip()))
- return true;
- if (player.getHistory("skipped").length > 0) return false;
- return game.hasPlayer(function (current) {
- return (
- get.attitude(player, current) < 0 &&
- current.hp == 1 &&
- get.damageEffect(current, player, player) > 0
- );
- });
- },
- content: function () {
- trigger.cancel();
- },
- },
- discard: {
- audio: "refenli",
- trigger: { player: "phaseDiscardBefore" },
- prompt: "是否发动【奋励】跳过弃牌阶段?",
- frequent: true,
- filter: function (event, player) {
- return player.isMaxEquip() && player.countCards("e");
- },
- content: function () {
- trigger.cancel();
- },
- },
- },
- ai: {
- combo: "repingkou",
- },
- },
- repingkou: {
- audio: 2,
- trigger: { player: "phaseEnd" },
- direct: true,
- filter: function (event, player) {
- return player.getHistory("skipped").length > 0;
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(
- [1, player.getHistory("skipped").length],
- get.prompt2("repingkou"),
- "对至多" +
- get.cnNumber(num) +
- "名其他角色各造成1点伤害。若你选择的角色数小于最大角色数,则你可以弃置其中一名目标角色装备区内的一张牌",
- function (card, player, target) {
- return target != player;
- }
- )
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- "step 1";
- if (result.bool) {
- player.logSkill("repingkou", result.targets);
- event.targets = result.targets.slice(0).sortBySeat();
- event.num = 0;
- } else {
- event.finish();
- }
- "step 2";
- var target = targets[event.num];
- if (target.isIn()) target.damage();
- event.num++;
- if (event.num < targets.length) event.redo();
- else if (event.num == player.getHistory("skipped").length) event.finish();
- "step 3";
- var targets2 = targets.filter(function (target) {
- return target.countDiscardableCards(player, "e") > 0;
- });
- if (targets2.length > 0) {
- player
- .chooseTarget(
- "是否弃置一名目标角色的一张装备牌?",
- function (card, player, target) {
- return _status.event.targets.includes(target);
- }
- )
- .set("targets", targets2)
- .set("ai", function (target) {
- var att = get.attitude(player, target),
- eff = 0;
- target.getCards("e", function (card) {
- var val = get.value(card, target);
- eff = Math.max(eff, -val * att);
- });
- return eff;
- });
- } else event.finish();
- "step 4";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- player.discardPlayerCard(target, "e", true);
- }
- },
- ai: {
- combo: "fenli",
- effect: {
- target: function (card) {
- if (card.name == "lebu" || card.name == "bingliang") return 0.5;
- },
- },
- },
- },
- //典韦
- olqiangxi: {
- audio: "qiangxi",
- audioname: ["ol_dianwei", "boss_lvbu3"],
- enable: "phaseUse",
- usable: 2,
- filter: function (event, player) {
- if (
- player.hp < 1 &&
- !player.hasCard((card) => lib.skill.olqiangxi.filterCard(card), "he")
- )
- return false;
- return game.hasPlayer((current) =>
- lib.skill.olqiangxi.filterTarget(null, player, current)
- );
- },
- filterCard: function (card) {
- return get.subtype(card) == "equip1";
- },
- position: "he",
- filterTarget: function (card, player, target) {
- if (target == player) return false;
- var stat = player.getStat()._olqiangxi;
- return !stat || !stat.includes(target);
- },
- selectCard: function () {
- if (_status.event.player.hp < 1) return 1;
- return [0, 1];
- },
- content: function () {
- var stat = player.getStat();
- if (!stat._olqiangxi) stat._olqiangxi = [];
- stat._olqiangxi.push(target);
- if (!cards.length) player.damage("nosource", "nocard");
- target.damage("nocard");
- },
- ai: {
- damage: true,
- order: 8,
- result: {
- player: function (player, target) {
- if (ui.selected.cards.length) return 0;
- if (player.hp >= target.hp) return -0.9;
- if (player.hp <= 2) return -10;
- return get.damageEffect(player, player, player);
- },
- target: function (player, target) {
- if (!ui.selected.cards.length) {
- if (player.hp < 2) return 0;
- if (player.hp == 2 && target.hp >= 2) return 0;
- if (target.hp > player.hp) return 0;
- }
- return get.damageEffect(target, player, target);
- },
- },
- threaten: 1.5,
- },
- },
- olningwu: {
- audio: 2,
- trigger: { global: "damageEnd" },
- filter: function (event, player) {
- if (player != event.player && player != event.source) return false;
- return event.player.getHistory("damage").indexOf(event) == 1;
- },
- logTarget: "player",
- forced: true,
- content: function () {
- player.draw();
- player.discardPlayerCard(trigger.player, true, "ej");
- },
- },
- //群太史慈
- rejixu: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.hp > 0 && player.countCards("h") > 0;
- },
- filterTarget: lib.filter.notMe,
- selectTarget: function () {
- return [1, _status.event.player.hp];
- },
- multitarget: true,
- multiline: true,
- content: function () {
- "step 0";
- targets.sortBySeat();
- event.num = 0;
- "step 1";
- if (!event.caicuolist) event.caicuolist = [];
- targets[event.num].chooseBool("是否押杀?").ai = function (event, player) {
- var evt = _status.event.getParent();
- if (get.attitude(targets[event.num], evt.player) > 0)
- return evt.player.countCards("h", "sha") ? false : true;
- if (
- evt.player.hasKnownCards(targets[event.num], (c) => {
- return c.name == "sha";
- })
- ) {
- return true;
- }
- return Math.random() < 0.5;
- };
- "step 2";
- if (result.bool) {
- targets[event.num].chat("有杀");
- game.log(targets[event.num], "认为", player, "#g有杀");
- if (!player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]);
- } else {
- targets[event.num].chat("没杀");
- game.log(targets[event.num], "认为", player, "#y没有杀");
- if (player.countCards("h", "sha")) event.caicuolist.add(targets[event.num]);
- }
- event.num++;
- game.delay();
- if (event.num < targets.length) event.goto(1);
- "step 3";
- player.popup(player.countCards("h", "sha") ? "有杀" : "没杀");
- game.log(player, player.countCards("h", "sha") ? "有杀" : "没杀");
- if (event.caicuolist.length > 0) {
- if (player.countCards("h", "sha")) {
- player.markAuto("rejixu_sha", event.caicuolist);
- player.addTempSkill("rejixu_sha", "phaseUseAfter");
- player.draw(event.caicuolist.length);
- event.finish();
- } else {
- event.num = 0;
- }
- } else event.finish();
- "step 4";
- var target = event.caicuolist[event.num];
- if (target.countCards("he") > 0) {
- player.line(target);
- player.discardPlayerCard(true, "he", target);
- }
- event.num++;
- if (event.num < event.caicuolist.length) event.redo();
- else player.draw(event.caicuolist.length);
- },
- ai: {
- order: function () {
- return get.order({ name: "sha" }) + 0.6;
- },
- result: {
- target: function (player, target) {
- if (player.countCards("h", "sha")) {
- return get.effect(target, { name: "sha" }, player, target);
- } else {
- return get.effect(target, { name: "guohe_copy2" }, player, target);
- }
- },
- },
- expose: 0.4,
- },
- subSkill: {
- sha: {
- audio: "rejixu",
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return num + player.getStorage("rejixu_sha").length;
- },
- },
- charlotte: true,
- onremove: true,
- trigger: { player: "useCard2" },
- filter: function (event, player) {
- if (event.card.name != "sha") return false;
- for (var target of player.getStorage("rejixu_sha")) {
- if (event.targets.includes(target) || !target.isIn()) return false;
- if (lib.filter.targetEnabled2(event.card, player, target)) return true;
- }
- return false;
- },
- prompt: "是否发动【击虚】?",
- prompt2: function (event, player) {
- var list = player.getStorage("rejixu_sha").filter(function (target) {
- if (event.targets.includes(target) || !target.isIn()) return false;
- return lib.filter.targetEnabled2(event.card, player, target);
- });
- return (
- "令" +
- get.translation(list) +
- "也成为" +
- get.translation(event.card) +
- "的目标"
- );
- },
- logTarget: function (event, player) {
- return player.getStorage("rejixu_sha").filter(function (target) {
- if (event.targets.includes(target) || !target.isIn()) return false;
- return lib.filter.targetEnabled2(event.card, player, target);
- });
- },
- check: function (event, player) {
- var eff = 0;
- var list = player.getStorage("rejixu_sha").filter(function (target) {
- if (event.targets.includes(target) || !target.isIn()) return false;
- return lib.filter.targetEnabled2(event.card, player, target);
- });
- for (var i of list) eff += get.effect(i, event.card, player, player);
- return eff > 0;
- },
- content: function () {
- var list = player.getStorage("rejixu_sha").filter(function (target) {
- if (trigger.targets.includes(target) || !target.isIn()) return false;
- return lib.filter.targetEnabled2(trigger.card, player, target);
- });
- if (list.length > 0) {
- trigger.targets.addArray(list);
- game.log(list, "也成为了", trigger.card, "的目标");
- }
- },
- },
- },
- },
- //界刘封
- rexiansi: {
- inherit: "xiansi",
- audio: "xiansi",
- audioname: ["re_liufeng"],
- group: ["rexiansi2", "xiansix"],
- },
- rexiansi2: {
- enable: "chooseToUse",
- filter: function (event, player) {
- return (
- player.getExpansions("xiansi").length > Math.max(0, player.hp) &&
- event.filterCard({ name: "sha", isCard: true }, player, event)
- );
- },
- chooseButton: {
- dialog: function (event, player) {
- return ui.create.dialog("陷嗣", player.getExpansions("xiansi"), "hidden");
- },
- backup: function (links, player) {
- return {
- viewAs: { name: "sha", isCard: true },
- filterCard: () => false,
- selectCard: -1,
- card: links[0],
- precontent: function () {
- player.logSkill("rexiansi");
- player.loseToDiscardpile(lib.skill.rexiansi2_backup.card);
- delete event.result.skill;
- },
- };
- },
- prompt: () => "请选择【杀】的目标",
- },
- ai: {
- order: function () {
- return get.order({ name: "sha" }) + 0.6;
- },
- result: { player: 1 },
- },
- },
- //界荀彧
- oljieming: {
- audio: 2,
- trigger: { player: ["damageEnd", "die"] },
- direct: true,
- forceDie: true,
- filter: function (event, player) {
- if (event.name == "die") return true;
- return player.isIn();
- },
- content: function () {
- "step 0";
- event.count = trigger.num || 1;
- "step 1";
- event.count--;
- player
- .chooseTarget(get.prompt2("oljieming"), function (card, player, target) {
- return target.maxHp > 0;
- })
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- var draw = Math.min(5, target.maxHp) - target.countCards("h");
- if (draw >= 0) {
- if (target.hasSkillTag("nogain")) att /= 6;
- if (att > 2) {
- return Math.sqrt(draw + 1) * att;
- }
- return att / 3;
- }
- if (draw < -1) {
- if (target.hasSkillTag("nogain")) att *= 6;
- if (att < -2) {
- return -Math.sqrt(1 - draw) * att;
- }
- }
- return 0;
- });
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("oljieming", target);
- target.draw(Math.min(5, target.maxHp));
- } else event.finish();
- "step 3";
- var num = target.countCards("h") - Math.min(5, target.maxHp);
- if (num > 0) target.chooseToDiscard("h", true, num);
- "step 4";
- if (event.count > 0 && player.isIn() && player.hasSkill("oljieming")) event.goto(1);
- },
- ai: {
- expose: 0.2,
- maixie: true,
- maixie_hp: true,
- effect: {
- target: function (card, player, target, current) {
- if (get.tag(card, "damage") && target.hp > 1) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- var max = 0;
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (get.attitude(target, players[i]) > 0) {
- max = Math.max(
- Math.min(5, players[i].hp) - players[i].countCards("h"),
- max
- );
- }
- }
- switch (max) {
- case 0:
- return 2;
- case 1:
- return 1.5;
- case 2:
- return [1, 2];
- default:
- return [0, max];
- }
- }
- if (
- (card.name == "tao" || card.name == "caoyao") &&
- target.hp > 1 &&
- target.countCards("h") <= target.hp
- )
- return [0, 0];
- },
- },
- },
- },
- //OL华雄
- shizhan: {
- audio: 2,
- enable: "phaseUse",
- usable: 2,
- filterTarget: function (card, player, target) {
- return target != player && target.canUse("juedou", player);
- },
- content: function () {
- target.useCard({ name: "juedou", isCard: true }, player, "noai");
- },
- ai: {
- order: 2,
- result: {
- player: function (player, target) {
- return get.effect(player, { name: "juedou", isCard: true }, target, player);
- },
- },
- },
- },
- //刘谌
- rezhanjue: {
- audio: 2,
- enable: "phaseUse",
- filterCard: function (card) {
- return !card.hasGaintag("reqinwang");
- },
- selectCard: -1,
- position: "h",
- filter: function (event, player) {
- var stat = player.getStat().skill;
- if (stat.rezhanjue_draw && stat.rezhanjue_draw >= 3) return false;
- var hs = player.getCards("h", function (card) {
- return !card.hasGaintag("reqinwang");
- });
- if (!hs.length) return false;
- for (var i = 0; i < hs.length; i++) {
- var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player);
- if (mod2 === false) return false;
- }
- return event.filterCard(get.autoViewAs({ name: "juedou" }, hs));
- },
- viewAs: { name: "juedou" },
- onuse: function (links, player) {
- player.addTempSkill("rezhanjue_effect", "phaseUseEnd");
- },
- ai: {
- order: 1,
- tag: {
- respond: 2,
- respondSha: 2,
- damage: 1,
- },
- result: {
- target: -1.5,
- player: function (player, target) {
- if (
- player.hasSkillTag(
- "directHit_ai",
- true,
- {
- target: target,
- card: { name: "juedou" },
- },
- true
- )
- ) {
- return 0;
- }
- if (
- get.damageEffect(target, player, target) > 0 &&
- get.attitude(player, target) > 0 &&
- get.attitude(target, player) > 0
- ) {
- return 0;
- }
- var hs1 = target.getCards("h", "sha");
- var hs2 = player.getCards("h", function (card) {
- return card.hasGaintag("reqinwang") && get.name(card) == "sha";
- });
- if (hs1.length > hs2.length + 1) {
- return -2;
- }
- var hsx = target.getCards("h");
- if (hsx.length > 2 && hs2.length == 0 && hsx[0].number < 6) {
- return -2;
- }
- if (hsx.length > 3 && hs2.length == 0) {
- return -2;
- }
- if (hs1.length > hs2.length && (!hs2.length || hs1[0].number > hs2[0].number)) {
- return -2;
- }
- return -0.5;
- },
- },
- nokeep: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag === "nokeep")
- return (
- (!arg || (arg.card && get.name(arg.card) === "tao")) &&
- player.isPhaseUsing() &&
- player.countSkill("rezhanjue_draw") < 3 &&
- player.hasCard((card) => {
- return get.name(card) !== "tao" && !card.hasGaintag("reqinwang");
- }, "h")
- );
- },
- },
- },
- rezhanjue_effect: {
- audio: false,
- trigger: { player: "useCardAfter" },
- forced: true,
- popup: false,
- charlotte: true,
- onremove: function (player) {
- delete player.getStat().skill.rezhanjue_draw;
- },
- filter: function (event, player) {
- return event.skill == "rezhanjue";
- },
- content: function () {
- "step 0";
- var stat = player.getStat().skill;
- if (!stat.rezhanjue_draw) stat.rezhanjue_draw = 0;
- stat.rezhanjue_draw++;
- player.draw("nodelay");
- var list = game.filterPlayer(function (current) {
- if (
- current.getHistory("damage", function (evt) {
- return evt.card == trigger.card;
- }).length > 0
- ) {
- if (current == player) {
- stat.rezhanjue_draw++;
- }
- return true;
- }
- return false;
- });
- if (list.length) {
- list.sortBySeat();
- game.asyncDraw(list);
- }
- "step 1";
- game.delay();
- },
- },
- reqinwang: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- zhuSkill: true,
- filter: function (event, player) {
- if (!player.hasZhuSkill("reqinwang")) return false;
- return game.hasPlayer(function (current) {
- return (
- current != player &&
- current.group == "shu" &&
- player.hasZhuSkill("reqinwang", current)
- );
- });
- },
- selectTarget: -1,
- filterTarget: function (card, player, current) {
- return (
- current != player &&
- current.group == "shu" &&
- player.hasZhuSkill("reqinwang", current)
- );
- },
- content: function () {
- "step 0";
- if (
- target.hasCard(function (card) {
- return _status.connectMode || get.name(card, target) == "sha";
- }, "h")
- ) {
- target
- .chooseCard(
- "是否交给" + get.translation(player) + "一张【杀】?",
- function (card, player) {
- return get.name(card, player) == "sha";
- },
- "h"
- )
- .set("goon", get.attitude(target, player) > 0)
- .set("ai", function (card) {
- return _status.event.goon ? 1 : 0;
- });
- } else event.finish();
- "step 1";
- if (result.bool) {
- var card = result.cards[0];
- target.give(card, player).gaintag.add("reqinwang");
- player.addTempSkill("reqinwang_clear");
- player.chooseBool("是否令" + get.translation(target) + "摸一张牌?");
- } else event.finish();
- "step 2";
- if (result.bool) target.draw();
- },
- ai: {
- order: 5,
- result: { player: 1 },
- },
- subSkill: {
- clear: {
- charlotte: true,
- onremove: function (player) {
- player.removeGaintag("reqinwang");
- },
- },
- },
- },
- //公孙瓒
- dcqiaomeng: {
- audio: 2,
- trigger: { player: "useCardToPlayered" },
- direct: true,
- filter: function (event, player) {
- if (!event.isFirstTarget || get.color(event.card) != "black") return false;
- for (var i of event.targets) {
- if (
- i != player &&
- i.hasCard(function (card) {
- return lib.filter.canBeDiscarded(card, player, i);
- }, "he")
- )
- return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("dcqiaomeng"),
- "选择一名不为自己的目标角色,然后弃置其一张牌。若以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令" +
- get.translation(trigger.card) +
- "不可被响应。",
- function (card, player, target) {
- return (
- target != player &&
- _status.event.getTrigger().targets.includes(target) &&
- target.hasCard(function (card) {
- return lib.filter.canBeDiscarded(card, player, target);
- }, "he")
- );
- }
- )
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, { name: "guohe_copy2" }, player, player);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcqiaomeng", target);
- player.discardPlayerCard(target, true, "he");
- } else event.finish();
- "step 2";
- if (result.bool && result.cards && result.cards.length) {
- //为了体现白马义从野性纯真的美 直接获取卡牌原类型 不考虑维系区域
- var card = result.cards[0],
- type = get.type2(card, false);
- if (type == "trick")
- trigger.directHit.addArray(game.filterPlayer((current) => current != player));
- if (type == "equip" && get.position(card, true) == "d") player.gain(card, "gain2");
- }
- },
- },
- //杜畿
- reandong: {
- audio: 2,
- trigger: { player: "damageBegin2" },
- filter: function (event, player) {
- return event.source && event.source.isIn();
- },
- logTarget: "source",
- content: function () {
- "step 0";
- var target = trigger.source,
- str = get.translation(player);
- var bool = player.storage.reandong;
- if (bool) str = "自己";
- var choiceList = [
- "防止" +
- str +
- "即将受到的伤害,且本回合内红桃牌不计入" +
- (bool ? get.translation(target) : "自己") +
- "的手牌上限。",
- ];
- if (!target.countCards("h"))
- choiceList.push("令" + str + "下次发动〖安东〗时改为自行选择");
- else choiceList.push("令" + str + "观看你的手牌并获得所有红桃牌");
- if (bool) {
- delete player.storage.reandong;
- player
- .chooseControl()
- .set("choiceList", choiceList)
- .set("prompt", "安东:请选择一项");
- } else {
- target
- .chooseControl()
- .set("choiceList", choiceList)
- .set("prompt", "安东:请选择一项")
- .set("ai", function (event, player) {
- var target = _status.event.getParent().player;
- var player = _status.event.player;
- if (get.attitude(player, target) > 0) return 0;
- return 1;
- });
- }
- "step 1";
- var target = trigger.source;
- if (result.index == 0) {
- target.addTempSkill("reandong_ignore");
- trigger.cancel();
- game.delayx();
- } else {
- if (!target.countCards("h")) {
- player.storage.reandong = true;
- game.delayx();
- } else {
- player.viewHandcards(target);
- var cards = target.getCards("h", function (card) {
- return get.suit(card, target) == "heart";
- });
- if (cards.length > 0) player.gain(cards, target, "give", "bySelf");
- }
- }
- },
- ai: {
- maixie: true,
- effect: {
- target: function (card, player, target) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -1];
- if (
- get.tag(card, "damage") &&
- player != target &&
- get.attitude(player, target) < 0
- ) {
- var cards = player.getCards("h", function (cardx) {
- return (
- card != cardx &&
- (!card.cards || !card.cards.includes(cardx)) &&
- get.suit(cardx) == "heart"
- );
- });
- if (!cards.length) return;
- for (var i of cards) {
- if (get.name(i, target) == "tao") return "zeroplayertarget";
- }
- if (get.value(cards, target) >= 6 + target.getDamagedHp())
- return "zeroplayertarget";
- return [1, 0.6];
- }
- },
- },
- },
- subSkill: {
- ignore: {
- mod: {
- ignoredHandcard: function (card, player) {
- if (get.suit(card) == "heart") {
- return true;
- }
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && get.suit(card) == "heart") return false;
- },
- },
- charlotte: true,
- marktext: "♥",
- intro: "红桃牌于本回合内不计入手牌上限",
- },
- },
- },
- reyingshi: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- filter: function (event, player) {
- return player.countCards("h") > 0 && game.countPlayer() > 1;
- },
- content: function () {
- "step 0";
- player.chooseCardTarget({
- prompt: get.prompt("reyingshi"),
- prompt2:
- "操作提示:选择一张作为赏金的手牌,然后选择作为赏金猎人的角色A和作为出杀目标的其他角色B",
- filterCard: true,
- selectTarget: 2,
- position: "h",
- filterTarget: function (card, player, target) {
- if (!ui.selected.targets.length) return true;
- return target != player;
- },
- complexTarget: true,
- targetprompt: ["出杀", "被杀"],
- complexSelect: true,
- ai1: function (card) {
- return 1 / Math.max(1, get.value(card));
- },
- ai2: function (target) {
- var player = _status.event.player;
- if (!ui.selected.targets.length) {
- var att = get.attitude(player, target);
- if (att < 0) return 0;
- if (target.hasSha())
- return (
- Math.pow(target.countCards("h") + 1, 1.1) * (player == target ? 3 : 1)
- );
- return Math.sqrt(1 + target.countCards("h"));
- }
- return get.effect(target, { name: "sha" }, ui.selected.targets[0], player);
- },
- });
- "step 1";
- if (result.bool) {
- var targets = result.targets;
- event.targets = targets;
- player.logSkill("reyingshi", targets[1]);
- var card = result.cards[0];
- event.card = card;
- player.showCards(
- card,
- get.translation(player) + "对" + get.translation(targets[1]) + "发动了【应势】"
- );
- player.line(targets[0], "fire");
- } else event.finish();
- "step 2";
- var next = targets[0].chooseToUse(function (card, player, event) {
- if (get.name(card) != "sha") return false;
- return (
- lib.filter.cardEnabled.apply(this, arguments) &&
- lib.filter.targetEnabled(card, player, (event || _status.event).sourcex)
- );
- }, "###是否对" +
- get.translation(targets[1]) +
- "使用一张【杀】?###若选择使用,则获得赏金(" +
- get.translation(card) +
- ")。若造成伤害,则再从牌堆中获得与此牌花色点数相同的牌作为额外赏金。");
- next.set("addCount", false);
- next.set("complexSelect", true);
- next.set("filterTarget", function (card, player, target) {
- if (
- target != _status.event.sourcex &&
- !ui.selected.targets.includes(_status.event.sourcex)
- )
- return false;
- return lib.filter.targetEnabled.apply(this, arguments);
- });
- next.set("sourcex", targets[1]);
- "step 3";
- var target = targets[0];
- if (result.bool && target.isIn()) {
- var cards = [],
- slice = 0;
- if (player != target && player.getCards("h").includes(card)) {
- cards.push(card);
- slice++;
- }
- if (
- target.hasHistory("useCard", function (evt) {
- if (evt.getParent(2) != event) return false;
- return target.hasHistory("sourceDamage", function (evtx) {
- return evtx.card == evt.card;
- });
- })
- ) {
- var suit = get.suit(card),
- number = get.number(card);
- for (var i = 0; i < ui.cardPile.childNodes.length; i++) {
- var card = ui.cardPile.childNodes[i];
- if (card.suit == suit && card.number == number) cards.push(card);
- }
- if (cards.length > 0) {
- if (!slice) target.gain(cards, "gain2");
- else {
- setTimeout(function () {
- target.$gain2(cards.slice(slice), true);
- }, get.delayx(200, 200));
- target.gain(cards, player, "give");
- }
- }
- } else {
- if (cards.length > 0) target.gain(cards, player, "give");
- }
- }
- },
- },
- //十周年沮授
- dcshibei: {
- trigger: { player: "damageEnd" },
- forced: true,
- audio: 2,
- check: function (event, player) {
- return player.getHistory("damage").indexOf(event) == 0;
- },
- filter: function (event, player) {
- var index = player.getHistory("damage").indexOf(event);
- return index == 0 || index == 1;
- },
- content: function () {
- if (player.getHistory("damage").indexOf(trigger) > 0) {
- player.loseHp();
- } else {
- player.recover();
- }
- },
- subSkill: {
- damaged: {},
- ai: {},
- },
- ai: {
- maixie_defend: true,
- threaten: 0.9,
- effect: {
- target: function (card, player, target) {
- if (player.hasSkillTag("jueqing")) return;
- if (target.hujia) return;
- if (player._shibei_tmp) return;
- if (target.hasSkill("shibei_ai")) return;
- if (
- _status.event.getParent("useCard", true) ||
- _status.event.getParent("_wuxie", true)
- )
- return;
- if (get.tag(card, "damage")) {
- if (target.getHistory("damage").length > 0) {
- return [1, -2];
- } else {
- if (get.attitude(player, target) > 0 && target.hp > 1) {
- return 0;
- }
- if (
- get.attitude(player, target) < 0 &&
- !player.hasSkillTag("damageBonus", "e", {
- target: target,
- card: card,
- })
- ) {
- if (card.name == "sha") return;
- var sha = false;
- player._shibei_tmp = true;
- var num = player.countCards("h", function (card) {
- if (card.name == "sha") {
- if (sha) {
- return false;
- } else {
- sha = true;
- }
- }
- return (
- get.tag(card, "damage") &&
- player.canUse(card, target) &&
- get.effect(target, card, player, player) > 0
- );
- });
- delete player._shibei_tmp;
- if (player.hasSkillTag("damage")) {
- num++;
- }
- if (num < 2) {
- var enemies = player.getEnemies();
- if (
- enemies.length == 1 &&
- enemies[0] == target &&
- player.needsToDiscard()
- ) {
- return;
- }
- return 0;
- }
- }
- }
- }
- },
- },
- },
- },
- dcjianying: {
- audio: 2,
- locked: false,
- mod: {
- aiOrder: function (player, card, num) {
- if (typeof card == "object" && player.isPhaseUsing()) {
- var evt = lib.skill.dcjianying.getLastUsed(player);
- if (
- evt &&
- evt.card &&
- ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) ||
- (evt.card.number && evt.card.number == get.number(card)))
- ) {
- return num + 10;
- }
- }
- },
- },
- trigger: { player: "useCard" },
- frequent: true,
- getLastUsed: function (player, event) {
- var history = player.getAllHistory("useCard");
- var index;
- if (event) index = history.indexOf(event) - 1;
- else index = history.length - 1;
- if (index >= 0) return history[index];
- return false;
- },
- filter: function (event, player) {
- var evt = lib.skill.dcjianying.getLastUsed(player, event);
- if (!evt || !evt.card) return false;
- return (
- (lib.suit.includes(get.suit(evt.card)) &&
- get.suit(evt.card) == get.suit(event.card)) ||
- (typeof get.number(evt.card, false) == "number" &&
- get.number(evt.card, false) == get.number(event.card))
- );
- },
- content: function () {
- player.draw();
- },
- group: "dcjianying_mark",
- init: function (player) {
- var history = player.getAllHistory("useCard");
- if (history.length) {
- var trigger = history[history.length - 1];
- if (
- get.suit(trigger.card, player) == "none" ||
- typeof get.number(trigger.card, player) != "number"
- )
- return;
- player.storage.dcjianying_mark = trigger.card;
- player.markSkill("dcjianying_mark");
- game.broadcastAll(
- function (player, suit) {
- if (player.marks.dcjianying_mark)
- player.marks.dcjianying_mark.firstChild.innerHTML = get.translation(suit);
- },
- player,
- get.suit(trigger.card, player)
- );
- }
- },
- onremove: function (player) {
- player.unmarkSkill("dcjianying_mark");
- delete player.storage.dcjianying_mark;
- },
- subSkill: {
- mark: {
- charlotte: true,
- trigger: { player: "useCard1" },
- forced: true,
- popup: false,
- firstDo: true,
- content: function () {
- if (
- get.suit(trigger.card, player) == "none" ||
- typeof get.number(trigger.card, player) != "number"
- )
- player.unmarkSkill("dcjianying_mark");
- else {
- player.storage.dcjianying_mark = trigger.card;
- player.markSkill("dcjianying_mark");
- game.broadcastAll(
- function (player, suit) {
- if (player.marks.dcjianying_mark)
- player.marks.dcjianying_mark.firstChild.innerHTML =
- get.translation(suit);
- },
- player,
- get.suit(trigger.card, player)
- );
- }
- },
- intro: {
- markcount: function (card, player) {
- var num = get.number(card, player);
- var list = [1, 11, 12, 13];
- if (list.includes(num)) return ["A", "J", "Q", "K"][list.indexOf(num)];
- return parseFloat(num);
- },
- content: function (card, player) {
- var suit = get.suit(card, player);
- var num = get.number(card, player);
- var str = "上一张牌的花色:" + get.translation(suit);
- str += "
上一张牌的点数:";
- var list = [1, 11, 12, 13];
- if (list.includes(num))
- str += ["A(1)", "J(11)", "Q(12)", "K(13)"][list.indexOf(num)];
- else str += parseFloat(num);
- return str;
- },
- },
- },
- },
- },
- //十周年步练师
- dcanxu: {
- enable: "phaseUse",
- usable: 1,
- multitarget: true,
- audio: 2,
- filterTarget: function (card, player, target) {
- if (player == target) return false;
- var num = target.countCards("h");
- if (ui.selected.targets.length) {
- return num < ui.selected.targets[0].countCards("h");
- }
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (num > players[i].countCards("h")) return true;
- }
- return false;
- },
- selectTarget: 2,
- content: function () {
- "step 0";
- var gainner, giver;
- if (targets[0].countCards("h") < targets[1].countCards("h")) {
- gainner = targets[0];
- giver = targets[1];
- } else {
- gainner = targets[1];
- giver = targets[0];
- }
- gainner.gainPlayerCard(giver, true, "h", "visibleMove");
- event.gainner = gainner;
- event.giver = giver;
- "step 1";
- if (result.cards) {
- var card = result.cards[0];
- if (
- event.gainner.getCards("h").includes(card) &&
- get.suit(card, event.gainner) != "spade"
- )
- player.draw();
- }
- if (event.gainner.countCards("h") == event.giver.countCards("h")) player.recover();
- },
- ai: {
- order: 10.5,
- threaten: 2.3,
- result: {
- target: function (player, target) {
- var num = target.countCards("h");
- var att = get.attitude(player, target);
- if (ui.selected.targets.length == 0) {
- if (att > 0) return -1;
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- var num2 = players[i].countCards("h");
- var att2 = get.attitude(player, players[i]);
- if (num2 < num) {
- if (att2 > 0) return -3;
- return -1;
- }
- }
- return 0;
- } else {
- return 1;
- }
- },
- player: 1,
- },
- },
- },
- dczhuiyi: {
- audio: 2,
- trigger: { player: "die" },
- direct: true,
- skillAnimation: true,
- animationColor: "wood",
- forceDie: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt2("dczhuiyi"), function (card, player, target) {
- return player != target && _status.event.sourcex != target;
- })
- .set("forceDie", true)
- .set("ai", function (target) {
- var num = get.attitude(_status.event.player, target);
- if (num > 0) {
- if (target.hp == 1) {
- num += 2;
- }
- if (target.hp < target.maxHp) {
- num += 2;
- }
- }
- return num;
- })
- .set("sourcex", trigger.source);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dczhuiyi", target);
- player.line(target, "green");
- target.recover();
- target.draw(game.countPlayer());
- }
- },
- ai: {
- expose: 0.5,
- },
- },
- //OL界蔡文姬
- olbeige: {
- audio: "beige",
- audioname: ["ol_caiwenji"],
- trigger: { global: "damageEnd" },
- logTarget: "player",
- filter: function (event, player) {
- return (
- event.card &&
- event.card.name == "sha" &&
- event.player.isIn() &&
- player.countCards("he") > 0
- );
- },
- check: function (event, player) {
- let att = get.attitude(player, event.player);
- if (event.player.hasSkill("xinleiji")) return att > 0;
- if (att > 0 || event.player.isHealthy()) return true;
- if (!event.source) return true;
- att = get.attitude(player, event.source);
- return att <= 0 || event.source.isTurnedOver();
- },
- prompt2: "令其进行判定,然后你可根据判定结果,弃置一张牌并令其执行对应效果。",
- content: function () {
- "step 0";
- event.target = trigger.player;
- event.source = trigger.source;
- trigger.player.judge();
- "step 1";
- event.judgeResult = get.copy(result);
- var str = "是否弃置一张牌",
- strt = get.translation(target),
- strs = get.translation(source),
- goon = 0;
- switch (result.suit) {
- case "heart":
- if (target.isIn() && target.isDamaged()) {
- str += ",令" + strt + "回复1点体力";
- goon = get.recoverEffect(target, player, player);
- }
- break;
- case "diamond":
- if (target.isIn()) {
- str += ",令" + strt + "摸两张牌";
- goon = 2 * get.effect(target, { name: "draw" }, player, player);
- }
- break;
- case "spade":
- if (source && source.isIn()) {
- str += ",令" + strs + "翻" + (source.isTurnedOver() ? "回正" : "") + "面";
- goon = get.attitude(player, source) * (source.isTurnedOver() ? 2 : -2);
- }
- break;
- case "club":
- if (source && source.isIn()) {
- str += ",令" + strs + "弃置两张牌";
- var cards = source
- .getCards("he")
- .sort(function (a, b) {
- return get.value(a, source) - get.value(b, source);
- })
- .slice(0, 2);
- for (var i of cards) goon += get.value(i, source);
- goon *= -get.sgn(get.attitude(player, source));
- }
- break;
- }
- str += "?";
- var str2 = "若弃置点数为" + get.strNumber(result.number) + "的牌则收回自己弃置的牌";
- if (get.position(result.card, true) == "d") {
- str2 +=
- ";若弃置花色为" +
- get.translation(result.suit) +
- "的牌则获得" +
- get.translation(result.card);
- }
- player
- .chooseToDiscard("he", str, str2)
- .set("goon", goon)
- .set("ai", function (card) {
- var goon = _status.event.goon;
- var player = _status.event.player;
- var result = _status.event.getParent().judgeResult;
- var eff = Math.min(7, goon);
- if (eff <= 0) return 0;
- if (get.suit(card, player) == result.suit) eff += get.value(result.card, player);
- if (get.number(card, player) == result.number) return eff;
- return eff - get.value(card);
- });
- "step 2";
- if (result.bool) {
- event.card = result.cards[0];
- switch (event.judgeResult.suit) {
- case "heart":
- if (target.isIn() && target.isDamaged()) target.recover();
- break;
- case "diamond":
- if (target.isIn()) target.draw(2);
- break;
- case "spade":
- if (source && source.isIn()) source.turnOver();
- player.addExpose(0.1);
- break;
- case "club":
- if (source && source.isIn() && source.countCards("he") > 0)
- source.chooseToDiscard(2, "he", true);
- player.addExpose(0.1);
- break;
- }
- } else event.finish();
- "step 3";
- var gains = [];
- if (
- get.position(event.judgeResult.card, true) == "d" &&
- get.suit(card, player) == event.judgeResult.suit
- )
- gains.push(event.judgeResult.card);
- if (
- get.position(card, true) == "d" &&
- get.number(card, player) == event.judgeResult.number
- )
- gains.push(card);
- if (gains.length) player.gain(gains, "gain2");
- },
- },
- //OL界张郃
- reqiaobian: {
- audio: 2,
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return event.name != "phase" || game.phaseNumber == 0;
- },
- content: function () {
- player.addMark("reqiaobian", 2);
- game.delayx();
- },
- marktext: "变",
- intro: {
- name2: "变",
- content: function (storage, player) {
- var str = "共有" + (storage || 0) + "个标记";
- if (player.storage.reqiaobian_jieshu) {
- str =
- "" +
- str +
- "
已记录手牌数:" +
- get.translation(player.storage.reqiaobian_jieshu);
- }
- return str;
- },
- },
- group: [
- "reqiaobian_judge",
- "reqiaobian_draw",
- "reqiaobian_use",
- "reqiaobian_discard",
- "reqiaobian_jieshu",
- ],
- subSkill: {
- judge: {
- audio: "reqiaobian",
- trigger: { player: "phaseJudgeBefore" },
- direct: true,
- filter: function (event, player) {
- return (
- player.hasMark("reqiaobian") ||
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"),
- "he"
- )
- );
- },
- check: function (event, player) {
- return player.hasCard(function (card) {
- return (
- get.effect(
- player,
- {
- name: card.viewAs || card.name,
- cards: [card],
- },
- player,
- player
- ) < 0
- );
- }, "j");
- },
- content: function () {
- "step 0";
- var choices = [];
- if (player.hasMark("reqiaobian")) choices.push("弃置标记");
- if (
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"),
- "he"
- )
- )
- choices.push("弃置牌");
- choices.push("cancel2");
- player
- .chooseControl(choices)
- .set("prompt", "巧变:是否跳过判定阶段?")
- .set("ai", function () {
- var evt = _status.event;
- if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player))
- return 0;
- return "cancel2";
- });
- "step 1";
- if (result.control != "cancel2") {
- if (result.control == "弃置牌") {
- player.chooseToDiscard("he", true).logSkill = event.name;
- } else {
- player.logSkill(event.name);
- player.removeMark("reqiaobian", 1);
- }
- } else event.finish();
- "step 2";
- trigger.cancel();
- },
- },
- draw: {
- audio: "reqiaobian",
- trigger: { player: "phaseDrawBefore" },
- direct: true,
- filter: function (event, player) {
- return (
- player.hasMark("reqiaobian") ||
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"),
- "he"
- )
- );
- },
- check: function (event, player) {
- return (
- game.countPlayer(function (current) {
- if (current == player || current.countGainableCards(player, "h") == 0)
- return false;
- var att = get.attitude(player, current);
- if (current.hasSkill("tuntian")) return att > 0;
- return att < 1;
- }) > 1
- );
- },
- content: function () {
- "step 0";
- var choices = [];
- if (player.hasMark("reqiaobian")) choices.push("弃置标记");
- if (
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_draw"),
- "he"
- )
- )
- choices.push("弃置牌");
- choices.push("cancel2");
- player
- .chooseControl(choices)
- .set("prompt", "巧变:是否跳过摸牌阶段?")
- .set("ai", function () {
- var evt = _status.event;
- if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player))
- return 0;
- return "cancel2";
- });
- "step 1";
- if (result.control != "cancel2") {
- if (result.control == "弃置牌") {
- player.chooseToDiscard("he", true).logSkill = event.name;
- } else {
- player.logSkill(event.name);
- player.removeMark("reqiaobian", 1);
- }
- } else event.finish();
- "step 2";
- trigger.cancel();
- if (game.hasPlayer((current) => current.countGainableCards(player, "h") > 0)) {
- player
- .chooseTarget(
- "是否获得至多两名其他角色的各一张手牌?",
- [1, 2],
- function (card, player, target) {
- return (
- target != player && target.countGainableCards(player, "h") > 0
- );
- }
- )
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- if (target.hasSkill("tuntian")) return att / 10;
- return 1 - att;
- });
- } else event.finish();
- "step 3";
- if (result.bool) {
- var targets = result.targets.sortBySeat();
- player.line(targets, "green");
- player.gainMultiple(targets);
- }
- },
- },
- use: {
- audio: "reqiaobian",
- trigger: { player: "phaseUseBefore" },
- direct: true,
- filter: function (event, player) {
- return (
- player.hasMark("reqiaobian") ||
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"),
- "he"
- )
- );
- },
- check: function (event, player) {
- if (
- player.countCards("h", function (card) {
- return player.hasValueTarget(card, null, true);
- }) > 1
- )
- return false;
- return game.hasPlayer(function (current) {
- var att = get.sgn(get.attitude(player, current));
- if (att != 0) {
- var es = current.getCards("e");
- for (var i = 0; i < es.length; i++) {
- if (
- game.hasPlayer(function (current2) {
- if (
- get.sgn(get.value(es[i], current)) != -att ||
- get.value(es[i], current) < 5
- )
- return false;
- var att2 = get.sgn(get.attitude(player, current2));
- if (
- att == att2 ||
- att2 !=
- get.sgn(get.effect(current2, es[i], player, current2))
- )
- return false;
- return (
- current != current2 &&
- !current2.isMin() &&
- current2.canEquip(es[i])
- );
- })
- ) {
- return true;
- }
- }
- }
- if (att > 0) {
- var js = current.getCards("j", function (card) {
- return (
- get.effect(
- current,
- {
- name: card.viewAs || card.name,
- cards: [card],
- },
- current,
- current
- ) < -2
- );
- });
- for (var i = 0; i < js.length; i++) {
- if (
- game.hasPlayer(function (current2) {
- var att2 = get.attitude(player, current2);
- if (att2 >= 0) return false;
- return current != current2 && current2.canAddJudge(js[i]);
- })
- ) {
- return true;
- }
- }
- }
- });
- },
- content: function () {
- "step 0";
- var choices = [];
- if (player.hasMark("reqiaobian")) choices.push("弃置标记");
- if (
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_use"),
- "he"
- )
- )
- choices.push("弃置牌");
- choices.push("cancel2");
- player
- .chooseControl(choices)
- .set("prompt", "巧变:是否跳过出牌阶段?")
- .set("ai", function () {
- var evt = _status.event;
- if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player))
- return 0;
- return "cancel2";
- });
- "step 1";
- if (result.control != "cancel2") {
- if (result.control == "弃置牌") {
- player.chooseToDiscard("he", true).logSkill = event.name;
- } else {
- player.logSkill(event.name);
- player.removeMark("reqiaobian", 1);
- }
- } else event.finish();
- "step 2";
- trigger.cancel();
- player.moveCard();
- },
- },
- discard: {
- audio: "reqiaobian",
- trigger: { player: "phaseDiscardBefore" },
- direct: true,
- filter: function (event, player) {
- return (
- player.hasMark("reqiaobian") ||
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_judge"),
- "he"
- )
- );
- },
- check: function (event, player) {
- return player.needsToDiscard();
- },
- content: function () {
- "step 0";
- var choices = [];
- if (player.hasMark("reqiaobian")) choices.push("弃置标记");
- if (
- player.hasCard(
- (card) => lib.filter.cardDiscardable(card, player, "reqiaobian_discard"),
- "he"
- )
- )
- choices.push("弃置牌");
- choices.push("cancel2");
- player
- .chooseControl(choices)
- .set("prompt", "巧变:是否跳过弃牌阶段?")
- .set("ai", function () {
- var evt = _status.event;
- if (lib.skill[evt.getParent().name].check(evt.getTrigger(), evt.player))
- return 0;
- return "cancel2";
- });
- "step 1";
- if (result.control != "cancel2") {
- if (result.control == "弃置牌") {
- player.chooseToDiscard("he", true).logSkill = event.name;
- } else {
- player.logSkill(event.name);
- player.removeMark("reqiaobian", 1);
- }
- } else event.finish();
- "step 2";
- trigger.cancel();
- },
- },
- jieshu: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- forced: true,
- filter: function (event, player) {
- return !player.getStorage("reqiaobian_jieshu").includes(player.countCards("h"));
- },
- content: function () {
- player.addMark("reqiaobian", 1);
- player.markAuto("reqiaobian_jieshu", [player.countCards("h")]);
- player.storage.reqiaobian_jieshu.sort();
- },
- },
- },
- },
- //十周年徐庶
- rezhuhai: {
- audio: 2,
- trigger: { global: "phaseJieshuBegin" },
- direct: true,
- filter: function (event, player) {
- return (
- player != event.player &&
- event.player.getHistory("sourceDamage").length > 0 &&
- event.player.isIn() &&
- (player.countCards("h") > 0 || player.canUse("guohe", event.player))
- );
- },
- content: function () {
- "step 0";
- var target = trigger.player;
- var choiceList = ["将一张手牌当做【杀】对其使用", "视为对其使用一张【过河拆桥】"];
- var bool = false,
- hs = player.getCards("h");
- for (var i of hs) {
- if (
- game.checkMod(i, player, "unchanged", "cardEnabled2", player) !== false &&
- player.canUse(get.autoViewAs({ name: "sha" }, [i]), target, false)
- ) {
- bool = true;
- break;
- }
- }
- var choices = [];
- if (bool) choices.push("选项一");
- else choiceList[0] = '' + choiceList[0] + "";
- if (player.canUse("guohe", target)) choices.push("选项二");
- else choiceList[1] = '' + choiceList[1] + "";
- choices.push("cancel2");
- player
- .chooseControl(choices)
- .set("choiceList", choiceList)
- .set("prompt", get.prompt("rezhuhai", target))
- .set("ai", function () {
- var choices = _status.event.controls;
- var eff1 = 0,
- eff2 = 0;
- var player = _status.event.player,
- target = _status.event.getTrigger().player;
- if (choices.includes("选项一"))
- eff1 = get.effect(target, { name: "sha" }, player, player);
- if (choices.includes("选项二"))
- eff2 = get.effect(target, { name: "guohe" }, player, player);
- if (
- eff1 > 0 &&
- ((player.hasSkill("xsqianxin") && player.isDamaged()) || eff1 > eff2)
- )
- return "选项一";
- if (eff2 > 0) return "选项二";
- return "cancel2";
- });
- "step 1";
- if (result.control != "cancel2") {
- if (result.control == "选项一") {
- player
- .chooseCard(
- "h",
- true,
- function (card, player) {
- if (!game.checkMod(card, player, "unchanged", "cardEnabled2", player))
- return false;
- return player.canUse(
- get.autoViewAs({ name: "sha" }, [card]),
- _status.event.getTrigger().player,
- false
- );
- },
- "选择一张手牌当做【杀】对" + get.translation(trigger.player) + "使用"
- )
- .set("ai", function (card) {
- var player = _status.event.player;
- return (
- get.effect(
- _status.event.getTrigger().player,
- get.autoViewAs({ name: "sha" }, [card]),
- player,
- player
- ) / Math.max(1, get.value(card))
- );
- });
- } else {
- player.useCard({ name: "guohe", isCard: true }, trigger.player, "rezhuhai");
- event.finish();
- }
- } else event.finish();
- "step 2";
- if (result.bool) {
- player.useCard({ name: "sha" }, result.cards, "rezhuhai", trigger.player, false);
- }
- },
- },
- xsqianxin: {
- trigger: { source: "damageSource" },
- juexingji: true,
- forced: true,
- skillAnimation: true,
- animationColor: "orange",
- filter: function (event, player) {
- return player.isDamaged();
- },
- content: function () {
- player.awakenSkill("xsqianxin");
- player.loseMaxHp();
- player.addSkills("rejianyan");
- },
- derivation: "rejianyan",
- },
- rejianyan: {
- audio: 2,
- enable: "phaseUse",
- usable: 2,
- filter: function (event, player) {
- return game.hasPlayer((current) => current.group == "key" || current.hasSex("male"));
- },
- chooseButton: {
- dialog: function () {
- return ui.create.dialog("###荐言###" + get.translation("rejianyan_info"));
- },
- chooseControl: function (event, player) {
- var list = [];
- if (!player.hasSkill("rejianyan_color")) list.addArray(["red", "black"]);
- if (!player.hasSkill("rejianyan_type")) list.addArray(["basic", "trick", "equip"]);
- list.push("cancel2");
- return list;
- },
- check: function () {
- if (!_status.event.player.hasSkill("rejianyan_color")) return "red";
- return "trick";
- },
- backup: function (result, player) {
- return {
- audio: "rejianyan",
- filterCard: () => false,
- selectCard: -1,
- info: result.control,
- content: function () {
- "step 0";
- var card = false,
- info = lib.skill.rejianyan_backup.info;
- if (info == "red" || info == "black") {
- player.addTempSkill("rejianyan_color", "phaseUseEnd");
- card = get.cardPile2(function (card) {
- return get.color(card) == info;
- });
- } else {
- player.addTempSkill("rejianyan_type", "phaseUseEnd");
- card = get.cardPile2(function (card) {
- return get.type(card) == info;
- });
- }
- if (card) {
- event.card = card;
- player.showCards(card, get.translation(player) + "发动了【荐言】");
- } else event.finish();
- "step 1";
- player
- .chooseTarget(
- true,
- "选择一名角色获得" + get.translation(card),
- function (card, player, target) {
- return target.group == "key" || target.hasSex("male");
- }
- )
- .set("ai", function (target) {
- var player = _status.event.player,
- att = get.attitude(player, target);
- if (target.hasSkill("nogain")) att /= 10;
- return att / Math.sqrt(get.distance(player, target, "absolute"));
- });
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.gain(card, "gain2");
- }
- },
- ai: { result: { player: 1 } },
- };
- },
- },
- ai: {
- order: 8,
- result: {
- player: function (player, target) {
- if (
- game.hasPlayer(
- (current) =>
- (current.group == "key" || current.hasSex("male")) &&
- get.attitude(player, current) > 0
- )
- )
- return 1;
- return 0;
- },
- },
- },
- subSkill: { type: {}, color: {}, backup: {} },
- },
- //野兽高顺
- decadexianzhen: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: function (card, player, target) {
- return player.canCompare(target);
- },
- filter: function (event, player) {
- return (
- player.countCards("h") > 0 &&
- !player.hasSkill("decadexianzhen2") &&
- !player.hasSkill("decadexianzhen3")
- );
- },
- content: function () {
- "step 0";
- player.chooseToCompare(target);
- "step 1";
- if (result.bool) {
- player.storage.decadexianzhen2 = target;
- player.addTempSkill("decadexianzhen2");
- } else {
- player.addTempSkill("decadexianzhen3");
- }
- },
- ai: {
- order: function (name, player) {
- var cards = player.getCards("h");
- if (player.countCards("h", "sha") == 0) {
- return 1;
- }
- for (var i = 0; i < cards.length; i++) {
- if (
- cards[i].name != "sha" &&
- get.number(cards[i]) > 11 &&
- get.value(cards[i]) < 7
- ) {
- return 9;
- }
- }
- return get.order({ name: "sha" }) - 1;
- },
- result: {
- player: function (player) {
- if (player.countCards("h", "sha") > 0) return 0;
- var num = player.countCards("h");
- if (num > player.hp) return 0;
- if (num == 1) return -2;
- if (num == 2) return -1;
- return -0.7;
- },
- target: function (player, target) {
- var num = target.countCards("h");
- if (num == 1) return -1;
- if (num == 2) return -0.7;
- return -0.5;
- },
- },
- threaten: 1.3,
- },
- },
- decadexianzhen2: {
- audio: "decadexianzhen",
- charlotte: true,
- onremove: true,
- mod: {
- targetInRange: function (card, player, target) {
- if (target == player.storage.decadexianzhen2) return true;
- },
- cardUsableTarget: function (card, player, target) {
- if (target == player.storage.decadexianzhen2) return true;
- },
- },
- ai: {
- unequip: true,
- skillTagFilter: function (player, tag, arg) {
- if (arg.target != player.storage.decadexianzhen2) return false;
- },
- },
- group: "decadexianzhen2_damage",
- subSkill: {
- damage: {
- audio: "decadexianzhen",
- trigger: { source: "damageBegin1" },
- forced: true,
- filter: function (event, player) {
- return (
- event.card &&
- event.player == player.storage.decadexianzhen2 &&
- !player.hasHistory("custom", function (evt) {
- return evt.name == "decadexianzhen" && evt.cardname == event.card.name;
- })
- );
- },
- logTarget: "player",
- content: function () {
- trigger.num++;
- player.getHistory("custom").push({
- name: "decadexianzhen",
- cardname: trigger.card.name,
- });
- },
- },
- },
- },
- decadexianzhen3: {
- charlotte: true,
- mod: {
- cardEnabled: function (card) {
- if (card.name == "sha") return false;
- },
- ignoredHandcard: function (card, player) {
- if (get.name(card) == "sha") {
- return true;
- }
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && get.name(card) == "sha") {
- return false;
- }
- },
- },
- },
- decadejinjiu: {
- global: "decadejinjiu_global",
- mod: {
- cardname(card) {
- if (card.name == "jiu") return "sha";
- },
- cardnumber(card) {
- if (card.name == "jiu") return 13;
- },
- },
- audio: 2,
- audioname2: {
- ol_gaoshun: "rejinjiu",
- },
- trigger: { player: ["useCard1", "respond"] },
- filter(event, player) {
- return (
- event.card.name == "sha" &&
- !event.skill &&
- event.cards &&
- event.cards.length == 1 &&
- event.cards[0].name == "jiu"
- );
- },
- forced: true,
- firstDo: true,
- content() {},
- subSkill: {
- global: {
- mod: {
- cardEnabled(card, player) {
- if (card.name == "jiu") {
- var source = _status.currentPhase;
- if (source && source != player && source.hasSkill("decadejinjiu"))
- return false;
- }
- },
- cardSavable(card, player) {
- if (card.name == "jiu") {
- var source = _status.currentPhase;
- if (source && source != player && source.hasSkill("decadejinjiu"))
- return false;
- }
- },
- },
- },
- },
- },
- rebotu: {
- audio: "botu",
- trigger: { player: "phaseEnd" },
- frequent: true,
- filter: function (event, player) {
- if (player.countMark("rebotu_count") >= Math.min(3, game.countPlayer())) return false;
- var suits = [];
- game.getGlobalHistory("cardMove", function (evt) {
- if (suits.length >= 4) return;
- if (evt.name == "lose") {
- if (evt.position == ui.discardPile) {
- for (var i of evt.cards) suits.add(get.suit(i, false));
- }
- } else {
- if (evt.name == "cardsDiscard") {
- for (var i of evt.cards) suits.add(get.suit(i, false));
- }
- }
- });
- return suits.length >= 4;
- },
- content: function () {
- player.addTempSkill("rebotu_count", "roundStart");
- player.addMark("rebotu_count", 1, false);
- player.insertPhase();
- },
- group: "rebotu_mark",
- subSkill: {
- count: {
- onremove: true,
- charlotte: true,
- },
- mark: {
- trigger: {
- global: ["loseAfter", "cardsDiscardAfter"],
- player: "phaseAfter",
- },
- forced: true,
- firstDo: true,
- silent: true,
- filter: function (event, player) {
- if (event.name == "phase") return true;
- if (player != _status.currentPhase) return false;
- if (event.name == "lose") return event.position == ui.discardPile;
- return true;
- },
- content: function () {
- if (trigger.name == "phase") {
- player.unmarkSkill("rebotu_mark");
- return;
- }
- var suits = [];
- game.getGlobalHistory("cardMove", function (evt) {
- if (suits.length >= 4) return;
- if (evt.name == "lose") {
- if (evt.position == ui.discardPile) {
- for (var i of evt.cards) suits.add(get.suit(i, false));
- }
- } else {
- if (evt.name == "cardsDiscard") {
- for (var i of evt.cards) suits.add(get.suit(i, false));
- }
- }
- });
- player.storage.rebotu_mark = suits;
- player.markSkill("rebotu_mark");
- },
- intro: {
- onunmark: true,
- content: "本回合已有$花色的牌进入过弃牌堆",
- },
- },
- },
- },
- xinganlu: {
- enable: "phaseUse",
- usable: 1,
- audio: 2,
- selectTarget: 2,
- delay: 0,
- filterTarget: function (card, player, target) {
- if (target.isMin()) return false;
- if (ui.selected.targets.length == 0) return true;
- if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0)
- return false;
- return true;
- },
- multitarget: true,
- multiline: true,
- content: function () {
- "step 0";
- targets[0].swapEquip(targets[1]);
- "step 1";
- game.delayx();
- var num = Math.abs(targets[0].countCards("e") - targets[1].countCards("e"));
- if (num > player.getDamagedHp()) player.chooseToDiscard("h", 2, true);
- },
- ai: {
- order: 10,
- expose: 0.2,
- threaten: function (player, target) {
- return 0.8 * Math.max(1 + target.maxHp - target.hp);
- },
- result: {
- target: function (player, target) {
- if (!ui.selected.targets.length) return -get.value(target.getCards("e"), target);
- var target2 = ui.selected.targets[0];
- var eff_target =
- get.value(target2.getCards("e"), target) -
- get.value(target.getCards("e"), target);
- if (get.sgn(eff_target) == get.sgn(-get.value(target2.getCards("e"), target2)))
- return 0;
- return eff_target;
- },
- },
- },
- },
- xinbuyi: {
- audio: 2,
- trigger: { global: "dying" },
- filter: function (event, player) {
- return event.player.countCards("h") > 0;
- },
- check: function (event, player) {
- return get.attitude(player, event.player) > 0;
- },
- content: function () {
- "step 0";
- if (player == trigger.player)
- player.chooseCard("h", true).set("ai", function (card) {
- if (get.type(card) != "basic") return 100 - get.value(card);
- return 0;
- });
- else player.choosePlayerCard("h", trigger.player, true);
- "step 1";
- var card = result.cards[0],
- target = trigger.player;
- player.showCards(
- card,
- get.translation(player) +
- "对" +
- (player == target ? "自己" : get.translation(target)) +
- "发动了【补益】"
- );
- if (get.type(card, target) != "basic") {
- target.discard(card);
- target.recover();
- if (target.countCards("h") == 1) target.draw();
- }
- },
- logTarget: "player",
- },
- rejiaozhao: {
- audio: 2,
- enable: "phaseUse",
- group: "rejiaozhao_base",
- locked: false,
- mod: {
- targetEnabled: function (card, player, target) {
- if (player == target && card.storage && card.storage.rejiaozhao) return false;
- },
- },
- filter: function (event, player) {
- return (
- player.hasMark("redanxin") &&
- player.countCards("h") &&
- player.getStorage("rejiaozhao_clear").length < player.countMark("redanxin")
- );
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = [],
- storage = player.getStorage("rejiaozhao_clear");
- for (var name of lib.inpile) {
- var type = get.type(name);
- if ((type == "basic" || type == "trick") && !storage.includes(type)) {
- list.push([type, "", name]);
- if (name == "sha") {
- for (var nature of lib.inpile_nature) list.push([type, "", name, nature]);
- }
- }
- }
- return ui.create.dialog("矫诏", [list, "vcard"]);
- },
- filter: function (button, player) {
- var card = { name: button.link[2], nature: button.link[3] };
- if (player.countMark("redanxin") < 2) card.storage = { rejiaozhao: true };
- var evt = _status.event.getParent();
- return evt.filterCard(card, player, evt);
- },
- check: function (button) {
- var card = { name: button.link[2], nature: button.link[3] },
- player = _status.event.player;
- if (player.countMark("redanxin") < 2) card.storage = { rejiaozhao: true };
- return player.getUseValue(card, null, true);
- },
- backup: function (links, player) {
- var next = {
- audio: "redanxin",
- viewAs: { name: links[0][2], nature: links[0][3] },
- filterCard: true,
- position: "h",
- popname: true,
- ai1: (card) => 8 - get.value(card),
- onuse: function (result, player) {
- player.addTempSkill("rejiaozhao_clear", "phaseUseAfter");
- player.markAuto("rejiaozhao_clear", [get.type(result.card)]);
- },
- };
- if (player.countMark("redanxin") < 2) next.viewAs.storage = { rejiaozhao: true };
- return next;
- },
- prompt: function (links) {
- return (
- "将一张手牌当做" +
- (get.translation(links[0][3]) || "") +
- get.translation(links[0][2]) +
- "使用"
- );
- },
- },
- ai: {
- order: 6,
- result: {
- player: 1,
- },
- },
- derivation: ["rejiaozhao_lv2", "rejiaozhao_lv3"],
- subSkill: {
- clear: { onremove: true },
- base: {
- audio: "rejiaozhao",
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- if (player.hasMark("redanxin")) return false;
- return (
- player.countCards("h") > 0 && game.hasPlayer((current) => current != player)
- );
- },
- filterCard: true,
- position: "h",
- discard: false,
- lose: false,
- check: function (card) {
- return 1 / Math.max(1, _status.event.player.getUseValue(card));
- },
- prompt: "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。",
- content: function () {
- "step 0";
- player.showCards(cards);
- "step 1";
- var targets = game.filterPlayer();
- targets.remove(player);
- targets.sort(function (a, b) {
- return (
- Math.max(1, get.distance(player, a)) -
- Math.max(1, get.distance(player, b))
- );
- });
- var distance = Math.max(1, get.distance(player, targets[0]));
- for (var i = 1; i < targets.length; i++) {
- if (Math.max(1, get.distance(player, targets[i])) > distance) {
- targets.splice(i);
- break;
- }
- }
- player
- .chooseTarget("请选择【矫诏】的目标", true, function (card, player, target) {
- return _status.event.targets.includes(target);
- })
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- })
- .set("targets", targets);
- "step 2";
- if (!result.bool) {
- event.finish();
- return;
- }
- var target = result.targets[0];
- event.target = target;
- var list = [];
- for (var i = 0; i < lib.inpile.length; i++) {
- var name = lib.inpile[i];
- if (name == "sha") {
- list.push(["基本", "", "sha"]);
- for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]);
- } else if (get.type(name) == "basic") list.push(["基本", "", name]);
- else if (get.type(name) == "trick") list.push(["锦囊", "", name]);
- }
- target
- .chooseButton(["矫诏", [list, "vcard"]], true)
- .set("ai", function (button) {
- var player = _status.event.getParent().player,
- card = {
- name: button.link[2],
- nature: button.link[3],
- storage: {
- rejiaozhao: true,
- },
- };
- return player.getUseValue(card, null, true) * _status.event.att;
- })
- .set("att", get.attitude(event.target, player) > 0 ? 1 : -1);
- "step 3";
- var chosen = result.links[0][2];
- var nature = result.links[0][3];
- var fakecard = {
- name: chosen,
- storage: { rejiaozhao: true },
- };
- if (nature) fakecard.nature = nature;
- event.target.showCards(
- game.createCard({
- name: chosen,
- nature: nature,
- suit: cards[0].suit,
- number: cards[0].number,
- }),
- get.translation(event.target) + "声明了" + get.translation(chosen)
- );
- game.broadcastAll(
- (player, fakecard) => {
- player.storage.rejiaozhao_viewas = fakecard;
- },
- player,
- fakecard
- );
- cards[0].addGaintag("rejiaozhao");
- player.addTempSkill("rejiaozhao_viewas", "phaseUseEnd");
- },
- ai: {
- order: 9,
- result: {
- player: 1,
- },
- },
- },
- backup: { audio: "rejiaozhao" },
- viewas: {
- enable: "phaseUse",
- mod: {
- targetEnabled: function (card, player, target) {
- if (player == target && card.storage && card.storage.rejiaozhao) return false;
- },
- },
- filter: function (event, player) {
- if (!player.storage.rejiaozhao_viewas) return false;
- var cards = player.getCards("h", function (card) {
- return card.hasGaintag("rejiaozhao");
- });
- if (!cards.length) return false;
- if (!game.checkMod(cards[0], player, "unchanged", "cardEnabled2", player))
- return false;
- var card = get.autoViewAs(player.storage.rejiaozhao_viewas, cards);
- return event.filterCard(card, player, event);
- },
- viewAs: function (cards, player) {
- return player.storage.rejiaozhao_viewas;
- },
- filterCard: function (card) {
- return card.hasGaintag("rejiaozhao");
- },
- selectCard: -1,
- position: "h",
- popname: true,
- prompt: function () {
- return (
- "将“矫诏”牌当做" +
- get.translation(_status.event.player.storage.rejiaozhao_viewas) +
- "使用"
- );
- },
- onremove: function (player) {
- player.removeGaintag("rejiaozhao");
- delete player.storage.rejiaozhao_viewas;
- },
- ai: { order: 8 },
- },
- },
- },
- redanxin: {
- audio: 2,
- trigger: { player: "damageEnd" },
- frequent: true,
- content: function () {
- player.draw();
- if (player.countMark("redanxin") < 2) player.addMark("redanxin", 1, false);
- },
- intro: { content: "当前升级等级。:Lv#" },
- ai: {
- maixie: true,
- effect: {
- target: (card, player, target) => {
- if (!get.tag(card, "damage")) return;
- if (target.hp + target.hujia < 2 || player.hasSkillTag("jueqing", false, target))
- return 2;
- if (target.countMark("redanxin") > 1) return [1, 1];
- return [1, 0.8 * target.hp - 0.4];
- },
- },
- },
- },
- //马岱
- reqianxi: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- frequent: true,
- content: function () {
- "step 0";
- player.draw();
- "step 1";
- if (player.hasCard((card) => lib.filter.cardDiscardable(card, player, "reqianxi"), "he"))
- player.chooseToDiscard("he", true);
- else event.finish();
- "step 2";
- if (
- result.bool &&
- game.hasPlayer((current) => current != player && get.distance(player, current) <= 1)
- ) {
- var color = get.color(result.cards[0], player);
- event.color = color;
- color = get.translation(color);
- player
- .chooseTarget(
- true,
- "选择【潜袭】的目标",
- "令其本回合不能使用或打出" +
- color +
- "牌,且" +
- color +
- "防具失效,且回复体力时,你摸两张牌",
- function (card, player, target) {
- return target != player && get.distance(player, target) <= 1;
- }
- )
- .set("ai", function (target) {
- return (
- -get.attitude(_status.event.player, target) *
- Math.sqrt(1 + target.countCards("he"))
- );
- });
- } else event.finish();
- "step 3";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.storage.reqianxi_effect = [event.color, player];
- target.addTempSkill("reqianxi_effect");
- }
- },
- subSkill: {
- effect: {
- mark: true,
- intro: {
- markcount: () => 0,
- content: function (storage, player) {
- var color = get.translation(storage[0]),
- source = get.translation(storage[1]);
- return (
- "本回合不能使用或打出" +
- color +
- "牌,且" +
- color +
- "防具失效,且回复体力时," +
- source +
- "摸两张牌"
- );
- },
- },
- charlotte: true,
- onremove: true,
- mod: {
- cardEnabled2: function (card, player) {
- if (
- get.itemtype(card) == "card" &&
- get.color(card) == player.getStorage("reqianxi_effect")[0]
- )
- return false;
- },
- },
- trigger: { player: "recoverEnd" },
- forced: true,
- popup: false,
- filter: function (event, player) {
- return player.storage.reqianxi_effect && player.storage.reqianxi_effect[1].isIn();
- },
- content: function () {
- var target = player.storage.reqianxi_effect[1];
- target.logSkill("reqianxi", player);
- target.draw(2);
- },
- ai: {
- unequip2: true,
- skillTagFilter: function (player) {
- var evt = _status.event,
- color = player.getStorage("reqianxi_effect")[0];
- if (evt.name == "lose" && evt.loseEquip) {
- var card = evt.cards[evt.num];
- if (
- card &&
- get.subtype(card, false) == "equip2" &&
- get.color(card) == color
- )
- return true;
- return false;
- } else {
- var equip = player.getEquip(2);
- if (equip && get.color(equip) == color) return true;
- return false;
- }
- },
- },
- },
- },
- },
- //徐晃
- olduanliang: {
- audio: 2,
- locked: false,
- enable: "chooseToUse",
- filterCard: function (card) {
- return get.type2(card) != "trick" && get.color(card) == "black";
- },
- filter: function (event, player) {
- return player.hasCard(
- (card) => get.type2(card) != "trick" && get.color(card) == "black",
- "hes"
- );
- },
- position: "hes",
- viewAs: { name: "bingliang" },
- prompt: "将一张黑色非锦囊牌当做兵粮寸断使用",
- check: function (card) {
- return 6 - get.value(card);
- },
- ai: {
- order: 9,
- },
- mod: {
- targetInRange: function (card, player, target) {
- if (card.name == "bingliang" && !player.getStat("damage")) return true;
- },
- },
- },
- oljiezi: {
- audio: 2,
- trigger: { global: ["phaseDrawSkipped", "phaseDrawCancelled"] },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("oljiezi"),
- "你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。"
- )
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- if (!target.hasMark("oljiezi") && target.isMinHandcard()) att *= 2;
- return att;
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("oljiezi", target);
- if (!target.hasMark("oljiezi") && target.isMinHandcard())
- target.addMark("oljiezi", 1);
- else target.draw();
- }
- },
- marktext: "辎",
- intro: {
- name2: "辎",
- content: "mark",
- onunmark: true,
- },
- group: "oljiezi_extra",
- subSkill: {
- extra: {
- audio: "oljiezi",
- trigger: { global: "phaseDrawAfter" },
- forced: true,
- filter: function (event, player) {
- return event.player.hasMark("oljiezi");
- },
- logTarget: "player",
- content: function () {
- var next = trigger.player.phaseDraw();
- event.next.remove(next);
- trigger.getParent().next.add(next);
- trigger.player.removeMark("oljiezi", trigger.player.countMark("oljiezi"));
- },
- },
- },
- },
- //界护驾
- rehujia: {
- audio: "hujia",
- inherit: "hujia",
- filter: function (event, player) {
- if (event.responded) return false;
- if (player.storage.hujiaing) return false;
- if (!player.hasZhuSkill("rehujia")) return false;
- if (!event.filterCard({ name: "shan" }, player, event)) return false;
- return game.hasPlayer(function (current) {
- return current != player && current.group == "wei";
- });
- },
- ai: {
- respondShan: true,
- skillTagFilter: function (player) {
- if (player.storage.hujiaing) return false;
- if (!player.hasZhuSkill("rehujia")) return false;
- return game.hasPlayer(function (current) {
- return current != player && current.group == "wei";
- });
- },
- },
- group: "rehujia_draw",
- subSkill: {
- draw: {
- trigger: { global: ["useCard", "respond"] },
- usable: 1,
- direct: true,
- filter: function (event, player) {
- return (
- event.card.name == "shan" &&
- event.player != player &&
- event.player.group == "wei" &&
- event.player.isIn() &&
- event.player != _status.currentPhase &&
- player.hasZhuSkill("rehujia")
- );
- },
- content: function () {
- "step 0";
- trigger.player
- .chooseBool("护驾:是否令" + get.translation(player) + "摸一张牌?")
- .set("ai", function () {
- var evt = _status.event;
- return get.attitude(evt.player, evt.getParent().player) > 0;
- });
- "step 1";
- if (result.bool) {
- player.logSkill("rehujia");
- trigger.player.line(player, "fire");
- player.draw();
- } else player.storage.counttrigger.rehujia_draw--;
- },
- },
- },
- },
- //夏侯氏
- reqiaoshi: {
- audio: 2,
- trigger: { global: "phaseJieshuBegin" },
- filter: function (event, player) {
- return (
- event.player != player &&
- event.player.countCards("h") == player.countCards("h") &&
- event.player.isIn()
- );
- },
- check: function (event, player) {
- return get.attitude(player, event.player) >= 0;
- },
- //priority:-5,
- logTarget: "player",
- content: function () {
- "step 0";
- game.asyncDraw([trigger.player, player]);
- "step 1";
- game.delayx();
- if (player.isIn() && trigger.player.isIn()) {
- var getGainSuit = function (player) {
- var last = player.getHistory("gain", function (evt) {
- return evt.getParent(2) == event;
- });
- if (last.length) {
- var evt = last.pop();
- if (evt.cards.length == 1 && player.getCards("h").includes(evt.cards[0]))
- return get.suit(evt.cards[0], player);
- } else return player;
- };
- if (getGainSuit(player) == getGainSuit(trigger.player))
- player.chooseBool(
- "是否继续发动【樵拾】?",
- "和" + get.translation(trigger.player) + "各摸一张牌"
- );
- } else event.finish();
- "step 2";
- if (result.bool) event.goto(0);
- },
- ai: {
- expose: 0.1,
- },
- },
- reyanyu: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return player.hasCard((card) => lib.skill.reyanyu.filterCard(card, player), "h");
- },
- filterCard: (card, player) => get.name(card) == "sha" && player.canRecast(card),
- discard: false,
- lose: false,
- delay: false,
- content: function () {
- player.recast(cards);
- },
- ai: {
- basic: {
- order: 1,
- },
- result: {
- player: 1,
- },
- },
- group: "reyanyu2",
- },
- reyanyu2: {
- trigger: { player: "phaseUseEnd" },
- direct: true,
- filter: (event, player) =>
- player.hasHistory(
- "useSkill",
- (evt) => evt.skill == "reyanyu" && evt.event.getParent(2) == event
- ) && game.hasPlayer((target) => target.hasSex("male") && target != player),
- content: function () {
- "step 0";
- event.num = Math.min(
- 3,
- player.getHistory(
- "useSkill",
- (evt) => evt.skill == "reyanyu" && evt.event.getParent(2) == trigger
- ).length
- );
- player
- .chooseTarget(
- get.prompt("reyanyu"),
- "令一名男性角色摸" + get.cnNumber(event.num) + "张牌",
- function (card, player, target) {
- return target.hasSex("male") && target != player;
- }
- )
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- });
- "step 1";
- if (result.bool) {
- player.logSkill("reyanyu", result.targets);
- result.targets[0].draw(event.num);
- }
- },
- },
- //虞翻
- xinzongxuan: {
- audio: 2,
- trigger: {
- player: "loseAfter",
- global: "loseAsyncAfter",
- },
- filter: function (event, player) {
- if (event.type != "discard") return false;
- var evt = event.getl(player);
- if (!evt || !evt.cards2) return false;
- for (var i = 0; i < evt.cards2.length; i++) {
- if (get.position(evt.cards2[i]) == "d") {
- return true;
- }
- }
- return false;
- },
- check: function (trigger, player) {
- if (trigger.getParent(3).name == "phaseDiscard") return true;
- if (
- !game.hasPlayer(function (current) {
- return (
- current != player &&
- get.attitude(player, current) > 0 &&
- !current.hasSkillTag("nogain")
- );
- })
- )
- return false;
- var cards = trigger.getl(player).cards2;
- for (var i = 0; i < cards.length; i++) {
- if (get.position(cards[i], true) == "d" && get.type2(cards[i], false) == "trick") {
- return true;
- }
- }
- return false;
- },
- content: function () {
- "step 0";
- var cards = [],
- cards2 = trigger.getl(player).cards2;
- for (var i = 0; i < cards2.length; i++) {
- if (get.position(cards2[i], true) == "d") {
- cards.push(cards2[i]);
- }
- }
- var next = player.chooseToMove("纵玄:将任意张牌置于牌堆顶", true);
- next.set("list", [["本次弃置的牌(请将要给出的锦囊牌留在这里)", cards], ["牌堆顶"]]);
- next.set("filterOk", function (moved) {
- if (moved[0].length == 1 && get.type2(moved[0][0], false) == "trick") return true;
- return moved[1].length > 0;
- });
- next.set("processAI", function (list) {
- var cards = list[0][1].slice(0),
- player = _status.event.player;
- var result = [[], []];
- if (
- game.hasPlayer(function (current) {
- return (
- current != player &&
- get.attitude(player, current) > 0 &&
- !current.hasSkillTag("nogain")
- );
- })
- ) {
- var max_val = 0;
- var max_card = false;
- for (var i of cards) {
- if (get.type2(i, false) == "trick") {
- var val = get.value(i, "raw");
- if (val > max_val) {
- max_card = i;
- max_val = val;
- }
- }
- }
- if (max_card) {
- result[0].push(max_card);
- cards.remove(max_card);
- }
- }
- if (cards.length) {
- var max_val = 0;
- var max_card = false;
- var equip = game.hasPlayer(function (current) {
- return current.isDamaged() && get.recoverEffect(current, player, player) > 0;
- });
- for (var i of cards) {
- var val = get.value(i);
- var type = get.type2(i, false);
- if (type == "basic") val += 3;
- if (type == "equip" && equip) val += 9;
- if (max_val == 0 || val > max_val) {
- max_card = i;
- max_val = val;
- }
- }
- if (max_card) {
- result[1].push(max_card);
- cards.remove(max_card);
- }
- result[0].addArray(cards);
- }
- return result;
- });
- "step 1";
- if (result.bool) {
- var cards = result.moved[1].slice(0);
- if (cards.length) {
- game.log(player, "将", cards, "置于了牌堆顶");
- while (cards.length)
- ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild);
- }
- var list = result.moved[0].filter(function (i) {
- return get.type2(i, false) == "trick";
- });
- if (list.length && game.hasPlayer((current) => current != player)) {
- var next = player
- .chooseButton(["是否将一张锦囊牌交给一名其他角色?", list])
- .set("ai", function (button) {
- if (_status.event.goon)
- return Math.max(0.1, get.value(button.link, "raw"));
- return 0;
- })
- .set(
- "goon",
- game.hasPlayer(function (current) {
- return (
- current != player &&
- get.attitude(player, current) > 0 &&
- !current.hasSkillTag("nogain")
- );
- })
- );
- if (!result.moved[1].length) next.set("forced", true);
- } else event.finish();
- } else event.finish();
- "step 2";
- if (result.bool) {
- var card = result.links[0];
- event.card = card;
- player
- .chooseTarget(
- lib.filter.notMe,
- true,
- "令一名其他角色获得" + get.translation(card)
- )
- .set("card", card)
- .set("ai", function (target) {
- var card = _status.event.card,
- player = _status.event.player;
- var eff =
- Math.max(0.1, get.value(card, target)) * get.attitude(player, target);
- if (target.hasSkill("nogain")) eff /= 10;
- return eff;
- });
- } else event.finish();
- "step 3";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.gain(card, "gain2");
- }
- },
- },
- xinzhiyan: {
- audio: "zhiyan",
- audioname: ["gexuan", "re_yufan", "xin_yufan"],
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("zhiyan"),
- "令一名角色摸一张牌并展示之。若为基本牌则你摸一张牌;若为装备牌,则其回复1点体力"
- )
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target) * (target.isDamaged() ? 2 : 1);
- });
- "step 1";
- if (result.bool) {
- event.target = result.targets[0];
- player.logSkill("xinzhiyan", result.targets);
- event.bool = false;
- event.target.draw("visible");
- } else {
- event.finish();
- }
- "step 2";
- var card = result[0];
- event.card = card;
- if (get.type(card) == "basic") player.draw();
- "step 3";
- if (get.type(card) == "equip") {
- if (target.getCards("h").includes(card) && target.hasUseTarget(card)) {
- event.target.chooseUseTarget(card, true, "nopopup");
- game.delay();
- }
- event.bool = true;
- }
- "step 4";
- if (event.bool) target.recover();
- },
- ai: {
- expose: 0.2,
- threaten: 1.2,
- },
- },
- //新主公技
- xinhuangtian: {
- unique: true,
- audio: "xinhuangtian2",
- audioname: ["zhangjiao", "re_zhangjiao"],
- global: "xinhuangtian2",
- zhuSkill: true,
- },
- xinhuangtian2: {
- audio: 2,
- enable: "phaseUse",
- discard: false,
- lose: false,
- delay: false,
- line: true,
- prepare: function (cards, player, targets) {
- targets[0].logSkill("xinhuangtian");
- },
- prompt: function () {
- var player = _status.event.player;
- var list = game.filterPlayer(function (target) {
- return target != player && target.hasZhuSkill("xinhuangtian", player);
- });
- var str = "将一张【闪】或黑桃手牌交给" + get.translation(list);
- if (list.length > 1) str += "中的一人";
- return str;
- },
- filter: function (event, player) {
- if (player.group != "qun") return false;
- if (
- !game.hasPlayer(function (target) {
- return (
- target != player &&
- target.hasZhuSkill("xinhuangtian", player) &&
- !target.hasSkill("xinhuangtian3")
- );
- })
- )
- return false;
- return player.hasCard(function (card) {
- return lib.skill.xinhuangtian2.filterCard(card, player);
- }, "h");
- },
- filterCard: function (card, player) {
- return get.name(card, player) == "shan" || get.suit(card, player) == "spade";
- },
- log: false,
- visible: true,
- filterTarget: function (card, player, target) {
- return (
- target != player &&
- target.hasZhuSkill("xinhuangtian", player) &&
- !target.hasSkill("xinhuangtian3")
- );
- },
- //usable:1,
- //forceaudio:true,
- content: function () {
- player.give(cards, target);
- target.addTempSkill("xinhuangtian3", "phaseUseEnd");
- },
- ai: {
- expose: 0.3,
- order: 10,
- result: {
- target: 5,
- },
- },
- },
- xinhuangtian3: {},
- rejijiang: {
- audio: "jijiang1",
- audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"],
- unique: true,
- group: ["rejijiang1", "rejijiang3"],
- zhuSkill: true,
- filter: function (event, player) {
- if (
- !player.hasZhuSkill("rejijiang") ||
- !game.hasPlayer(function (current) {
- return current != player && current.group == "shu";
- })
- )
- return false;
- return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3"));
- },
- enable: ["chooseToUse", "chooseToRespond"],
- viewAs: { name: "sha" },
- filterCard: function () {
- return false;
- },
- selectCard: -1,
- ai: {
- order: function () {
- return get.order({ name: "sha" }) + 0.3;
- },
- respondSha: true,
- skillTagFilter: function (player) {
- if (
- !player.hasZhuSkill("rejijiang") ||
- !game.hasPlayer(function (current) {
- return current != player && current.group == "shu";
- })
- )
- return false;
- },
- },
- },
- rejijiang1: {
- audio: "jijiang1",
- audioname: ["liushan", "re_liubei", "re_liushan", "ol_liushan"],
- trigger: { player: ["useCardBegin", "respondBegin"] },
- logTarget: "targets",
- filter: function (event, player) {
- return event.skill == "rejijiang";
- },
- forced: true,
- content: function () {
- "step 0";
- delete trigger.skill;
- trigger.getParent().set("jijiang", true);
- "step 1";
- if (event.current == undefined) event.current = player.next;
- if (event.current == player) {
- player.addTempSkill("jijiang3");
- event.finish();
- trigger.cancel();
- trigger.getParent().goto(0);
- } else if (event.current.group == "shu") {
- var next = event.current.chooseToRespond(
- "是否替" + get.translation(player) + "打出一张杀?",
- { name: "sha" }
- );
- next.set("ai", function () {
- var event = _status.event;
- return get.attitude(event.player, event.source) - 2;
- });
- next.set("source", player);
- next.set("jijiang", true);
- next.set("skillwarn", "替" + get.translation(player) + "打出一张杀");
- next.noOrdering = true;
- next.autochoose = lib.filter.autoRespondSha;
- } else {
- event.current = event.current.next;
- event.redo();
- }
- "step 2";
- if (result.bool) {
- event.finish();
- trigger.card = result.card;
- trigger.cards = result.cards;
- trigger.throw = false;
- if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) {
- event.current.ai.shown += 0.3;
- if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95;
- }
- } else {
- event.current = event.current.next;
- event.goto(1);
- }
- },
- },
- rejijiang3: {
- trigger: { global: ["useCard", "respond"] },
- usable: 1,
- direct: true,
- filter: function (event, player) {
- return (
- event.card.name == "sha" &&
- event.player != player &&
- event.player.group == "shu" &&
- event.player.isIn() &&
- event.player != _status.currentPhase &&
- player.hasZhuSkill("rejijiang")
- );
- },
- content: function () {
- "step 0";
- trigger.player
- .chooseBool("激将:是否令" + get.translation(player) + "摸一张牌?")
- .set("ai", function () {
- var evt = _status.event;
- return get.attitude(evt.player, evt.getParent().player) > 0;
- });
- "step 1";
- if (result.bool) {
- player.logSkill("rejijiang");
- trigger.player.line(player, "fire");
- player.draw();
- } else player.storage.counttrigger.rejijiang3--;
- },
- },
- //鲁肃
- olhaoshi: {
- trigger: { player: "phaseDrawBegin2" },
- filter: function (event, player) {
- return !event.numFixed;
- },
- check: function (event, player) {
- return (
- player.countCards("h") + 2 + event.num <= 5 ||
- game.hasPlayer(function (target) {
- return (
- player !== target &&
- !game.hasPlayer(function (current) {
- return (
- current !== player &&
- current !== target &&
- current.countCards("h") < target.countCards("h")
- );
- }) &&
- get.attitude(player, target) > 0
- );
- })
- );
- },
- content: function () {
- trigger.num += 2;
- player.addTempSkill("olhaoshi_give", "phaseDrawAfter");
- },
- subSkill: {
- give: {
- trigger: { player: "phaseDrawEnd" },
- forced: true,
- charlotte: true,
- popup: false,
- filter: function (event, player) {
- return player.countCards("h") > 5;
- },
- content: function () {
- "step 0";
- var targets = game.filterPlayer(function (target) {
- return (
- target != player &&
- !game.hasPlayer(function (current) {
- return (
- current != player &&
- current != target &&
- current.countCards("h") < target.countCards("h")
- );
- })
- );
- }),
- num = Math.floor(player.countCards("h") / 2);
- player.chooseCardTarget({
- position: "h",
- filterCard: true,
- filterTarget: function (card, player, target) {
- return _status.event.targets.includes(target);
- },
- targets: targets,
- selectTarget: targets.length == 1 ? -1 : 1,
- selectCard: num,
- prompt: "将" + get.cnNumber(num) + "张手牌交给一名手牌数最少的其他角色",
- forced: true,
- ai1: function (card) {
- var goon = false,
- player = _status.event.player;
- for (var i of _status.event.targets) {
- if (get.attitude(i, player) > 0 && get.attitude(player, i) > 0)
- goon = true;
- break;
- }
- if (goon) {
- if (
- !player.hasValueTarget(card) ||
- (card.name == "sha" &&
- player.countCards("h", function (cardx) {
- return (
- cardx.name == "sha" &&
- !ui.selected.cards.includes(cardx)
- );
- }) > player.getCardUsable("sha"))
- )
- return 2;
- return Math.max(2, get.value(card) / 4);
- }
- return 1 / Math.max(1, get.value(card));
- },
- ai2: function (target) {
- return get.attitude(_status.event.player, target);
- },
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- player.give(result.cards, target);
- player.markAuto("olhaoshi_help", [target]);
- player.addTempSkill("olhaoshi_help", { player: "phaseBeginStart" });
- }
- },
- },
- help: {
- trigger: { target: "useCardToTargeted" },
- direct: true,
- charlotte: true,
- onremove: true,
- filter: function (event, player) {
- if (!player.storage.olhaoshi_help || !player.storage.olhaoshi_help.length)
- return false;
- if (event.card.name != "sha" && get.type(event.card) != "trick") return false;
- for (var i of player.storage.olhaoshi_help) {
- if (i.countCards("h") > 0) return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- if (!event.targets)
- event.targets = player.storage.olhaoshi_help.slice(0).sortBySeat();
- event.target = event.targets.shift();
- event.target
- .chooseCard("h", "好施:是否将一张手牌交给" + get.translation(player) + "?")
- .set("ai", function (card) {
- var player = _status.event.player,
- target = _status.event.getTrigger().player;
- if (!_status.event.goon) {
- if (get.value(card, player) < 0 || get.value(card, target) < 0)
- return 1;
- return 0;
- }
- var cardx = _status.event.getTrigger().card;
- if (
- card.name == "shan" &&
- get.tag(cardx, "respondShan") &&
- target.countCards("h", "shan") < player.countCards("h", "shan")
- )
- return 2;
- if (
- card.name == "sha" &&
- (cardx.name == "juedou" ||
- (get.tag(card, "respondSha") &&
- target.countCards("h", "sha") <
- player.countCards("h", "sha")))
- )
- return 2;
- if (
- get.value(card, target) > get.value(card, player) ||
- target.getUseValue(card) > player.getUseValue(card)
- )
- return 1;
- if (player.hasSkillTag("noh"))
- return 0.5 / Math.max(1, get.value(card, player));
- return 0;
- })
- .set("goon", get.attitude(event.target, player) > 0);
- "step 1";
- if (result.bool) {
- target.logSkill("olhaoshi_help", player);
- target.give(result.cards, player);
- }
- if (targets.length) event.goto(0);
- },
- },
- },
- },
- oldimeng: {
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return game.hasPlayer((current) =>
- lib.skill.oldimeng.filterTarget(null, player, current)
- );
- },
- selectTarget: 2,
- complexTarget: true,
- filterTarget: function (card, player, target) {
- if (target == player) return false;
- var ps = player.countCards("he");
- if (!ui.selected.targets.length) {
- var hs = target.countCards("h");
- return game.hasPlayer(function (current) {
- if (current == player || current == target) return false;
- var cs = current.countCards("h");
- return (hs > 0 || cs > 0) && Math.abs(hs - cs) <= ps;
- });
- }
- var current = ui.selected.targets[0],
- hs = target.countCards("h"),
- cs = current.countCards("h");
- return (hs > 0 || cs > 0) && Math.abs(hs - cs) <= ps;
- },
- multitarget: true,
- multiline: true,
- content: function () {
- targets[0].swapHandcards(targets[1]);
- var num = Math.abs(targets[0].countCards("h") - targets[1].countCards("h"));
- if (num > 0) {
- player.addMark("oldimeng_discard", num, false);
- player.addTempSkill("oldimeng_discard", "phaseUseAfter");
- }
- },
- ai: {
- threaten: 4.5,
- pretao: true,
- nokeep: true,
- order: 1,
- expose: 0.2,
- result: {
- target: function (player, target) {
- if (!ui.selected.targets.length) return -Math.sqrt(target.countCards("h"));
- var h1 = ui.selected.targets[0].getCards("h"),
- h2 = target.getCards("h");
- if (h2.length > h1.length) return 0;
- var delval = get.value(h2, target) - get.value(h1, ui.selected.targets[0]);
- if (delval >= 0) return 0;
- return -delval * (h1.length - h2.length);
- },
- },
- },
- subSkill: {
- discard: {
- trigger: { player: "phaseUseEnd" },
- forced: true,
- charlotte: true,
- onremove: true,
- filter: function (event, player) {
- return player.countCards("he") > 0;
- },
- content: function () {
- player.chooseToDiscard("he", true, player.countMark("oldimeng_discard"));
- },
- },
- },
- },
- //贾诩
- rewansha: {
- audio: "wansha",
- audioname: ["re_jiaxu", "shen_simayi", "boss_lvbu3"],
- global: "rewansha_global",
- trigger: { global: "dyingBegin" },
- forced: true,
- logTarget: "player",
- filter: function (event, player) {
- return player == _status.currentPhase;
- },
- content: function () {
- game.countPlayer(function (current) {
- if (current != player && current != trigger.player)
- current.addSkillBlocker("rewansha_fengyin");
- });
- player.addTempSkill("rewansha_clear");
- },
- subSkill: {
- global: {
- mod: {
- cardEnabled: function (card, player) {
- var source = _status.currentPhase;
- if (
- card.name == "tao" &&
- source &&
- source != player &&
- source.hasSkill("rewansha") &&
- !player.isDying()
- )
- return false;
- },
- cardSavable: function (card, player) {
- var source = _status.currentPhase;
- if (
- card.name == "tao" &&
- source &&
- source != player &&
- source.hasSkill("rewansha") &&
- !player.isDying()
- )
- return false;
- },
- },
- },
- fengyin: {
- inherit: "fengyin",
- },
- clear: {
- trigger: { global: "dyingAfter" },
- forced: true,
- charlotte: true,
- popup: false,
- filter: function (event, player) {
- return !_status.dying.length;
- },
- content: function () {
- player.removeSkill("rewansha_clear");
- },
- onremove: function () {
- game.countPlayer2(function (current) {
- current.removeSkillBlocker("rewansha_fengyin");
- });
- },
- },
- },
- },
- reluanwu: {
- audio: "luanwu",
- audioname: ["re_jiaxu"],
- unique: true,
- enable: "phaseUse",
- limited: true,
- skillAnimation: "epic",
- animationColor: "thunder",
- filterTarget: function (card, player, target) {
- return target != player;
- },
- selectTarget: -1,
- multiline: true,
- contentBefore: function () {
- player.awakenSkill("reluanwu");
- },
- content: function () {
- "step 0";
- target
- .chooseToUse(
- "乱武:使用一张杀或失去1点体力",
- function (card) {
- if (get.name(card) != "sha") return false;
- return lib.filter.filterCard.apply(this, arguments);
- },
- function (card, player, target) {
- if (player == target) return false;
- var dist = get.distance(player, target);
- if (dist > 1) {
- if (
- game.hasPlayer(function (current) {
- return current != player && get.distance(player, current) < dist;
- })
- ) {
- return false;
- }
- }
- return lib.filter.filterTarget.apply(this, arguments);
- }
- )
- .set("ai2", function () {
- return get.effect_use.apply(this, arguments) - _status.event.effect;
- })
- .set("effect", get.effect(target, { name: "losehp" }, target, target));
- "step 1";
- if (result.bool == false) {
- target.loseHp();
- }
- },
- contentAfter: function () {
- player.chooseUseTarget("sha", "是否使用一张【杀】?", false, "nodistance");
- },
- ai: {
- order: 1,
- result: {
- player: function (player) {
- if (lib.config.mode == "identity" && game.zhu.isZhu && player.identity == "fan") {
- if (game.zhu.hp == 1 && game.zhu.countCards("h") <= 2) return 1;
- }
- var num = 0;
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- var att = get.attitude(player, players[i]);
- if (att > 0) att = 1;
- if (att < 0) att = -1;
- if (players[i] != player && players[i].hp <= 3) {
- if (players[i].countCards("h") == 0) num += att / players[i].hp;
- else if (players[i].countCards("h") == 1) num += att / 2 / players[i].hp;
- else if (players[i].countCards("h") == 2) num += att / 4 / players[i].hp;
- }
- if (players[i].hp == 1) num += att * 1.5;
- }
- if (player.hp == 1) {
- return -num;
- }
- if (player.hp == 2) {
- return -game.players.length / 4 - num;
- }
- return -game.players.length / 3 - num;
- },
- },
- },
- },
- reweimu: {
- audio: 2,
- mod: {
- targetEnabled: function (card) {
- if (get.type2(card) == "trick" && get.color(card) == "black") return false;
- },
- },
- trigger: { player: "damageBegin4" },
- forced: true,
- filter: function (event, player) {
- return player == _status.currentPhase;
- },
- content: function () {
- trigger.cancel();
- var num = trigger.num;
- player.draw(2 * num);
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (target == _status.currentPhase && get.tag(card, "damage")) return [0, 1];
- },
- },
- },
- },
- //顾雍
- reshenxing: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return player.countCards("he") >= Math.min(2, player.getStat("skill").reshenxing || 0);
- },
- selectCard: function () {
- return Math.min(2, _status.event.player.getStat("skill").reshenxing || 0);
- },
- prompt: function () {
- return (
- "弃置" +
- get.cnNumber(Math.min(2, _status.event.player.getStat("skill").reshenxing || 0)) +
- "张牌并摸一张牌"
- );
- },
- check: function (card) {
- var num = _status.event.player.countCards("h", { color: get.color(card) });
- if (get.position(card) == "e") num++;
- return (Math.max(4, 7.1 - num) - get.value(card)) / num;
- },
- filterCard: true,
- position: "he",
- content: function () {
- player.draw();
- },
- ai: {
- order: function (item, player) {
- if (!player.getStat("skill").reshenxing) return 10;
- return 1;
- },
- result: { player: 1 },
- },
- },
- rebingyi: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- filter: function (event, player) {
- return player.countCards("h") > 0;
- },
- filterx: function (player) {
- var cards = player.getCards("h");
- if (cards.length == 1) return true;
- var color = get.color(cards[0], player);
- for (var i = 1; i < cards.length; i++) {
- if (get.color(cards[i], player) != color) return false;
- }
- return true;
- },
- filtery: function (player) {
- var cards = player.getCards("h");
- if (cards.length == 1) return true;
- var color = get.number(cards[0], player);
- for (var i = 1; i < cards.length; i++) {
- if (get.number(cards[i], player) != color) return false;
- }
- return true;
- },
- async cost(event, trigger, player) {
- const selfDraw = lib.skill.rebingyi.filtery(player),
- asyncDraw = lib.skill.rebingyi.filterx(player);
- if (asyncDraw) {
- const num = player.countCards("h");
- const result = await player
- .chooseTarget(
- get.prompt("rebingyi"),
- `展示所有手牌,并选择至多${get.cnNumber(num)}名角色各摸一张牌${
- selfDraw ? "" : ",然后你摸一张牌"
- }`,
- [0, num]
- )
- .set("ai", function (target) {
- return get.attitude(get.player(), target);
- })
- .forResult();
- if (result.bool)
- event.result = {
- bool: result.bool,
- cost_data: {
- asyncDraw,
- selfDraw,
- targets: result.targets,
- },
- };
- } else {
- event.result = await player
- .chooseBool(
- get.prompt("rebingyi"),
- `展示所有手牌${selfDraw ? "" : ",然后你摸一张牌"}`
- )
- .set("choice", selfDraw)
- .set("ai", () => get.event().choice)
- .forResult();
- event.result.cost_data = { selfDraw };
- }
- },
- async content(event, trigger, player) {
- await player.showHandcards(get.translation(player) + "发动了【秉壹】");
- const data = event.cost_data;
- if (data.asyncDraw && data.targets && data.targets.length) {
- const targets = data.targets.sortBySeat();
- await game.asyncDraw(targets);
- }
- if (data.selfDraw) {
- player.draw();
- }
- },
- },
- //钟会
- xinquanji: {
- audio: 2,
- trigger: {
- player: ["damageEnd"],
- global: ["gainAfter", "loseAsyncAfter"],
- },
- filter: function (event, player) {
- if (event.name == "damage") return true;
- if (event.name == "loseAsync") {
- if (event.type != "gain" || event.giver) return false;
- var cards = event.getl(player).cards2;
- return game.hasPlayer(function (current) {
- if (current == player) return false;
- var cardsx = event.getg(current);
- for (var i of cardsx) {
- if (cards.includes(i)) return true;
- }
- return false;
- });
- }
- if (player == event.player) return false;
- if (event.giver || event.getParent().name == "gift") return false;
- var evt = event.getl(player);
- return evt && evt.cards2 && evt.cards2.length > 0;
- },
- frequent: true,
- content: function () {
- "step 0";
- event.count = trigger.name == "damage" ? trigger.num : 1;
- "step 1";
- event.count--;
- player.draw();
- "step 2";
- var hs = player.getCards("h");
- if (hs.length) {
- if (hs.length == 1) event._result = { bool: true, cards: hs };
- else player.chooseCard("h", true, "选择一张手牌作为“权”");
- } else event.goto(4);
- "step 3";
- if (result.bool && result.cards && result.cards.length) {
- player.addToExpansion(result.cards, "giveAuto", player).gaintag.add("xinquanji");
- }
- "step 4";
- if (
- event.count > 0 &&
- player.hasSkill(event.name) &&
- !get.is.blocked(event.name, player)
- ) {
- player.chooseBool(get.prompt2("xinquanji")).set("frequentSkill", event.name);
- } else event.finish();
- "step 5";
- if (result.bool) {
- player.logSkill("xinquanji");
- event.goto(1);
- }
- },
- locked: false,
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- mod: {
- maxHandcard: function (player, num) {
- return num + player.getExpansions("xinquanji").length;
- },
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- threaten: 0.8,
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "damage") && !target.storage.xinzili) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- if (!target.hasFriend()) return;
- if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2];
- if (!target.hasSkill("xinpaiyi") && target.hp > 1)
- return [0.5, get.tag(card, "damage") * 1.5];
- if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5];
- if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5];
- }
- },
- },
- },
- },
- xinzili: {
- derivation: "xinpaiyi",
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- juexingji: true,
- skillAnimation: true,
- animationColor: "thunder",
- filter: function (event, player) {
- return player.getExpansions("xinquanji").length > 2;
- },
- content: function () {
- player.awakenSkill("xinzili");
- player.recover();
- player.draw(2);
- player.loseMaxHp();
- player.addSkills("xinpaiyi");
- },
- ai: {
- combo: "xinquanji",
- },
- },
- xinpaiyi: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return (
- player.getExpansions("xinquanji").length > 0 &&
- (!player.hasSkill("xinpaiyi_0") || !player.hasSkill("xinpaiyi_1"))
- );
- },
- chooseButton: {
- check: function (button) {
- if (typeof button.link == "object") return 1;
- var player = _status.event.player,
- num = player.getExpansions("xinquanji").length - 1;
- if (button.link == 1) {
- if (
- game.countPlayer(function (current) {
- return get.damageEffect(current, player, player) > 0;
- }) < num
- )
- return 0.5;
- return 2;
- }
- if (num < 2) return 0;
- return 1;
- },
- dialog: function (event, player) {
- var dialog = ui.create.dialog("权计", "hidden");
- var table = document.createElement("div");
- table.classList.add("add-setting");
- table.style.margin = "0";
- table.style.width = "100%";
- table.style.position = "relative";
- var list = ["摸牌", "造成伤害"];
- dialog.add([
- list.map((item, i) => {
- return [i, item];
- }),
- "tdnodes",
- ]);
- dialog.add(player.getExpansions("xinquanji"));
- return dialog;
- },
- select: 2,
- filter: function (button, player) {
- if (typeof button.link == "number" && player.hasSkill("xinpaiyi_" + button.link))
- return false;
- if (ui.selected.buttons.length)
- return typeof ui.selected.buttons[0].link != typeof button.link;
- return true;
- },
- backup: function (links) {
- if (typeof links[0] == "object") links.reverse();
- var next = get.copy(lib.skill["xinpaiyi_backup" + links[0]]);
- next.card = links[1];
- return next;
- },
- prompt: function (links, player) {
- if (typeof links[0] == "object") links.reverse();
- var num = get.cnNumber(Math.max(1, player.getExpansions("xinquanji").length - 1)),
- card = get.translation(links[1]);
- if (links[0] == 0) return "移去" + card + "并令一名角色摸" + num + "张牌";
- return "移去" + card + "并对至多" + num + "名角色造成1点伤害";
- },
- },
- ai: {
- order: 1,
- result: { player: 1 },
- combo: "xinquanji",
- },
- subSkill: {
- 0: {},
- 1: {},
- backup0: {
- audio: "xinpaiyi",
- filterCard: () => false,
- selectCard: -1,
- filterTarget: true,
- delay: false,
- content: function () {
- "step 0";
- player.addTempSkill("xinpaiyi_0", "phaseUseEnd");
- var card = lib.skill.xinpaiyi_backup.card;
- player.loseToDiscardpile(card);
- "step 1";
- target.draw(Math.max(1, player.getExpansions("xinquanji").length));
- },
- ai: {
- result: {
- target: function (player, target) {
- if (target.hasSkill("nogain")) return 0;
- if (player == target && !player.needsToDiscard()) return 3;
- return 1;
- },
- },
- },
- },
- backup1: {
- audio: "xinpaiyi",
- filterCard: () => false,
- selectCard: -1,
- filterTarget: true,
- delay: false,
- multitarget: true,
- multiline: true,
- selectTarget: function () {
- return [
- 1,
- Math.max(1, _status.event.player.getExpansions("xinquanji").length - 1),
- ];
- },
- content: function () {
- "step 0";
- targets.sortBySeat();
- player.addTempSkill("xinpaiyi_1", "phaseUseEnd");
- var card = lib.skill.xinpaiyi_backup.card;
- player.loseToDiscardpile(card);
- "step 1";
- for (var i of targets) i.damage();
- },
- ai: {
- tag: {
- damage: 1,
- },
- result: {
- target: -1.5,
- },
- },
- },
- },
- },
- //界蔡夫人
- reqieting: {
- audio: 2,
- trigger: { global: "phaseEnd" },
- direct: true,
- filter: function (event, player) {
- var target = event.player;
- if (player == target) return false;
- if (!target.getHistory("sourceDamage").length) {
- var cards = target.getCards("e");
- for (var i of cards) {
- if (player.canEquip(i)) return true;
- }
- }
- return (
- target.getHistory("useCard", function (evt) {
- return (
- evt.targets &&
- evt.targets.filter(function (i) {
- return i != target;
- }).length > 0
- );
- }).length == 0
- );
- },
- frequent: true,
- content: function () {
- "step 0";
- var target = trigger.player;
- event.target = target;
- event.logged = false;
- var list = [];
- if (!target.getHistory("sourceDamage").length) {
- var cards = target.getCards("e");
- for (var i of cards) {
- if (player.canEquip(i)) list.push(i);
- }
- }
- if (list.length) {
- player
- .choosePlayerCard(target, "e", get.prompt("reqieting", target))
- .set("list", list)
- .set("filterButton", function (button) {
- return _status.event.list.includes(button.link);
- })
- .set("ai", function (button) {
- var evt = _status.event,
- val = get.value(button.link);
- if (evt.target.hasSkillTag("noe")) val -= 4;
- if (evt.att > 0 == val > 0) return 0;
- return get.effect(evt.player, button.link, evt.player, evt.player);
- })
- .set("att", get.attitude(player, target));
- } else event.goto(2);
- "step 1";
- if (result.bool) {
- player.logSkill("reqieting", target);
- event.logged = true;
- var card = result.links[0];
- target.$give(card, player, false);
- game.delay(0.5);
- player.equip(card);
- }
- if (
- target.getHistory("useCard", function (evt) {
- return (
- evt.targets &&
- evt.targets.filter(function (i) {
- return i != target;
- }).length > 0
- );
- }).length != 0
- )
- event.finish();
- "step 2";
- player.chooseBool("是否发动【窃听】摸一张牌?").set("frequentSkill", "reqieting");
- "step 3";
- if (result.bool) {
- if (!event.logged) player.logSkill("reqieting", target);
- player.draw();
- }
- },
- },
- rexianzhou: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- skillAnimation: true,
- animationColor: "gray",
- filter: function (event, player) {
- return player.countCards("e") > 0;
- },
- filterCard: true,
- position: "e",
- selectCard: -1,
- filterTarget: lib.filter.notMe,
- discard: false,
- lose: false,
- delay: false,
- content: function () {
- "step 0";
- player.awakenSkill("rexianzhou");
- player.give(cards, target);
- player.recover(cards.length);
- "step 1";
- var list = game.filterPlayer(function (current) {
- return target.inRange(current);
- });
- if (list.length) {
- var max = Math.min(list.length, cards.length);
- target
- .chooseTarget(
- true,
- [1, max],
- "对至多" + get.cnNumber(max) + "名范围内的角色各造成1点伤害",
- function (card, player, target) {
- return _status.event.list.includes(target);
- }
- )
- .set("list", list)
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- } else event.finish();
- "step 2";
- if (result.bool) {
- var targets = result.targets.sortBySeat();
- player.line(targets, "green");
- for (var i of targets) i.damage("nocard");
- }
- },
- ai: {
- order: 1,
- result: {
- target: 1,
- player: function (player) {
- var bool = true,
- players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (
- players[i] != player &&
- get.attitude(player, players[i]) > 2 &&
- get.attitude(players[i], player) > 2
- ) {
- bool = false;
- break;
- }
- }
- if (bool) return -10;
- if (player.hp == 1) return 1;
- if (game.phaseNumber < game.players.length) return -10;
- if (player.countCards("e") + player.hp <= player.maxHp) return 1;
- return -10;
- },
- },
- },
- },
- //界关平
- relongyin: {
- audio: 2,
- shaRelated: true,
- init: (player) => {
- game.addGlobalSkill("relongyin_order");
- },
- onremove: (player) => {
- if (!game.hasPlayer((current) => current.hasSkill("relongyin"), true))
- game.removeGlobalSkill("relongyin_order");
- },
- trigger: { global: "useCard" },
- direct: true,
- filter: function (event, player) {
- return (
- event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing()
- );
- },
- content: function () {
- "step 0";
- var go = false;
- if (get.attitude(player, trigger.player) > 0) {
- if (get.color(trigger.card) == "red") {
- go = true;
- } else 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;
- }
- }
- }
- }
- //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("longyin"),
- "弃置一张牌" +
- (get.color(trigger.card) == "red" ? "并摸一张牌" : "") +
- ",令" +
- get.translation(trigger.player) +
- "本次使用的【杀】不计入使用次数",
- "he"
- );
- next.logSkill = ["relongyin", 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--;
- }
- if (get.color(trigger.card) == "red") {
- player.draw();
- }
- if (get.number(result.cards[0], player) == get.number(trigger.card))
- player.restoreSkill("jiezhong");
- }
- },
- ai: {
- expose: 0.2,
- },
- subSkill: {
- order: {
- mod: {
- aiOrder: (player, card, num) => {
- if (num && card.name === "sha" && get.color(card) === "red") {
- let gp = game.findPlayer((current) => {
- return (
- current.hasSkill("relongyin") &&
- current.hasCard((i) => true, "he")
- );
- });
- if (gp) return num + 0.15 * Math.sign(get.attitude(player, gp));
- }
- },
- },
- trigger: { player: "dieAfter" },
- filter: (event, player) => {
- return !game.hasPlayer((current) => current.hasSkill("relongyin"), true);
- },
- silent: true,
- forceDie: true,
- charlotte: true,
- content: () => {
- game.removeGlobalSkill("relongyin_order");
- },
- },
- },
- },
- jiezhong: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- limited: true,
- skillAnimation: true,
- animationColor: "orange",
- filter: function (event, player) {
- return player.countCards("h") < player.maxHp;
- },
- content: function () {
- player.awakenSkill("jiezhong");
- player.draw(Math.min(5, player.maxHp - player.countCards("h")));
- },
- },
- //新郭淮
- decadejingce: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- frequent: true,
- filter: function (event, player) {
- return player.getHistory("useCard").length >= player.hp;
- },
- content: function () {
- "step 0";
- var list = [],
- history = player.getHistory("useCard");
- for (var i of history) {
- list.add(get.suit(i.card));
- if (list.length >= player.hp) break;
- }
- if (list.length >= player.hp) event.goon = true;
- else
- player
- .chooseControl("摸牌阶段", "出牌阶段")
- .set("prompt", "精策:选择要执行的额外阶段");
- "step 1";
- if (event.goon || result.index == 0) {
- var next = player.phaseDraw();
- event.next.remove(next);
- trigger.getParent().next.push(next);
- }
- if (event.goon || result.index == 1) {
- var next = player.phaseUse();
- event.next.remove(next);
- trigger.getParent().next.push(next);
- }
- },
- },
- //新于禁
- decadezhenjun: {
- audio: 2,
- trigger: {
- player: ["phaseZhunbeiBegin", "phaseJieshuBegin"],
- },
- filter: function (event, player) {
- return game.hasPlayer(function (current) {
- return current.countCards("he") > 0;
- });
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt2("decadezhenjun"), function (card, player, target) {
- return target.countCards("he") > 0;
- })
- .set("ai", function (target) {
- return -get.attitude(_status.event.player, target) * (target.countCards("e") + 1);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- var num = Math.max(target.countCards("h") - target.hp, 1);
- player.logSkill("decadezhenjun", target);
- player.discardPlayerCard(num, target, true);
- }
- "step 2";
- if (result.cards && result.cards.length) {
- for (var i = 0; i < result.cards.length; i++) {
- if (get.type(result.cards[i]) == "equip") {
- event.finish();
- return;
- }
- }
- event.num = result.cards.length;
- if (event.num > 0) {
- var prompt =
- "弃置一张牌,或令" +
- get.translation(event.target) +
- "摸" +
- get.cnNumber(event.num) +
- "张牌";
- player.chooseToDiscard(prompt, "he").ai = function (card) {
- return 7 - get.value(card);
- };
- } else event.finish();
- } else event.finish();
- "step 3";
- if (!result.bool) {
- event.target.draw(event.num);
- }
- },
- },
- //界姜维
- oltiaoxin: {
- audio: "tiaoxin",
- audioname: ["sp_jiangwei", "xiahouba", "re_jiangwei", "gz_jiangwei", "ol_jiangwei"],
- enable: "phaseUse",
- usable: 2,
- filter: function (event, player) {
- if (player.getStat("skill").oltiaoxin) return !player.hasSkill("oltiaoxin2");
- return true;
- },
- filterTarget: function (card, player, target) {
- return target != player && target.inRange(player) && target.countCards("he") > 0;
- },
- content: function () {
- "step 0";
- 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);
- "step 1";
- if (
- result.bool &&
- player.getHistory("damage", function (evt) {
- return evt.getParent().type == "card" && evt.getParent(4) == event;
- }).length > 0
- )
- player.addTempSkill("oltiaoxin2", "phaseUseEnd");
- else if (target.countDiscardableCards(player, "he") > 0)
- player.discardPlayerCard(target, "he", true).boolline = true;
- },
- ai: {
- order: 4,
- expose: 0.2,
- result: {
- target: -1,
- player: function (player, target) {
- if (target.countCards("h") == 0) return 0;
- if (target.countCards("h") == 1) return -0.1;
- if (player.hp <= 2) return -2;
- if (player.countCards("h", "shan") == 0) return -1;
- return -0.5;
- },
- },
- threaten: 1.1,
- },
- },
- oltiaoxin2: {},
- olzhiji: {
- skillAnimation: true,
- animationColor: "fire",
- audio: 2,
- unique: true,
- juexingji: true,
- //priority:-10,
- derivation: "reguanxing",
- trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] },
- forced: true,
- filter: function (event, player) {
- if (player.storage.zhiji) return false;
- return player.countCards("h") == 0;
- },
- content: function () {
- "step 0";
- player.awakenSkill("olzhiji");
- player.chooseDrawRecover(2, true);
- "step 1";
- player.loseMaxHp();
- player.addSkills("reguanxing");
- },
- },
- //界郭图张嶷
- rejigong: {
- audio: 2,
- direct: true,
- trigger: { player: "phaseUseBegin" },
- content: function () {
- "step 0";
- player
- .chooseControl("一张", "两张", "三张", "cancel2")
- .set("prompt", get.prompt2("rejigong"))
- .set("ai", () => "三张");
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("rejigong");
- player.addTempSkill("rejigong2");
- player.draw(1 + result.index);
- }
- },
- },
- rejigong2: {
- audio: "rejigong",
- mod: {
- maxHandcardBase: function (player) {
- if (game.online) return player.getStat("damage") || 0;
- var num = 0;
- player.getHistory("sourceDamage", function (evt) {
- num += evt.num;
- });
- return num;
- },
- },
- trigger: { player: "phaseDiscardBegin" },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- if (player.isHealthy()) return false;
- var num = 0;
- player.getHistory("sourceDamage", function (evt) {
- num += evt.num;
- });
- if (!num) return false;
- var num2 = 0;
- player.getHistory("gain", function (evt) {
- var evtx = evt.getParent(2);
- if (evtx.name == "rejigong" && evtx.player == player) num2 += evt.cards.length;
- });
- return num >= num2;
- },
- content: function () {
- player.recover();
- },
- },
- reshizhi: {
- mod: {
- cardname: function (card, player) {
- if (card.name == "shan" && player.hp == 1) return "sha";
- },
- },
- trigger: { source: "damageEnd" },
- forced: true,
- filter: function (event, player) {
- return (
- event.card &&
- event.card.name == "sha" &&
- player.hp == 1 &&
- event.cards &&
- event.cards.length == 1 &&
- event.cards[0].name == "shan"
- );
- },
- content: function () {
- player.recover();
- },
- ai: {
- halfneg: true
- },
- },
- //界陈群
- redingpin: {
- audio: 2,
- enable: "phaseUse",
- onChooseToUse: function (event) {
- if (event.type != "phase" || game.online) return;
- var list = [],
- player = event.player;
- player.getHistory("useCard", function (evt) {
- list.add(get.type2(evt.card));
- });
- player.getHistory("lose", function (evt) {
- if (evt.type != "discard" || evt.getParent(2).redingpin_ignore) return;
- for (var i of evt.cards2) {
- list.add(get.type2(i, evt.hs.includes(i) ? player : false));
- }
- });
- event.set("redingpin_types", list);
- },
- filter: function (event, player) {
- var list = event.redingpin_types || [];
- return (
- player.countCards("he", function (card) {
- return !list.includes(get.type2(card));
- }) > 0
- );
- },
- filterCard: function (card) {
- var list = _status.event.redingpin_types || [];
- return !list.includes(get.type2(card));
- },
- position: "he",
- filterTarget: function (card, player, target) {
- return !target.hasSkill("redingpin2");
- },
- content: function () {
- "step 0";
- target.judge(function (card) {
- var evt = _status.event.getParent("redingpin"),
- suit = get.suit(card);
- switch (suit) {
- case "club":
- case "spade":
- return evt.target.hp;
- case "diamond":
- return get.sgn(get.attitude(evt.target, evt.player)) * -3;
- }
- return 0;
- }).judge2 = function (result) {
- if (result.color == "black") return true;
- return false;
- };
- "step 1";
- switch (result.suit) {
- case "spade":
- case "club":
- if (target.hp > 0) target.draw(Math.min(3, target.hp));
- target.addTempSkill("redingpin2");
- break;
- case "heart":
- event.getParent().redingpin_ignore = true;
- break;
- case "diamond":
- player.turnOver();
- break;
- }
- },
- ai: {
- order: 9,
- result: {
- target: function (player, target) {
- if (player.isTurnedOver()) return target.hp;
- var card = ui.cardPile.firstChild;
- if (!card) return;
- if (get.color(card) == "black") return target.hp;
- return 0;
- },
- },
- },
- },
- redingpin2: { charlotte: true },
- refaen: {
- audio: 2,
- audioname: ["dc_chenqun"],
- trigger: { global: ["turnOverAfter", "linkAfter"] },
- logTarget: "player",
- filter: function (event, player) {
- if (event.name == "link") return event.player.isLinked();
- return true;
- },
- check: function (event, player) {
- return get.attitude(player, event.player) > 0;
- },
- content: function () {
- trigger.player.draw();
- },
- },
- dcfaen: {
- audio: "refaen",
- audioname: ["dc_chenqun"],
- trigger: { global: ["turnOverAfter", "linkAfter"] },
- logTarget: "player",
- filter: function (event, player) {
- if (event.name == "link") return event.player.isLinked();
- return !event.player.isTurnedOver();
- },
- check: function (event, player) {
- return get.attitude(player, event.player) > 0;
- },
- content: function () {
- trigger.player.draw();
- },
- },
- //界曹彰
- xinjiangchi: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- content: function () {
- "step 0";
- var list = ["摸一张牌", "摸两张牌,本回合内不能使用或打出【杀】"];
- if (
- player.countCards("he", function (card) {
- return lib.filter.cardDiscardable(card, player, "xinjiangchi") > 0;
- }) > 0
- )
- list.push("弃置一张牌,本回合可以多使用一张【杀】且无距离限制");
- player
- .chooseControl("cancel2")
- .set("prompt", get.prompt("xinjiangchi"))
- .set("choiceList", list)
- .set("ai", function () {
- var player = _status.event.player;
- if (
- !player.countCards("hs", function (card) {
- return get.name(card) == "sha" && player.hasValueTarget(card, false);
- })
- )
- return 1;
- return 0;
- });
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("xinjiangchi");
- switch (result.index) {
- case 0: {
- player.draw();
- break;
- }
- case 1: {
- player.draw(2);
- player.addTempSkill("xinjiangchi_less");
- break;
- }
- case 2: {
- player.chooseToDiscard("he", true);
- player.addTempSkill("xinjiangchi_more");
- break;
- }
- }
- }
- },
- subSkill: {
- less: {
- mod: {
- cardEnabled: function (card) {
- if (card.name == "sha") return false;
- },
- cardRespondable: function (card) {
- if (card.name == "sha") return false;
- },
- },
- charlotte: true,
- },
- more: {
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return num + 1;
- },
- targetInRange: function (card) {
- if (card.name == "sha") return true;
- },
- },
- charlotte: true,
- },
- },
- },
- //界周仓和程普
- ollihuo: {
- mod: {
- aiOrder: function (player, card, num) {
- if (card.name == "sha" && !player.getHistory("useCard").length) return num + 7;
- },
- },
- trigger: { player: "useCard1" },
- filter: function (event, player) {
- if (event.card.name == "sha" && !game.hasNature(event.card)) return true;
- return false;
- },
- audio: "lihuo",
- locked: false,
- prompt2: function (event) {
- return "将" + get.translation(event.card) + "改为火属性";
- },
- audioname: ["re_chengpu"],
- check: function (event, player) {
- return (
- (event.baseDamage > 1 || player.getHistory("useCard").indexOf(event) == 0) &&
- (player.hp > 1 || player.getExpansions("rechunlao").length) &&
- game.hasPlayer(function (current) {
- return (
- !event.targets.includes(current) &&
- player.canUse(event.card, current) &&
- get.attitude(player, current) < 0 &&
- !current.hasShan() &&
- get.effect(current, { name: "sha", nature: "fire" }, player, player) > 0
- );
- })
- );
- },
- content: function () {
- game.setNature(trigger.card, "fire");
- trigger.lihuo_changed = true;
- },
- group: ["ollihuo2", "ollihuo3", "ollihuo4"],
- ai: {
- fireAttack: true,
- },
- },
- ollihuo2: {
- trigger: { player: "useCard2" },
- filter: function (event, player) {
- if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false;
- return game.hasPlayer(function (current) {
- return (
- !event.targets.includes(current) &&
- lib.filter.targetEnabled(event.card, player, current) &&
- lib.filter.targetInRange(event.card, player, current)
- );
- });
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("ollihuo"),
- "为" + get.translation(trigger.card) + "增加一个目标",
- function (card, player, target) {
- return (
- !_status.event.sourcex.includes(target) &&
- lib.filter.targetInRange(_status.event.card, player, target) &&
- lib.filter.targetEnabled(_status.event.card, player, target)
- );
- }
- )
- .set("sourcex", trigger.targets)
- .set("card", trigger.card)
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, _status.event.card, player, player);
- });
- "step 1";
- if (result.bool) {
- if (!event.isMine() && !_status.connectMode) game.delayx();
- event.target = result.targets[0];
- } else {
- event.finish();
- }
- "step 2";
- player.logSkill("ollihuo", event.target);
- trigger.targets.push(event.target);
- },
- },
- ollihuo3: {
- trigger: { player: "useCardEnd" },
- filter: function (event, player) {
- return (
- event.lihuo_changed == true &&
- player.getHistory("sourceDamage", function (evt) {
- return evt.card == event.card;
- }).length > 0
- );
- },
- forced: true,
- audio: "lihuo",
- audioname: ["re_chengpu"],
- content: function () {
- player.loseHp();
- },
- },
- ollihuo4: {
- trigger: { player: "useCardAfter" },
- frequent: true,
- audio: "lihuo",
- audioname: ["re_chengpu"],
- filter: function (event, player) {
- return (
- event.card.name == "sha" &&
- player.getHistory("useCard").indexOf(event) == 0 &&
- event.cards.filterInD().length > 0
- );
- },
- content: function () {
- var cards = trigger.cards.filterInD();
- player.addToExpansion("gain2", cards).gaintag.add("rechunlao");
- },
- },
- rezhongyong: {
- trigger: { player: "useCardAfter" },
- audio: 2,
- direct: true,
- filter: function (event, player) {
- return event.card.name == "sha";
- },
- content: function () {
- "step 0";
- event.cards = trigger.cards.filterInD();
- game.countPlayer2(function (current) {
- current.getHistory("useCard", function (evt) {
- if (evt.card.name == "shan" && evt.getParent(3) == trigger)
- event.cards.addArray(evt.cards.filterInD("od"));
- });
- });
- if (!event.cards.length) event.finish();
- player
- .chooseTarget(
- get.prompt2("rezhongyong"),
- "令一名其他角色获得" + get.translation(event.cards),
- function (card, player, target) {
- return !_status.event.source.includes(target) && target != player;
- }
- )
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- })
- .set("source", trigger.targets);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("rezhongyong", target);
- target.gain(cards, "gain2");
- var red = false,
- black = false;
- for (var i of cards) {
- var color = get.color(i, false);
- if (color == "red") red = true;
- if (color == "black") black = true;
- if (red && black) break;
- }
- if (red)
- target
- .chooseToUse("是否使用一张杀?", { name: "sha" })
- .set("filterTarget", function (card, player, target) {
- return (
- target != _status.event.sourcex &&
- _status.event.sourcex.inRange(target) &&
- lib.filter.targetEnabled.apply(this, arguments)
- );
- })
- .set("sourcex", player)
- .set("addCount", false);
- if (black) target.draw();
- }
- },
- },
- //长标
- changbiao: {
- audio: 2,
- mod: {
- targetInRange: function (card, player, target) {
- if (card.changbiao) return true;
- },
- },
- enable: "phaseUse",
- usable: 1,
- viewAs: {
- name: "sha",
- changbiao: true,
- },
- locked: false,
- filter: function (event, player) {
- return player.countCards("hs") > 0;
- },
- filterCard: true,
- selectCard: [1, Infinity],
- position: "hs",
- check: function (card) {
- let player = _status.event.player;
- if (ui.selected.cards.length) {
- let list = game
- .filterPlayer(function (current) {
- return (
- current !== player &&
- player.canUse("sha", current, false) &&
- get.effect(current, { name: "sha" }, player, player) > 0
- );
- })
- .sort(function (a, b) {
- return (
- get.effect(b, { name: "sha" }, player, player) -
- get.effect(a, { name: "sha" }, player, player)
- );
- });
- if (!list.length) return 0;
- let target = list[0],
- cards = ui.selected.cards.concat([card]),
- color = [];
- for (let i of cards) {
- if (!color.includes(get.color(i, player))) color.add(get.color(i, player));
- }
- if (color.length !== 1) color[0] = "none";
- if (
- player.hasSkillTag(
- "directHit_ai",
- true,
- {
- target: target,
- card: {
- name: "sha",
- suit: "none",
- color: color[0],
- cards: cards,
- isCard: true,
- },
- },
- true
- )
- )
- return 6.5 - get.value(card, player);
- if (
- Math.random() * target.countCards("hs") < 1 ||
- player.needsToDiscard(0, (i, player) => {
- return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i);
- })
- )
- return 6 - get.value(card, player);
- return 0;
- }
- return 6.3 - get.value(card);
- },
- onuse: function (result, player) {
- player.addTempSkill("changbiao_draw");
- },
- subSkill: {
- draw: {
- trigger: { player: "phaseUseEnd" },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- return (
- player.getHistory("sourceDamage", function (evxt) {
- var evt = evxt.getParent();
- return (
- evt &&
- evt.name == "sha" &&
- evt.skill == "changbiao" &&
- evt.getParent("phaseUse") == event
- );
- }).length > 0
- );
- },
- content: function () {
- var num = 0;
- player.getHistory("sourceDamage", function (evxt) {
- var evt = evxt.getParent();
- if (
- evt &&
- evt.name == "sha" &&
- evt.skill == "changbiao" &&
- evt.getParent("phaseUse") == trigger
- )
- num += evt.cards.length;
- });
- player.draw(num);
- },
- },
- },
- ai: {
- order: function (item, player) {
- return (
- get.order({ name: "sha" }, player) +
- 0.3 *
- (Math.min(
- player.getCardUsable("sha"),
- player.countCards("hs", "sha") +
- player.hasCard(function (card) {
- return card.name != "sha" && get.value(card, player) < 6.3;
- }, "hs")
- ? 1
- : 0
- ) > 1
- ? -1
- : 1)
- );
- },
- nokeep: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag === "nokeep") {
- let num = 0;
- if (arg && (!arg.card || get.name(arg.card) !== "tao")) return false;
- player.getHistory("sourceDamage", function (evxt) {
- let evt = evxt.getParent();
- if (evt && evt.name == "sha" && evt.skill == "changbiao")
- num += evt.cards.length;
- });
- return player.needsToDiscard(num) > 0;
- }
- },
- },
- },
- //国钟会
- gzquanji: {
- audio: 2,
- trigger: {
- player: "damageEnd",
- source: "damageSource",
- },
- frequent: true,
- preHidden: true,
- filter: function (event, player, name) {
- //if(name=='damageEnd') return true;
- //if(!event.card) return false;
- if (
- player.hasHistory("useSkill", function (evt) {
- return evt.skill == "gzquanji" && evt.event.triggername == name;
- })
- )
- return false;
- return true;
- },
- 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("gzquanji");
- }
- },
- 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("gzquanji").length;
- },
- },
- },
- gzpaiyi: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.getExpansions("gzquanji").length > 0;
- },
- chooseButton: {
- dialog: function (event, player) {
- return ui.create.dialog("排异", player.getExpansions("gzquanji"), "hidden");
- },
- backup: function (links, player) {
- return {
- audio: "gzpaiyi",
- filterTarget: true,
- filterCard: function () {
- return false;
- },
- selectCard: -1,
- card: links[0],
- delay: false,
- content: lib.skill.gzpaiyi.contentx,
- ai: {
- order: 10,
- result: {
- target: function (player, target) {
- if (target != player) return 0;
- if (
- player.getExpansions("gzquanji").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.gzpaiyi_backup.card;
- player.loseToDiscardpile(card);
- "step 1";
- var num = player.getExpansions("gzquanji").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("gzquanji").length;
- if (num == 1) return 8;
- return 1;
- },
- result: {
- player: 1,
- },
- },
- },
- gzquanji2: { charlotte: true },
- xingongji: {
- enable: "phaseUse",
- usable: 1,
- audio: 2,
- position: "he",
- filterCard: true,
- filter: function (event, player) {
- return player.countCards("he") > 0;
- },
- check: function (card) {
- var base = 0,
- player = _status.event.player,
- suit = get.suit(card, player),
- added = false,
- added2 = false,
- added3;
- if (
- get.type(card) == "equip" &&
- game.hasPlayer(function (target) {
- var att = get.attitude(player, target);
- if (att >= 0) return 0;
- if (
- target.countCards("he", function (card) {
- return get.value(card) > 5;
- })
- )
- return -att;
- })
- )
- base += 6;
- var hs = player.getCards("h");
- var muniu = player.getEquip("muniu");
- if (muniu && card != muniu && muniu.cards) hs = hs.concat(muniu.cards);
- for (var i of hs) {
- if (i != card && get.name(i) == "sha") {
- if (get.suit(i, player) == suit) {
- if (player.hasValueTarget(i, false)) {
- added3 = true;
- base += 5.5;
- }
- } else {
- if (player.hasValueTarget(i, false)) added2 = true;
- if (
- !added &&
- !player.hasValueTarget(i, null, true) &&
- player.hasValueTarget(i, false, true)
- ) {
- base += 4;
- added = true;
- }
- }
- }
- }
- if (added3 && !added2) base -= 4.5;
- return base - get.value(card);
- },
- content: function () {
- "step 0";
- if (!player.storage.xingongji2) player.storage.xingongji2 = [];
- player.storage.xingongji2.add(get.suit(cards[0], player));
- player.addTempSkill("xingongji2");
- "step 1";
- if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") {
- player
- .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) {
- return player != target && target.countCards("he") > 0;
- })
- .set("ai", function (target) {
- var att = get.attitude(player, target);
- if (att >= 0) return 0;
- if (
- target.countCards("he", function (card) {
- return get.value(card) > 5;
- })
- )
- return -att;
- return -att * 0.8;
- });
- } else {
- event.finish();
- }
- "step 2";
- if (result.bool) {
- player.line(result.targets, "green");
- player.discardPlayerCard(result.targets[0], "he", true);
- }
- },
- ai: {
- order: 4.5,
- result: {
- player: 1,
- },
- },
- },
- xingongji2: {
- charlotte: true,
- onremove: true,
- mod: {
- attackRangeBase: function () {
- return Infinity;
- },
- cardUsable: function (card, player) {
- if (card.name == "sha") {
- const suit = get.suit(card);
- if (suit === "unsure" || player.storage.xingongji2.includes(suit)) return Infinity;
- }
- },
- aiOrder: function (player, card, num) {
- if (get.name(card) == "sha" && !player.storage.xingongji2.includes(get.suit(card)))
- return num + 1;
- },
- },
- mark: true,
- intro: {
- content: "使用$花色的杀无次数限制",
- },
- },
- xinjiefan: {
- skillAnimation: true,
- animationColor: "wood",
- audio: 2,
- unique: true,
- limited: true,
- enable: "phaseUse",
- filterTarget: true,
- content: function () {
- "step 0";
- player.awakenSkill("xinjiefan");
- event.players = game.filterPlayer(function (current) {
- return current != target && current.inRange(target);
- });
- event.players.sortBySeat();
- "step 1";
- if (event.players.length) {
- event.current = event.players.shift();
- event.current.addTempClass("target");
- player.line(event.current, "green");
- if (event.current.countCards("he") && target.isIn()) {
- event.current
- .chooseToDiscard(
- { subtype: "equip1" },
- "he",
- "弃置一张武器牌或让" + get.translation(target) + "摸一张牌"
- )
- .set("ai", function (card) {
- if (get.attitude(_status.event.player, _status.event.target) < 0)
- return 7 - get.value(card);
- return -1;
- })
- .set("target", target);
- event.tempbool = false;
- } else {
- event.tempbool = true;
- }
- } else {
- if (game.roundNumber <= 1) player.addTempSkill("xinjiefan2");
- event.finish();
- }
- "step 2";
- if (event.tempbool || result.bool == false) {
- target.draw();
- }
- event.goto(1);
- },
- ai: {
- order: 5,
- result: {
- target: function (player, target) {
- if (player.hp > 2 && game.roundNumber > 1) {
- if (game.phaseNumber < game.players.length * 2) return 0;
- }
- var num = 0,
- players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (players[i] != target && players[i].inRange(target)) {
- num++;
- }
- }
- return num;
- },
- },
- },
- },
- xinjiefan2: {
- trigger: { player: "phaseEnd" },
- forced: true,
- popup: false,
- content: function () {
- player.restoreSkill("xinjiefan");
- },
- },
- residi: {
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- audio: 2,
- filter: function (event, player) {
- return (
- player.countCards("he", function (card) {
- if (_status.connectMode) return true;
- return get.type(card) != "basic";
- }) > 0
- );
- },
- content: function () {
- "step 0";
- player
- .chooseCard(
- "he",
- get.prompt("residi"),
- "将一张非基本牌置于武将牌上作为“司”",
- function (card, player) {
- return get.type(card) != "basic";
- }
- )
- .set("ai", function (card) {
- if (get.position(card) == "e") return 5 + player.hp - get.value(card);
- return 7 - get.value(card);
- });
- "step 1";
- if (result.bool) {
- player.logSkill("residi");
- player.addToExpansion(result.cards, "give", player).gaintag.add("residi");
- }
- },
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- group: "residi_push",
- ai: { notemp: true },
- },
- residi_push: {
- trigger: { global: "phaseUseBegin" },
- direct: true,
- filter: function (event, player) {
- return event.player != player && player.getExpansions("residi").length > 0;
- },
- content: function () {
- "step 0";
- player
- .chooseButton([get.prompt("residi", trigger.player), player.getExpansions("residi")])
- .set("ai", function (button) {
- var player = _status.event.player;
- var target = _status.event.getTrigger().player;
- if (get.attitude(player, target) > -1) return 0;
- var card = button.link;
- var color = get.color(button.link, false);
- var eff = target.countCards("h", function (card) {
- return get.color(card, target) == color && target.hasValueTarget(card);
- });
- if (
- !target.countCards("h", function (card) {
- return (
- get.color(card, target) == color &&
- get.name(card, target) == "sha" &&
- target.hasValueTarget(card)
- );
- })
- )
- eff += 1.5;
- if (
- !target.countCards("h", function (card) {
- return (
- get.color(card, target) == color &&
- get.type2(card, target) == "trick" &&
- target.hasValueTarget(card)
- );
- })
- )
- eff += 1.5;
- return eff - 1;
- });
- "step 1";
- if (result.bool) {
- if (!trigger.residi) trigger.residi = [];
- trigger.residi.push(player);
- var card = result.links[0];
- var target = trigger.player;
- player.logSkill("residi", target);
- player.loseToDiscardpile(card);
- var color = get.color(card, false);
- if (!target.storage.residi2) target.storage.residi2 = [];
- target.storage.residi2.add(color);
- target.addTempSkill("residi2", "phaseUseAfter");
- target.markSkill("residi2");
- player.addTempSkill("residi3", "phaseUseAfter");
- }
- },
- },
- residi2: {
- onremove: true,
- mod: {
- cardEnabled: function (card, player) {
- if (player.getStorage("residi2").includes(get.color(card, player))) return false;
- },
- cardRespondable: function (card, player) {
- if (player.getStorage("residi2").includes(get.color(card, player))) return false;
- },
- cardSavable: function (card, player) {
- if (player.getStorage("residi2").includes(get.color(card, player))) return false;
- },
- },
- intro: {
- content: "不能使用或打出$牌",
- },
- marktext: "敌",
- },
- residi3: {
- audio: "residi",
- trigger: { global: "phaseUseEnd" },
- forced: true,
- filter: function (event, player) {
- if (!event.residi || !event.residi.includes(player)) return false;
- var sha = player.canUse("sha", event.player, false),
- trick = true;
- event.player.getHistory("useCard", function (evt) {
- if (evt.getParent("phaseUse") != event) return false;
- if (sha && evt.card.name == "sha") sha = false;
- if (trick && get.type2(evt.card, false) == "trick") trick = false;
- });
- return sha || trick;
- },
- content: function () {
- var sha = player.canUse("sha", trigger.player, false),
- trick = true;
- trigger.player.getHistory("useCard", function (evt) {
- if (evt.getParent("phaseUse") != trigger) return false;
- if (sha && evt.card.name == "sha") sha = false;
- if (trick && get.type2(evt.card, false) == "trick") trick = false;
- });
- if (sha) player.useCard({ name: "sha", isCard: true }, trigger.player);
- if (trick) player.draw(2);
- },
- },
- rehuaiyi: {
- audio: 2,
- enable: "phaseUse",
- usable: 2,
- delay: false,
- filter: function (event, player) {
- return (
- player.countCards("h") > 0 &&
- (!player.getStat("skill").rehuaiyi || player.hasSkill("rehuaiyi2"))
- );
- },
- content: function () {
- "step 0";
- player.showHandcards();
- if (get.color(player.getCards("h")) != "none") {
- player.draw();
- player.addTempSkill("rehuaiyi2", "phaseUseEnd");
- event.finish();
- }
- "step 1";
- player.chooseControl("红色", "黑色").set("ai", function () {
- var player = _status.event.player;
- if (
- player.countCards("h", { color: "red" }) == 1 &&
- player.countCards("h", { color: "black" }) > 1
- )
- return "红色";
- return "黑色";
- });
- "step 2";
- event.control = result.control;
- var cards;
- if (event.control == "红色") {
- cards = player.getCards("h", { color: "red" });
- } else {
- cards = player.getCards("h", { color: "black" });
- }
- player.discard(cards);
- event.num = cards.length;
- "step 3";
- player
- .chooseTarget(
- "请选择至多" +
- get.cnNumber(event.num) +
- "名有牌的其他角色,获得这些角色的各一张牌。",
- [1, event.num],
- function (card, player, target) {
- return target != player && target.countCards("he") > 0;
- }
- )
- .set("ai", function (target) {
- return -get.attitude(_status.event.player, target) + 0.5;
- });
- "step 4";
- if (result.bool && result.targets) {
- player.line(result.targets, "green");
- event.targets = result.targets;
- event.targets.sort(lib.sort.seat);
- event.gained = 0;
- } else {
- event.finish();
- }
- "step 5";
- if (player.isIn() && event.targets.length) {
- player.gainPlayerCard(event.targets.shift(), "he", true);
- } else event.finish();
- "step 6";
- if (result.bool) {
- event.gained += result.cards.length;
- }
- if (event.targets.length) event.goto(5);
- "step 7";
- if (event.gained > 1) player.loseHp();
- },
- ai: {
- order: function (item, player) {
- if (player.countCards("h", { color: "red" }) == 0) return 10;
- if (player.countCards("h", { color: "black" }) == 0) return 10;
- return 1;
- },
- result: {
- player: 1,
- },
- },
- },
- rehuaiyi2: {},
- rezhuikong: {
- audio: 2,
- trigger: { global: "phaseZhunbeiBegin" },
- check: function (event, player) {
- if (get.attitude(player, event.player) < -2) {
- var cards = player.getCards("h");
- if (cards.length > player.hp) return true;
- for (var i = 0; i < cards.length; i++) {
- var useful = get.useful(cards[i]);
- if (useful < 5) return true;
- if (get.number(cards[i]) > 7 && useful < 7) return true;
- }
- }
- return false;
- },
- logTarget: "player",
- filter: function (event, player) {
- return player.hp < player.maxHp && player.canCompare(event.player);
- },
- content: function () {
- "step 0";
- player
- .chooseToCompare(trigger.player)
- .set(
- "small",
- player.hp > 1 &&
- get.effect(player, { name: "sha" }, trigger.player, player) > 0 &&
- Math.random() < 0.9
- );
- "step 1";
- if (result.bool) {
- trigger.player.addTempSkill("zishou2");
- event.finish();
- } else if (result.target && get.position(result.target) == "d")
- player.gain(result.target, "gain2", "log");
- "step 2";
- var card = { name: "sha", isCard: true };
- if (trigger.player.canUse(card, player, false))
- trigger.player.useCard(card, player, false);
- },
- },
- reqiuyuan: {
- audio: 2,
- trigger: { target: "useCardToTarget" },
- direct: true,
- filter: function (event, player) {
- return (
- event.card.name == "sha" &&
- game.hasPlayer(function (current) {
- return (
- current != player &&
- !event.targets.includes(current) &&
- lib.filter.targetEnabled(event.card, event.player, current)
- );
- })
- );
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt2("reqiuyuan"), function (card, player, target) {
- var evt = _status.event.getTrigger();
- return (
- target != player &&
- !evt.targets.includes(target) &&
- lib.filter.targetEnabled(evt.card, evt.player, target)
- );
- })
- .set("ai", function (target) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.player;
- return get.effect(target, trigger.card, trigger.player, player) + 0.1;
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("reqiuyuan", target);
- event.target = target;
- target
- .chooseCard(
- function (card, player) {
- var name = get.name(card, player);
- return name != "sha" && get.type(name) == "basic";
- },
- "h",
- "交给" +
- get.translation(player) +
- "一张不为【杀】的基本牌,或成为此杀的额外目标且不可响应此【杀】"
- )
- .set("ai", function (card) {
- return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1;
- })
- .set("sourcex", player);
- game.delay();
- } else {
- event.finish();
- }
- "step 2";
- if (result.bool) {
- target.give(result.cards, player);
- game.delay();
- } else {
- trigger.getParent().targets.push(event.target);
- trigger.getParent().triggeredTargets2.push(event.target);
- trigger.directHit.push(event.target);
- game.log(event.target, "成为了", trigger.card, "的额外目标");
- }
- },
- ai: {
- expose: 0.2,
- effect: {
- target: function (card, player, target) {
- if (card.name != "sha") return;
- var players = game.filterPlayer();
- if (get.attitude(player, target) <= 0) {
- for (var i = 0; i < players.length; i++) {
- var target2 = players[i];
- if (
- player != target2 &&
- target != target2 &&
- player.canUse(card, target2, false) &&
- get.effect(
- target2,
- { name: "shacopy", nature: card.nature, suit: card.suit },
- player,
- target
- ) > 0 &&
- get.effect(
- target2,
- { name: "shacopy", nature: card.nature, suit: card.suit },
- player,
- player
- ) < 0
- ) {
- if (target.hp == target.maxHp) return 0.3;
- return 0.6;
- }
- }
- } else {
- for (var i = 0; i < players.length; i++) {
- var target2 = players[i];
- if (
- player != target2 &&
- target != target2 &&
- player.canUse(card, target2, false) &&
- get.effect(
- target2,
- { name: "shacopy", nature: card.nature, suit: card.suit },
- player,
- player
- ) > 0
- ) {
- if (player.canUse(card, target2)) return;
- if (target.hp == target.maxHp) return [0, 1];
- return [0, 0];
- }
- }
- }
- },
- },
- },
- },
- reenyuan: {
- audio: 2,
- group: ["reenyuan1", "reenyuan2"],
- },
- reenyuan1: {
- audio: "reenyuan",
- trigger: { player: "gainEnd" },
- filter: function (event, player) {
- if (
- !event.source ||
- event.source == player ||
- !event.source.isIn() ||
- event.cards.length < 2
- )
- return false;
- var evt = event.getl(event.source);
- return evt && evt.cards2 && evt.cards2.length > 1;
- },
- check: function (event, player) {
- return get.attitude(player, event.source) > 0;
- },
- logTarget: "source",
- prompt2: "令该角色摸一张牌",
- content: function () {
- trigger.source.draw();
- },
- },
- reenyuan2: {
- audio: "reenyuan",
- trigger: { player: "damageEnd" },
- logTarget: "source",
- filter: function (event, player) {
- return event.source && event.source != player && event.source.isIn();
- },
- check: function (event, player) {
- var att = get.attitude(player, event.source);
- var num = event.source.countCards("h");
- if (att <= 0) return true;
- if (num > 2) return true;
- if (num) return att < 4;
- return false;
- },
- prompt2: "令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。",
- content: function () {
- "step 0";
- event.count = trigger.num;
- "step 1";
- var target = trigger.source;
- event.count--;
- if (!target.countCards("h")) event._result = { bool: false };
- else
- target
- .chooseCard(
- "h",
- "恩怨:将一张手牌交给" + get.translation(player) + ",或失去1点体力"
- )
- .set("ai", function (card) {
- if (
- get.attitude(_status.event.player, _status.event.getParent().player) > 0
- ) {
- if (get.suit(card) != "heart") return 15 - get.value(card);
- return 11 - get.value(card);
- } else {
- var num = 12 - _status.event.player.hp * 2;
- if (get.suit(card) != "heart") num -= 2;
- return num - get.value(card);
- }
- });
- "step 2";
- var target = trigger.source;
- if (result.bool) {
- var card = result.cards[0];
- event.card = card;
- target.give(card, player);
- } else {
- target.loseHp();
- event.goto(4);
- }
- "step 3";
- if (get.suit(card) != "heart") player.draw();
- "step 4";
- var target = trigger.source;
- if (target.isIn() && event.count > 0 && player.hasSkill("reenyuan"))
- player
- .chooseBool(
- get.prompt("reenyuan", target),
- "令该角色选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。"
- )
- .set("ai", function () {
- var evt = _status.event.getTrigger();
- return lib.skill.reenyuan2.check(evt, evt.player);
- });
- else event.finish();
- "step 5";
- if (result.bool) {
- player.logSkill("reenyuan2", trigger.source);
- event.goto(1);
- }
- },
- },
- rexuanhuo: {
- audio: 2,
- trigger: { player: "phaseDrawEnd" },
- direct: true,
- filter: function (event, player) {
- return player.countCards("h") > 1 && game.countPlayer() > 2;
- },
- content: function () {
- "step 0";
- var ai2 = function (target) {
- var player = _status.event.player;
- if (get.attitude(player, target) <= 0) return 0;
- var list = [null, "juedou"].concat(lib.inpile_nature);
- if (target.hasSkill("ayato_zenshen")) list.push("kami");
- var num = Math.max.apply(
- Math,
- list.map(function (i) {
- if (i == "juedou")
- return target.getUseValue({ name: "juedou", isCard: true }, false);
- var card = { name: "sha", nature: i, isCard: true };
- return target.getUseValue(card, false);
- })
- );
- if (target.hasSkillTag("nogain")) num /= 4;
- return num;
- };
- player.chooseCardTarget({
- prompt: get.prompt2("rexuanhuo"),
- filterCard: true,
- selectCard: 2,
- position: "h",
- filterTarget: lib.filter.notMe,
- goon: game.hasPlayer(function (current) {
- return current != player && ai2(player, current) > 0;
- }),
- ai1: function (card) {
- if (!_status.event.goon) return 0;
- return 7 - get.value(card);
- },
- ai2: ai2,
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("rexuanhuo", target);
- player.give(result.cards, target);
- } else event.finish();
- "step 2";
- if (
- game.hasPlayer(function (current) {
- return current != player && current != target;
- })
- )
- player
- .chooseTarget(
- function (card, player, target) {
- return target != player && target != _status.event.target;
- },
- "选择" + get.translation(target) + "使用【杀】或【决斗】的目标",
- true
- )
- .set("target", target)
- .set("ai", function (target) {
- var evt = _status.event;
- var list = [null, "juedou"].concat(lib.inpile_nature);
- if (evt.target.hasSkill("ayato_zenshen")) list.push("kami");
- return Math.max.apply(
- Math,
- list.map(function (i) {
- var card = { name: "sha", isCard: true };
- if (i == "juedou") card.name = "juedou";
- else if (i) card.nature = i;
- if (!evt.target.canUse(card, target, false)) return 0;
- return get.effect(target, card, evt.target, evt.player);
- })
- );
- });
- else event.finish();
- "step 3";
- var target2 = result.targets[0];
- event.target2 = target2;
- player.line(target2);
- game.log(player, "选择了", target2);
- var list = lib.inpile_nature.slice(0);
- list.unshift(null);
- var vcards = [];
- if (target.hasSkill("ayato_zenshen")) list.add("kami");
- for (var i of list) {
- if (target.canUse({ name: "sha", isCard: true, nature: i }, target2, false))
- vcards.push(["基本", "", "sha", i]);
- }
- if (target.canUse({ name: "juedou", isCard: true }, target2, false))
- vcards.push(["基本", "", "juedou"]);
- if (!vcards.length) {
- if (!target.countCards("h")) event.finish();
- else event._result = { index: 1 };
- } else if (!target.countCards("h")) {
- event.vcards = vcards;
- event._result = { index: 0 };
- } else {
- event.vcards = vcards;
- target
- .chooseControl()
- .set("choiceList", [
- "视为对" + get.translation(target2) + "使用任意一种【杀】或【决斗】",
- "将所有手牌交给" + get.translation(player),
- ]);
- }
- "step 4";
- if (result.index == 0) {
- if (event.vcards.length == 1) event._result = { links: event.vcards, bool: true };
- else
- target
- .chooseButton(
- [
- "请选择要对" + get.translation(event.target2) + "使用的牌",
- [event.vcards, "vcard"],
- ],
- true
- )
- .set("ai", function (button) {
- var player = _status.event.player;
- return get.effect(
- _status.event.getParent().target2,
- { name: button.link[2], isCard: true, nature: button.link[3] },
- player,
- player
- );
- });
- } else {
- target.give(target.getCards("h"), player, "giveAuto");
- event.finish();
- }
- "step 5";
- if (result.bool)
- target.useCard(
- { name: result.links[0][2], isCard: true, nature: result.links[0][3] },
- false,
- event.target2
- );
- },
- ai: {
- expose: 0.17,
- fireAttack: true,
- skillTagFilter: function (player) {
- return player.hasFriend();
- },
- },
- },
- decadezongshi: {
- audio: 2,
- mod: {
- maxHandcard: function (player, num) {
- return num + game.countGroup();
- },
- },
- trigger: { target: "useCardToTargeted" },
- forced: true,
- filter: function (event, player) {
- return (
- player != _status.currentPhase &&
- player.countCards("h") >= player.getHandcardLimit() &&
- (get.type(event.card) == "delay" || get.color(event.card) == "none")
- );
- },
- content: function () {
- trigger.excluded.add(player);
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (
- target != _status.currentPhase &&
- target.countCards("h") >= target.getHandcardLimit() &&
- (get.type(card) == "delay" || get.color(card) == "none")
- )
- return "zerotarget";
- },
- },
- },
- },
- decadezishou: {
- audio: 2,
- inherit: "rezishou",
- group: "decadezishou_zhiheng",
- ai: {
- threaten: 1.8,
- },
- },
- decadezishou_zhiheng: {
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- filter: function (event, player) {
- return (
- player.countCards("h") > 0 &&
- !player.getHistory("useCard", function (evt) {
- return (
- evt.targets.filter(function (target) {
- return target != player;
- }).length > 0
- );
- }).length
- );
- },
- content: function () {
- "step 0";
- var list = [];
- var hs = player.getCards("h");
- for (var i of hs) {
- list.add(get.suit(i, player));
- }
- player
- .chooseToDiscard(
- "h",
- get.prompt("decadezishou"),
- "弃置任意张花色不同的手牌并摸等量的牌",
- [1, list.length],
- function (card, player) {
- if (ui.selected.cards.length) {
- var suit = get.suit(card, player);
- for (var i of ui.selected.cards) {
- if (get.suit(i, player) == suit) return false;
- }
- }
- return true;
- }
- )
- .set("ai", lib.skill.zhiheng.check)
- .set("complexCard", true).logSkill = "decadezishou";
- "step 1";
- if (result.bool) {
- player.draw(result.cards.length);
- }
- },
- },
- yongjin: {
- audio: 2,
- audioname: ["xin_lingtong"],
- unique: true,
- limited: true,
- skillAnimation: true,
- animationColor: "wood",
- enable: "phaseUse",
- filter: function (event, player, cards) {
- return game.hasPlayer(function (current) {
- var es = current.getCards("e", function (card) {
- return !cards || !cards.includes(card);
- });
- for (var i = 0; i < es.length; i++) {
- if (
- game.hasPlayer(function (current2) {
- return (
- current != current2 && !current2.isMin() && current2.canEquip(es[i])
- );
- })
- ) {
- return true;
- }
- }
- });
- },
- content: function () {
- "step 0";
- player.awakenSkill("yongjin");
- event.count = 3;
- event.cards = [];
- "step 1";
- event.count--;
- if (!lib.skill.yongjin.filter(null, player, cards)) {
- event.finish();
- return;
- }
- var next = player.chooseTarget(2, function (card, player, target) {
- if (ui.selected.targets.length) {
- var from = ui.selected.targets[0];
- if (target.isMin()) return false;
- var es = from.getCards("e", function (card) {
- return !_status.event.cards.includes(card);
- });
- for (var i = 0; i < es.length; i++) {
- if (target.canEquip(es[i])) return true;
- }
- return false;
- } else {
- return (
- target.countCards("e", function (card) {
- return !_status.event.cards.includes(card);
- }) > 0
- );
- }
- });
- next.set("ai", function (target) {
- var player = _status.event.player;
- var att = get.attitude(player, target);
- var sgnatt = get.sgn(att);
- if (ui.selected.targets.length == 0) {
- if (target == player && player.hasSkill("decadexuanfeng")) {
- if (
- player.countCards("e", function (card) {
- return (
- !_status.event.cards.includes(card) &&
- game.hasPlayer(function (current) {
- return (
- current != target &&
- current.canEquip(card) &&
- get.effect(current, card, player, player) < 0
- );
- })
- );
- }) > 0
- )
- return 18;
- return 7;
- } else if (att > 0) {
- if (
- target.countCards("e", function (card) {
- return (
- get.value(card, target) < 0 &&
- !_status.event.cards.includes(card) &&
- game.hasPlayer(function (current) {
- return (
- current != target &&
- current.canEquip(card) &&
- get.effect(current, card, player, player) < 0
- );
- })
- );
- }) > 0
- )
- return 9;
- } else if (att < 0) {
- if (
- game.hasPlayer(function (current) {
- if (current != target && get.attitude(player, current) > 0) {
- var es = target.getCards("e", function (card) {
- return !_status.event.cards.includes(card);
- });
- for (var i = 0; i < es.length; i++) {
- if (
- get.value(es[i], target) > 0 &&
- current.canEquip(card) &&
- get.effect(current, es[i], player, current) > 0
- )
- return true;
- }
- }
- })
- ) {
- return -att;
- }
- }
- return 0;
- }
- var es = ui.selected.targets[0].getCards("e", function (card) {
- return !_status.event.cards.includes(card);
- });
- var i;
- var att2 = get.sgn(get.attitude(player, ui.selected.targets[0]));
- for (i = 0; i < es.length; i++) {
- if (ui.selected.targets[0] == player && player.hasSkill("decadexuanfeng")) {
- var bool = game.hasPlayer(function (current) {
- return (
- get.attitude(player, current) < 0 &&
- current.countDiscardableCards(player, "he") > 0 &&
- get.damageEffect(current, player, player) > 0
- );
- });
- if (
- bool &&
- player.countCards("e", function (card) {
- return (
- !_status.event.cards.includes(card) &&
- target.canEquip(card) &&
- get.effect(target, card, player, player) > 0
- );
- })
- )
- return 2.5 * Math.abs(att);
- else if (bool) return 1 / Math.max(1, Math.abs(att));
- else return get.damageEffect(target, player, player);
- }
- if (
- sgnatt != 0 &&
- att2 != 0 &&
- sgnatt != att2 &&
- get.sgn(get.value(es[i], ui.selected.targets[0])) == -att2 &&
- get.sgn(get.effect(target, es[i], player, target)) == sgnatt &&
- target.canEquip(es[i])
- ) {
- return Math.abs(att);
- }
- }
- if (i == es.length) {
- return 0;
- }
- return -att * get.attitude(player, ui.selected.targets[0]);
- });
- next.set("multitarget", true);
- next.set("cards", cards);
- next.set("targetprompt", ["被移走", "移动目标"]);
- next.set("prompt", "移动场上的一张装备牌");
- "step 2";
- if (result.bool) {
- player.line2(result.targets, "green");
- event.targets = result.targets;
- } else {
- event.finish();
- }
- "step 3";
- game.delay();
- "step 4";
- if (targets.length == 2) {
- player
- .choosePlayerCard(
- "e",
- true,
- function (button) {
- var player = _status.event.player;
- var targets0 = _status.event.targets0;
- var targets1 = _status.event.targets1;
- if (
- get.attitude(player, targets0) > 0 &&
- get.attitude(player, targets1) < 0
- ) {
- if (
- get.value(button.link, targets0) < 0 &&
- get.effect(targets1, button.link, player, targets1) > 0
- )
- return 10;
- return 0;
- } else {
- return (
- get.value(button.link) *
- get.effect(targets1, button.link, player, player)
- );
- }
- },
- targets[0]
- )
- .set("nojudge", event.nojudge || false)
- .set("targets0", targets[0])
- .set("targets1", targets[1])
- .set("filterButton", function (button) {
- if (_status.event.cards.includes(button.link)) return false;
- var targets1 = _status.event.targets1;
- return targets1.canEquip(button.link);
- })
- .set("cards", cards);
- } else {
- event.finish();
- }
- "step 5";
- if (result.bool && result.links.length) {
- var link = result.links[0];
- cards.add(link);
- event.targets[1].equip(link);
- event.targets[0].$give(link, event.targets[1]);
- game.delay();
- } else event.finish();
- "step 6";
- if (event.count > 0) event.goto(1);
- },
- ai: {
- order: 7,
- result: {
- player: function (player) {
- var num = 0;
- var friends = game.filterPlayer(function (current) {
- return get.attitude(player, current) >= 4;
- });
- var vacancies = {
- equip1: 0,
- equip2: 0,
- equip3: 0,
- equip4: 0,
- equip5: 0,
- };
- for (var i = 0; i < friends.length; i++) {
- for (var j = 1; j <= 5; j++) {
- if (friends[i].hasEmptySlot(j)) {
- vacancies["equip" + j]++;
- }
- }
- }
- var sources = game.filterPlayer(function (current) {
- return (
- ((current == player && current.hasSkill("decadexuanfeng")) ||
- get.attitude(player, current) < 0) &&
- current.countCards("e")
- );
- });
- for (var i = 0; i < sources.length; i++) {
- var es = sources[i].getCards("e");
- for (var j = 0; j < es.length; j++) {
- var type = get.subtype(es[j]);
- if (
- sources[i] == player ||
- (vacancies[type] > 0 && get.value(es[j]) > 0)
- ) {
- num++;
- if (
- sources[i] == player &&
- vacancies[type] &&
- game.hasPlayer(function (current) {
- return (
- get.attitude(player, current) < 0 &&
- current.countDiscardableCards(player, "he") > 0 &&
- get.damageEffect(current, player, player) > 0
- );
- })
- )
- num += 0.5;
- if (num >= 3) {
- return 1;
- }
- vacancies[type]--;
- }
- }
- }
- if (num && player.hp == 1) {
- return 0.5;
- }
- return 0;
- },
- },
- },
- },
- decadexuanfeng: {
- audio: "xuanfeng",
- audioname: ["boss_lvbu3", "re_heqi", "xin_lingtong"],
- trigger: {
- player: ["loseAfter", "phaseDiscardEnd"],
- global: [
- "equipAfter",
- "addJudgeAfter",
- "gainAfter",
- "loseAsyncAfter",
- "addToExpansionAfter",
- ],
- },
- direct: true,
- filter: function (event, player) {
- if (_status.dying.length) return false;
- if (event.name == "phaseDiscard") {
- var cards = [];
- player.getHistory("lose", function (evt) {
- if (
- evt &&
- evt.type == "discard" &&
- evt.getParent("phaseDiscard") == event &&
- evt.hs
- )
- cards.addArray(evt.hs);
- });
- return cards.length > 1;
- } else {
- var evt = event.getl(player);
- return evt && evt.es && evt.es.length > 0;
- }
- },
- content: function () {
- "step 0";
- event.count = 2;
- event.targets = [];
- event.logged = false;
- "step 1";
- event.count--;
- player
- .chooseTarget(
- get.prompt("decadexuanfeng"),
- "弃置一名其他角色的一张牌",
- function (card, player, target) {
- if (player == target) return false;
- return target.countDiscardableCards(player, "he");
- }
- )
- .set("ai", function (target) {
- return -get.attitude(_status.event.player, target);
- });
- "step 2";
- if (result.bool) {
- if (!event.logged) {
- player.logSkill("decadexuanfeng", result.targets);
- event.logged = true;
- } else player.line(result.targets[0], "green");
- targets.add(result.targets[0]);
- player.discardPlayerCard(result.targets[0], "he", true);
- } else if (!targets.length) event.finish();
- "step 3";
- if (event.count) event.goto(1);
- else if (player == _status.currentPhase) {
- player
- .chooseTarget("是否对一名目标角色造成1点伤害", function (card, player, target) {
- return _status.event.targets.includes(target);
- })
- .set("targets", targets)
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- } else event.finish();
- "step 4";
- if (result.bool) {
- player.line(result.targets[0], "thunder");
- result.targets[0].damage();
- }
- },
- ai: {
- effect: {
- player_use: function (card, player, target) {
- if (
- player == target &&
- get.type(card) == "equip" &&
- player.countCards("hes", function (cardx) {
- return (
- card != cardx &&
- (!card.cards || !card.cards.includes(cardx)) &&
- (player.hasSkill("yongjin") ||
- get.subtype(card) == get.subtype(cardx)) &&
- (get.position(cardx) == "e" || player.canUse(cardx, player))
- );
- }) > 0
- )
- return;
- if (
- !game.hasPlayer(function (current) {
- return (
- get.attitude(player, current) < 0 &&
- current.countDiscardableCards(player, "he") > 0 &&
- get.damageEffect(current, player, player) > 0
- );
- })
- )
- return;
- if (
- typeof card == "object" &&
- player.isPhaseUsing() &&
- player.needsToDiscard() == 2 &&
- card.cards &&
- card.cards.filter(function (i) {
- return get.position(i) == "h";
- }).length > 0 &&
- !get.tag(card, "draw") &&
- !get.tag(card, "gain") &&
- !(get.tag(card, "discard") && target == player && player.countCards("e") > 0)
- )
- return "zeroplayertarget";
- },
- target: function (card, player, target, current) {
- if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3];
- if (get.tag(card, "damage") && target.hp > 2) {
- var num1 = target.countCards("h"),
- num2 = target.getHandcardLimit();
- if (num1 > num2) return [1, 1];
- if (num1 == num2) return [1.1, _status.event.player == target ? 3 : 0.5];
- if (num1 == num2 - 1)
- return [0.1, _status.event.player == target ? 4.5 : 0.1];
- }
- if (
- typeof card == "object" &&
- (card.name == "shunshou" ||
- card.name == "guohe" ||
- card.name == "zhujinqiyuan") &&
- target.countCards("h") > 0 &&
- get.attitude(player, target) < 0
- )
- return [1, -1];
- },
- },
- reverseEquip: true,
- noe: true,
- expose: 0.2,
- },
- },
- oltuntian: {
- inherit: "tuntian",
- filter: function (event, player) {
- if (player == _status.currentPhase) {
- if (event.type != "discard") return false;
- var evt = event.getl(player);
- return (
- evt &&
- evt.cards2 &&
- evt.cards2.filter(function (i) {
- return get.name(i, evt.hs.includes(i) ? player : false) == "sha";
- }).length > 0
- );
- }
- if (event.name == "gain" && event.player == player) return false;
- var evt = event.getl(player);
- return evt && evt.cards2 && evt.cards2.length > 0;
- },
- },
- olzaoxian: {
- inherit: "zaoxian",
- content: function () {
- player.awakenSkill("olzaoxian");
- player.loseMaxHp();
- player.addSkills("jixi");
- player.insertPhase();
- },
- ai: {
- combo: "oltuntian"
- },
- },
- rejunxing: {
- enable: "phaseUse",
- audio: 2,
- usable: 1,
- filterCard: true,
- selectCard: [1, Infinity],
- filter: function (event, player) {
- return player.countCards("h") > 0;
- },
- check: function (card) {
- if (ui.selected.cards.length) return -1;
- return 6 - get.value(card);
- },
- filterTarget: function (card, player, target) {
- return player != target;
- },
- content: function () {
- "step 0";
- target
- .chooseToDiscard(
- cards.length,
- "弃置" +
- get.cnNumber(cards.length) +
- "张牌并失去1点体力,或点取消将武将牌翻面并摸" +
- get.cnNumber(cards.length) +
- "张牌",
- "he"
- )
- .set("ai", function (card) {
- if (
- cards.length > 3 ||
- target.hasSkillTag("noturn") ||
- target.isTurnedOver() ||
- ((get.name(card) == "tao" || get.name(card) == "jiu") &&
- lib.filter.cardSavable(card, target, target))
- )
- return -1;
- if (target.hp <= 1) {
- if (
- cards.length < target.getEnemies().length &&
- target.hasCard((cardx) => {
- return (
- (get.name(cardx) == "tao" || get.name(cardx) == "jiu") &&
- lib.filter.cardSavable(cardx, target, target)
- );
- }, "hs")
- )
- return 7 - get.value(card);
- return -1;
- }
- return 24 - 5 * cards.length - 2 * Math.min(4, target.hp) - get.value(card);
- });
- "step 1";
- if (!result.bool) {
- target.turnOver();
- target.draw(cards.length);
- } else target.loseHp();
- },
- ai: {
- order: 2,
- threaten: 1.8,
- result: {
- target: function (player, target) {
- if (target.hasSkillTag("noturn")) return 0;
- if (target.isTurnedOver()) return 2;
- return -1 / (target.countCards("h") + 1);
- },
- },
- },
- },
- rejuece: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- filter: function (event, player) {
- return game.hasPlayer(function (current) {
- return (
- current != player &&
- current.getHistory("lose", function (evt) {
- return evt.cards2 && evt.cards2.length > 0;
- }).length > 0
- );
- });
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("rejuece"),
- "对一名本回合失去过牌的其他角色造成1点伤害",
- function (card, player, target) {
- return _status.event.targets.includes(target);
- }
- )
- .set(
- "targets",
- game.filterPlayer(function (current) {
- return (
- current != player &&
- current.getHistory("lose", function (evt) {
- return evt.cards2 && evt.cards2.length > 0;
- }).length > 0
- );
- })
- )
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("rejuece", target);
- target.damage();
- }
- },
- },
- remieji: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.countCards("h", { type: ["trick", "delay"], color: "black" });
- },
- filterCard: function (card) {
- return get.color(card) == "black" && get.type(card, "trick") == "trick";
- },
- filterTarget: function (card, player, target) {
- return target != player && target.countCards("he") > 0;
- },
- discard: false,
- delay: false,
- loseTo: "cardPile",
- insert: true,
- visible: true,
- check: function (card) {
- return 8 - get.value(card);
- },
- content: function () {
- "step 0";
- player.showCards(cards);
- "step 1";
- if (
- !target.countCards("he", function (card) {
- if (get.type2(card) == "trick") return true;
- return lib.filter.cardDiscardable(card, target, "remieji");
- })
- )
- event.finish();
- else
- target
- .chooseCard("he", true, function (card, player) {
- if (get.type2(card) == "trick") return true;
- return lib.filter.cardDiscardable(card, player, "remieji");
- })
- .set(
- "prompt",
- "选择交给" + get.translation(player) + "一张锦囊牌,或依次弃置两张非锦囊牌。"
- );
- "step 2";
- if (result.cards && result.cards.length) {
- if (get.type2(result.cards[0]) == "trick") {
- target.give(result.cards, player);
- event.finish();
- } else target.discard(result.cards);
- } else event.finish();
- "step 3";
- if (
- target.countCards("he", function (card) {
- return get.type2(card) != "trick";
- })
- )
- target.chooseToDiscard("he", true, function (card) {
- return get.type2(card) != "trick";
- });
- },
- ai: {
- order: 9,
- result: {
- target: -1,
- },
- },
- },
- decadelihuo: {
- trigger: { player: "useCard1" },
- filter: function (event, player) {
- if (event.card.name == "sha" && !game.hasNature(event.card)) return true;
- return false;
- },
- audio: "lihuo",
- prompt2: function (event) {
- return "将" + get.translation(event.card) + "改为火属性";
- },
- audioname: ["re_chengpu"],
- check: function (event, player) {
- return (
- event.baseDamage > 1 &&
- game.hasPlayer(function (current) {
- return (
- !event.targets.includes(current) &&
- player.canUse(event.card, current) &&
- get.attitude(player, current) < 0 &&
- !current.hasShan() &&
- get.effect(current, { name: "sha", nature: "fire" }, player, player) > 0
- );
- })
- );
- },
- content: function () {
- game.setNature(trigger.card, "fire");
- },
- group: ["decadelihuo2", "decadelihuo3"],
- ai: {
- fireAttack: true,
- },
- },
- decadelihuo2: {
- trigger: { player: "useCard2" },
- filter: function (event, player) {
- if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false;
- return game.hasPlayer(function (current) {
- return !event.targets.includes(current) && player.canUse(event.card, current);
- });
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("decadelihuo"),
- "为" + get.translation(trigger.card) + "增加一个目标",
- function (card, player, target) {
- return (
- !_status.event.sourcex.includes(target) &&
- player.canUse(_status.event.card, target)
- );
- }
- )
- .set("sourcex", trigger.targets)
- .set("card", trigger.card)
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, _status.event.card, player, player);
- });
- "step 1";
- if (result.bool) {
- if (!event.isMine() && !_status.connectMode) game.delayx();
- event.target = result.targets[0];
- } else {
- event.finish();
- }
- "step 2";
- player.logSkill("decadelihuo", event.target);
- trigger.targets.push(event.target);
- },
- },
- decadelihuo3: {
- trigger: { player: "useCardAfter" },
- filter: function (event, player) {
- return (
- event.card.name == "sha" &&
- game.hasNature(event.card, "fire") &&
- event.targets.length > 1 &&
- player.getHistory("sourceDamage", function (evt) {
- return evt.card == event.card;
- }).length > 0
- );
- },
- forced: true,
- audio: "lihuo",
- audioname: ["re_chengpu"],
- content: function () {
- player.loseHp();
- },
- },
- decadechunlao: {
- audio: "chunlao",
- audioname: ["re_chengpu"],
- enable: "chooseToUse",
- viewAs: { name: "jiu", isCard: true },
- viewAsFilter: function (player) {
- return !player.isLinked();
- },
- filter: function (event, player) {
- return !player.isLinked();
- },
- filterCard: function () {
- return false;
- },
- selectCard: -1,
- precontent: function () {
- player.logSkill("decadechunlao");
- player.link();
- delete event.result.skill;
- },
- group: ["decadechunlao2", "decadechunlaox"],
- ai: {
- jiuOther: true,
- },
- },
- decadechunlaox: {
- trigger: { player: "damageBegin2" },
- silent: true,
- lastDo: true,
- filter: function (event, player) {
- return !player.isLinked();
- },
- content: function () {
- trigger.decadechunlaox = true;
- },
- },
- decadechunlao2: {
- trigger: {
- source: "damageSource",
- player: "damageEnd",
- },
- prompt: "是否发动【醇醪】将武将牌重置?",
- filter: function (event, player) {
- return player.isLinked() && event.num > 1 && !event.decadechunlaox;
- },
- content: function () {
- player.link();
- },
- },
- oltianxiang: {
- audio: "tianxiang",
- audioname: ["daxiaoqiao", "re_xiaoqiao", "ol_xiaoqiao"],
- trigger: { player: "damageBegin4" },
- direct: true,
- filter: function (event, player) {
- return (
- player.countCards("he", function (card) {
- if (_status.connectMode && get.position(card) == "h") return true;
- return get.suit(card, player) == "heart";
- }) > 0 && event.num > 0
- );
- },
- content: function () {
- "step 0";
- player.chooseCardTarget({
- filterCard: function (card, player) {
- return get.suit(card) == "heart" && lib.filter.cardDiscardable(card, player);
- },
- filterTarget: function (card, player, target) {
- return player != target;
- },
- position: "he",
- ai1: function (card) {
- return 10 - get.value(card);
- },
- ai2: function (target) {
- var att = get.attitude(_status.event.player, target);
- var trigger = _status.event.getTrigger();
- var da = 0;
- if (_status.event.player.hp == 1) {
- da = 10;
- }
- var eff = get.damageEffect(target, trigger.source, target);
- if (att == 0) return 0.1 + da;
- if (eff >= 0 && att > 0) {
- return att + da;
- }
- if (att > 0 && target.hp > 1) {
- if (target.maxHp - target.hp >= 3) return att * 1.1 + da;
- if (target.maxHp - target.hp >= 2) return att * 0.9 + da;
- }
- return -att + da;
- },
- prompt: get.prompt("oltianxiang"),
- prompt2: lib.translate.oltianxiang_info,
- });
- "step 1";
- if (result.bool) {
- player.discard(result.cards);
- var target = result.targets[0];
- player
- .chooseControlList(
- true,
- function (event, player) {
- var target = _status.event.target;
- var att = get.attitude(player, target);
- if (target.hasSkillTag("maihp")) att = -att;
- if (att > 0) {
- return 0;
- } else {
- return 1;
- }
- },
- [
- "令" +
- get.translation(target) +
- "受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5)",
- "令" +
- get.translation(target) +
- "失去1点体力,然后获得" +
- get.translation(result.cards),
- ]
- )
- .set("target", target);
- player.logSkill(event.name, target);
- trigger.cancel();
- event.target = target;
- event.card = result.cards[0];
- } else {
- event.finish();
- }
- "step 2";
- if (typeof result.index == "number") {
- event.index = result.index;
- if (result.index) {
- event.related = event.target.loseHp();
- } else {
- event.related = event.target.damage(trigger.source || "nosource", "nocard");
- }
- } else event.finish();
- "step 3";
- if (event.related.cancelled || target.isDead()) return;
- if (event.index && card.isInPile()) target.gain(card, "gain2");
- else if (target.getDamagedHp()) target.draw(Math.min(5, target.getDamagedHp()));
- },
- ai: {
- maixie_defend: true,
- effect: {
- target: function (card, player, target) {
- if (player.hasSkillTag("jueqing", false, target)) return;
- if (get.tag(card, "damage") && target.countCards("he") > 1) return 0.7;
- },
- },
- },
- },
- olhongyan: {
- audio: "rehongyan",
- mod: {
- suit: function (card, suit) {
- if (suit == "spade") return "heart";
- },
- maxHandcardBase: function (player, num) {
- if (
- player.countCards("e", function (card) {
- return get.suit(card, player) == "heart";
- })
- )
- return player.maxHp;
- },
- },
- },
- piaoling: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- frequent: true,
- content: function () {
- "step 0";
- player.judge(function (card) {
- return get.suit(card) == "heart" ? 2 : 0;
- }).judge2 = function (result) {
- return result.bool ? true : false;
- };
- "step 1";
- event.card = result.card;
- if (result.bool && get.position(event.card, true) == "d") {
- player
- .chooseTarget(
- "令一名角色获得" +
- get.translation(event.card) +
- ",或点【取消】将其置于牌堆顶"
- )
- .set("ai", function (target) {
- var player = _status.event.player;
- var att = get.attitude(player, target);
- if (player == target) att /= 2;
- return att;
- });
- } else event.finish();
- "step 2";
- if (result.targets && result.targets.length) {
- var target = result.targets[0];
- player.line(target, "green");
- target.gain(card, "gain2", "log");
- if (player == target) player.chooseToDiscard("he", true);
- } else {
- card.fix();
- ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
- game.updateRoundNumber();
- }
- },
- },
- xinyicong: {
- mod: {
- globalFrom: function (from, to, current) {
- return current - Math.max(0, from.hp - 1);
- },
- globalTo: function (from, to, current) {
- return current + Math.max(0, to.getDamagedHp() - 1);
- },
- },
- ai: {
- threaten: 0.8,
- },
- },
- rezongshi: {
- audio: 2,
- mod: {
- maxHandcard: function (player, num) {
- return num + game.countGroup();
- },
- },
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- filter: function (event, player) {
- return player.countCards("h") > player.hp;
- },
- content: function () {
- player.addTempSkill("rezongshi_paoxiao");
- },
- },
- rezongshi_paoxiao: {
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return Infinity;
- },
- },
- },
- olbaonue: {
- audio: 2,
- unique: true,
- zhuSkill: true,
- trigger: { global: "damageSource" },
- filter: function (event, player) {
- if (player == event.source || !event.source || event.source.group != "qun") return false;
- return player.hasZhuSkill("olbaonue", event.source);
- },
- direct: true,
- content: function () {
- "step 0";
- event.count = trigger.num;
- "step 1";
- event.count--;
- player.chooseBool("是否发动【暴虐】?").set("choice", get.attitude(player, player) > 0);
- "step 2";
- if (result.bool) {
- player.logSkill("olbaonue", trigger.source);
- player
- .judge(function (card) {
- if (get.suit(card) == "spade") return 4;
- return 0;
- })
- .set("callback", function () {
- if (event.judgeResult.suit == "spade") {
- player.recover();
- if (get.position(event.judgeResult.card, true) == "o")
- player.gain(event.judgeResult.card, "gain2", "log");
- }
- }).judge2 = function (result) {
- return result.bool ? true : false;
- };
- } else {
- event.finish();
- }
- "step 3";
- if (event.count && lib.skill.olbaonue.filter(trigger, player)) event.goto(1);
- },
- },
- rezishou: {
- audio: "zishou",
- audioname: ["re_liubiao"],
- trigger: { player: "phaseDrawBegin2" },
- check: function (event, player) {
- return (
- player.countCards("h") <=
- (player.hasSkill("zongshi") ? player.maxHp : player.hp - 2) ||
- player.skipList.includes("phaseUse") ||
- !player.countCards("h", function (card) {
- return get.tag(card, "damage") && player.hasUseTarget(card);
- })
- );
- },
- filter: function (event, player) {
- return !event.numFixed;
- },
- content: function () {
- trigger.num += game.countGroup();
- player.addTempSkill("rezishou2");
- },
- ai: {
- threaten: 1.5,
- },
- },
- rezishou2: {
- audio: "rezishou",
- trigger: {
- source: "damageBegin2",
- //player:'phaseJieshuBegin',
- },
- forced: true,
- filter: function (event, player) {
- if (event.name == "damage") return event.player != player;
- if (player.getHistory("skipped").includes("phaseUse")) return false;
- return (
- player.getHistory("useCard", function (evt) {
- if (evt.targets && evt.targets.length && evt.isPhaseUsing()) {
- var targets = evt.targets.slice(0);
- while (targets.includes(player)) targets.remove(player);
- return targets.length > 0;
- }
- return false;
- }).length == 0
- );
- },
- popup: false,
- content: function () {
- "step 0";
- if (trigger.name == "damage") {
- player.logSkill("rezishou", trigger.player);
- trigger.cancel();
- event.finish();
- return;
- } else {
- var filterTarget = function (card, player, target) {
- return (
- target != player &&
- target.countCards("e", function (card) {
- return player.canEquip(card);
- })
- );
- };
- if (
- game.hasPlayer(function (current) {
- return filterTarget(null, player, current);
- })
- )
- player
- .chooseTarget(
- filterTarget,
- "是否将一名其他角色装备区内的一张牌移动到自己的装备区?"
- )
- .set("ai", function (target) {
- var player = _status.event.player;
- var att = get.attitude(player, target);
- if (att > 0 && !target.hasSkillTag("noe")) return 0;
- var num = 0;
- target.countCards("e", function (card) {
- if (player.canEquip(card)) {
- var eff = get.effect(player, card, player, player);
- if (eff > num) num = eff;
- }
- });
- if (num <= 0) return 0;
- if (att < 0) return num * -att;
- return 1 / num;
- });
- else event.finish();
- }
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("rezishou", target);
- player
- .choosePlayerCard(target, "e", "将一张装备牌移至你的装备区")
- .set("filterButton", function (button) {
- return _status.event.player.canEquip(button.link);
- });
- } else event.finish();
- "step 2";
- if (result && result.links && result.links.length) {
- game.delay(2);
- target.$give(result.links[0], player, false);
- player.equip(result.links[0]);
- player.addExpose(0.2);
- }
- },
- ai: {
- effect: {
- player: function (card, player, target) {
- if (get.tag(card, "damage")) return "zeroplayertarget";
- },
- },
- },
- },
- decadepojun: {
- shaRelated: true,
- audio: 2,
- trigger: { player: "useCardToPlayered" },
- direct: true,
- filter: function (event, player) {
- return (
- event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0
- );
- },
- content: function () {
- "step 0";
- var next = player.choosePlayerCard(
- trigger.target,
- "he",
- [1, Math.min(trigger.target.hp, trigger.target.countCards("he"))],
- get.prompt("decadepojun", trigger.target)
- );
- next.set("ai", function (button) {
- if (!_status.event.goon) return 0;
- var val = get.value(button.link);
- if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3);
- return val;
- });
- next.set("goon", get.attitude(player, trigger.target) <= 0);
- next.set("forceAuto", true);
- "step 1";
- if (result.bool) {
- event.cards = result.cards;
- var target = trigger.target;
- player.logSkill("decadepojun", trigger.target);
- target.addSkill("decadepojun2");
- target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("decadepojun2");
- } else event.finish();
- "step 2";
- var discard = false,
- draw = false;
- for (var i of cards) {
- var type = get.type2(i);
- if (type == "equip") discard = true;
- if (type == "trick") draw = true;
- }
- if (discard) {
- event.equip = true;
- player
- .chooseButton(
- [
- "选择一张牌置入弃牌堆",
- cards.filter(function (card) {
- return get.type(card) == "equip";
- }),
- ],
- true
- )
- .set("ai", function (button) {
- return get.value(button.link, _status.event.getTrigger().target);
- });
- }
- if (draw) event.draw = true;
- "step 3";
- if (event.equip && result.links && result.links.length) {
- trigger.target.loseToDiscardpile(result.links);
- }
- if (event.draw) player.draw();
- },
- ai: {
- unequip_ai: true,
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- if (get.attitude(player, arg.target) > 0) return false;
- if (tag == "directHit_ai")
- return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1);
- if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true;
- return false;
- },
- },
- },
- decadepojun2: {
- trigger: { global: "phaseEnd" },
- forced: true,
- popup: false,
- charlotte: true,
- filter: function (event, player) {
- return player.getExpansions("decadepojun2").length > 0;
- },
- content: function () {
- "step 0";
- var cards = player.getExpansions("decadepojun2");
- player.gain(cards, "draw");
- game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌");
- "step 1";
- player.removeSkill("decadepojun2");
- },
- intro: {
- markcount: "expansion",
- mark: function (dialog, storage, player) {
- var cards = player.getExpansions("decadepojun2");
- if (player.isUnderControl(true)) dialog.addAuto(cards);
- else return "共有" + get.cnNumber(cards.length) + "张牌";
- },
- },
- },
- hanzhan: {
- audio: 2,
- trigger: {
- global: "chooseToCompareBegin",
- },
- filter: function (event, player) {
- if (player == event.player) return true;
- if (event.targets) return event.targets.includes(player);
- return player == event.target;
- },
- logTarget: function (event, player) {
- if (player != event.player) return event.player;
- return event.targets || event.target;
- },
- prompt2: function (event, player) {
- return "令其改为使用随机的手牌进行拼点";
- },
- check: function (trigger, player) {
- var num = 0;
- var targets =
- player == trigger.player
- ? trigger.targets
- ? trigger.targets.slice(0)
- : [trigger.target]
- : [trigger.player];
- while (targets.length) {
- var target = targets.shift();
- if (target.getCards("h").length > 1) num -= get.attitude(player, target);
- }
- return num > 0;
- },
- content: function () {
- var targets =
- player == trigger.player
- ? trigger.targets
- ? trigger.targets.slice(0)
- : [trigger.target]
- : [trigger.player];
- if (!trigger.fixedResult) trigger.fixedResult = {};
- while (targets.length) {
- var target = targets.shift();
- var hs = target.getCards("h");
- if (hs.length) trigger.fixedResult[target.playerid] = hs.randomGet();
- }
- },
- group: "hanzhan_gain",
- subfrequent: ["gain"],
- },
- hanzhan_gain: {
- trigger: {
- global: "chooseToCompareAfter",
- },
- audio: "hanzhan",
- filter: function (event, player) {
- if (event.preserve) return false;
- if (
- player != event.player &&
- player != event.target &&
- (!event.targets || !event.targets.includes(player))
- )
- return false;
- for (var i of event.lose_list) {
- if (Array.isArray(i[1])) {
- for (var j of i[1]) {
- if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") return true;
- }
- } else {
- var j = i[1];
- if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") return true;
- }
- }
- return false;
- },
- frequent: true,
- prompt2: function (event, player) {
- var cards = [],
- max = 0;
- for (var i of event.lose_list) {
- if (Array.isArray(i[1])) {
- for (var j of i[1]) {
- if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") {
- var num = get.number(j, i[0]);
- if (num > max) {
- cards = [];
- max = num;
- }
- if (num == max) cards.push(j);
- }
- }
- } else {
- var j = i[1];
- if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") {
- var num = get.number(j, i[0]);
- if (num > max) {
- cards = [];
- max = num;
- }
- if (num == max) cards.push(j);
- }
- }
- }
- return "获得" + get.translation(cards);
- },
- content: function () {
- var cards = [],
- max = 0;
- for (var i of trigger.lose_list) {
- if (Array.isArray(i[1])) {
- for (var j of i[1]) {
- if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") {
- var num = get.number(j, i[0]);
- if (num > max) {
- cards = [];
- max = num;
- }
- if (num == max) cards.push(j);
- }
- }
- } else {
- var j = i[1];
- if (get.name(j, i[0]) == "sha" && get.position(j, true) == "o") {
- var num = get.number(j, i[0]);
- if (num > max) {
- cards = [];
- max = num;
- }
- if (num == max) cards.push(j);
- }
- }
- }
- player.gain(cards, "gain2");
- },
- },
- rejianchu: {
- shaRelated: true,
- audio: 2,
- audioname: ["re_pangde"],
- trigger: { player: "useCardToPlayered" },
- filter: function (event, player) {
- return event.card.name == "sha" && event.target.countDiscardableCards(player, "he") > 0;
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .discardPlayerCard(trigger.target, get.prompt("rejianchu", trigger.target))
- .set("ai", function (button) {
- if (!_status.event.att) return 0;
- if (get.position(button.link) == "e") {
- if (get.subtype(button.link) == "equip2") return 2 * get.value(button.link);
- return get.value(button.link);
- }
- return 1;
- })
- .set("logSkill", ["rejianchu", trigger.target])
- .set("att", get.attitude(player, trigger.target) <= 0);
- "step 1";
- if (result.bool && result.links && result.links.length) {
- if (
- get.type(
- result.links[0],
- null,
- result.links[0].original == "h" ? player : false
- ) != "basic"
- ) {
- trigger.getParent().directHit.add(trigger.target);
- player.addTempSkill("rejianchu2");
- player.addMark("rejianchu2", 1, false);
- } else if (trigger.cards) {
- var list = [];
- for (var i = 0; i < trigger.cards.length; i++) {
- if (get.position(trigger.cards[i], true) == "o") list.push(trigger.cards[i]);
- }
- if (list.length) trigger.target.gain(list, "gain2", "log");
- }
- }
- },
- ai: {
- unequip_ai: true,
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag == "directHit_ai")
- return (
- arg.card.name == "sha" &&
- arg.target.countCards("e", function (card) {
- return get.value(card) > 1;
- }) > 0
- );
- if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true;
- return false;
- },
- },
- },
- rejianchu2: {
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return num + player.countMark("rejianchu2");
- },
- },
- onremove: true,
- },
- wulie: {
- trigger: { player: "phaseJieshuBegin" },
- audio: 2,
- direct: true,
- limited: true,
- skillAnimation: true,
- animationColor: "wood",
- unique: true,
- filter: function (event, player) {
- return player.hp > 0;
- },
- content: function () {
- "step 0";
- player
- .chooseTarget([1, player.hp], get.prompt2("wulie"), lib.filter.notMe)
- .set("ai", function (target) {
- var player = _status.event.player;
- if (player.hasUnknown()) return 0;
- if (
- player.hp - ui.selected.targets.length >
- 1 + player.countCards("hs", (card) => player.canSaveCard(card, player))
- )
- return get.attitude(player, target);
- return 0;
- });
- "step 1";
- if (result.bool) {
- var targets = result.targets.sortBySeat();
- player.logSkill("wulie", targets);
- player.awakenSkill("wulie");
- player.loseHp(targets.length);
- while (targets.length) {
- targets[0].addSkill("wulie2");
- targets.shift().addMark("wulie2");
- }
- }
- },
- },
- wulie2: {
- marktext: "烈",
- intro: { name2: "烈", content: "mark" },
- trigger: { player: "damageBegin3" },
- forced: true,
- content: function () {
- trigger.cancel();
- player.removeMark("wulie2", 1);
- if (!player.storage.wulie2) player.removeSkill("wulie2");
- },
- },
- regongji: {
- mod: {
- attackRangeBase: function (player) {
- if (player.getEquips(3).length > 0 || player.getEquips(4).length > 0) return Infinity;
- },
- },
- locked: false,
- enable: "phaseUse",
- usable: 1,
- position: "he",
- filter: function (event, player) {
- return player.hasCard(function (card) {
- return lib.skill.regongji.filterCard(card);
- }, "eh");
- },
- filterCard: function (card, player) {
- return get.type(card) != "basic";
- },
- filterTarget: function (card, player, target) {
- return target != player && target.countDiscardableCards(player, "he") > 0;
- },
- check: function (card) {
- return 4.5 - get.value(card);
- },
- content: function () {
- if (target.countDiscardableCards(player, "he") > 0)
- player.discardPlayerCard(target, "he", true);
- },
- ai: {
- order: 5,
- result: {
- target: function (player, target) {
- var att = get.attitude(player, target);
- var nh = target.countCards("h");
- if (att > 0) {
- if (
- target.getEquip("baiyin") &&
- target.isDamaged() &&
- get.recoverEffect(target, player, player) > 0
- ) {
- if (target.hp == 1 && !target.hujia) return 1.6;
- if (target.hp == 2) return 0.01;
- return 0;
- }
- }
- var es = target.getCards("e");
- var noe = es.length == 0 || target.hasSkillTag("noe");
- var noe2 = es.length == 1 && es[0].name != "tengjia" && get.value(es[0]) <= 0;
- var noh = nh == 0 || target.hasSkillTag("noh");
- if (noh && (noe || noe2)) return 0;
- if (att <= 0 && !target.countCards("he")) return 1.5;
- return -1.5;
- },
- },
- tag: {
- loseCard: 1,
- discard: 1,
- },
- },
- },
- ollongdan: {
- mod: {
- aiValue: function (player, card, num) {
- if (card.name != "sha" && card.name != "shan") return;
- var geti = function () {
- var cards = player.getCards("hs", function (card) {
- return card.name == "sha" || card.name == "shan";
- });
- if (cards.includes(card)) {
- return cards.indexOf(card);
- }
- return cards.length;
- };
- return Math.max(num, [7, 5, 5, 3][Math.min(geti(), 3)]);
- },
- aiUseful: function () {
- return lib.skill.ollongdan.mod.aiValue.apply(this, arguments);
- },
- },
- locked: false,
- audio: "longdan_sha",
- audioname: ["re_zhaoyun"],
- audioname2: { tongyuan: "longdan_tongyuan" },
- hiddenCard: function (player, name) {
- if (name == "tao") return player.countCards("hs", "jiu") > 0;
- if (name == "jiu") return player.countCards("hs", "tao") > 0;
- return false;
- },
- enable: ["chooseToUse", "chooseToRespond"],
- position: "hs",
- prompt: "将杀当做闪,或将闪当做杀,或将桃当做酒,或将酒当做桃使用或打出",
- viewAs: function (cards, player) {
- if (cards.length) {
- var name = false;
- switch (get.name(cards[0], player)) {
- case "sha":
- name = "shan";
- break;
- case "shan":
- name = "sha";
- break;
- case "tao":
- name = "jiu";
- break;
- case "jiu":
- name = "tao";
- break;
- }
- if (name) return { name: name };
- }
- return null;
- },
- check: function (card) {
- var player = _status.event.player;
- if (_status.event.type == "phase") {
- var max = 0;
- var name2;
- var list = ["sha", "tao", "jiu"];
- var map = { sha: "shan", tao: "jiu", jiu: "tao" };
- for (var i = 0; i < list.length; i++) {
- var name = list[i];
- if (
- player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) &&
- player.getUseValue({ name: name }) > 0
- ) {
- var temp = get.order({ name: name });
- if (temp > max) {
- max = temp;
- name2 = map[name];
- }
- }
- }
- if (name2 == get.name(card, player)) return 1;
- return 0;
- }
- return 1;
- },
- filterCard: function (card, player, event) {
- event = event || _status.event;
- var filter = event._backup.filterCard;
- var name = get.name(card, player);
- if (name == "sha" && filter({ name: "shan", cards: [card] }, player, event)) return true;
- if (name == "shan" && filter({ name: "sha", cards: [card] }, player, event)) return true;
- if (name == "tao" && filter({ name: "jiu", cards: [card] }, player, event)) return true;
- if (name == "jiu" && filter({ name: "tao", cards: [card] }, player, event)) return true;
- return false;
- },
- filter: function (event, player) {
- var filter = event.filterCard;
- if (
- filter(get.autoViewAs({ name: "sha" }, "unsure"), player, event) &&
- player.countCards("hs", "shan")
- )
- return true;
- if (
- filter(get.autoViewAs({ name: "shan" }, "unsure"), player, event) &&
- player.countCards("hs", "sha")
- )
- return true;
- if (
- filter(get.autoViewAs({ name: "tao" }, "unsure"), player, event) &&
- player.countCards("hs", "jiu")
- )
- return true;
- if (
- filter(get.autoViewAs({ name: "jiu" }, "unsure"), player, event) &&
- player.countCards("hs", "tao")
- )
- return true;
- return false;
- },
- ai: {
- respondSha: true,
- respondShan: true,
- skillTagFilter: function (player, tag) {
- var name;
- switch (tag) {
- case "respondSha":
- name = "shan";
- break;
- case "respondShan":
- name = "sha";
- break;
- }
- if (!player.countCards("hs", name)) return false;
- },
- order: function (item, player) {
- if (player && _status.event.type == "phase") {
- var max = 0;
- var list = ["sha", "tao", "jiu"];
- var map = { sha: "shan", tao: "jiu", jiu: "tao" };
- for (var i = 0; i < list.length; i++) {
- var name = list[i];
- if (
- player.countCards("hs", map[name]) > (name == "jiu" ? 1 : 0) &&
- player.getUseValue({ name: name }) > 0
- ) {
- var temp = get.order({ name: name });
- if (temp > max) max = temp;
- }
- }
- if (max > 0) max += 0.3;
- return max;
- }
- return 4;
- },
- },
- },
- olyajiao: {
- audio: "reyajiao",
- trigger: { player: "loseAfter" },
- frequent: true,
- filter: function (event, player) {
- return (
- player != _status.currentPhase &&
- event.hs &&
- event.hs.length > 0 &&
- ["useCard", "respond"].includes(event.getParent().name)
- );
- },
- content: function () {
- "step 0";
- event.card = get.cards()[0];
- game.cardsGotoOrdering(event.card);
- event.videoId = lib.status.videoId++;
- var judgestr = get.translation(player) + "发动了【涯角】";
- game.addVideo("judge1", player, [get.cardInfo(event.card), judgestr, event.videoId]);
- game.broadcastAll(
- function (player, card, str, id, cardid) {
- var event;
- if (game.online) {
- event = {};
- } else {
- event = _status.event;
- }
- if (game.chess) {
- event.node = card.copy("thrown", "center", ui.arena).addTempClass("start");
- } else {
- event.node = player.$throwordered(card.copy(), true);
- }
- if (lib.cardOL) lib.cardOL[cardid] = event.node;
- event.node.cardid = cardid;
- event.node.classList.add("thrownhighlight");
- ui.arena.classList.add("thrownhighlight");
- event.dialog = ui.create.dialog(str);
- event.dialog.classList.add("center");
- event.dialog.videoId = id;
- },
- player,
- event.card,
- judgestr,
- event.videoId,
- get.id()
- );
-
- game.log(player, "展示了", event.card);
- game.delay(2);
- if (get.type(event.card, "trick") == get.type(trigger.getParent().card, "trick")) {
- player
- .chooseTarget("选择获得此牌的角色")
- .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 (att > 0) {
- return att + Math.max(0, 5 - target.countCards("h"));
- }
- return att;
- })
- .set("du", event.card.name == "du");
- } else {
- event.disbool = true;
- player
- .chooseTarget(
- "是否弃置攻击范围内包含你的一名角色区域内的一张牌?",
- function (card, player, target) {
- return (
- target.inRange(player) &&
- target.countDiscardableCards(player, "hej") > 0
- );
- }
- )
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, { name: "guohe" }, player, player);
- });
- }
- "step 1";
- if (event.disbool) {
- if (result.bool) {
- player.line(result.targets[0], "green");
- player.discardPlayerCard(result.targets[0], "hej", true);
- }
- event.dialog.close();
- game.addVideo("judge2", null, event.videoId);
- game.addVideo("deletenode", player, [get.cardInfo(event.node)]);
- event.node.delete();
- game.broadcast(
- function (id, card) {
- var dialog = get.idDialog(id);
- if (dialog) {
- dialog.close();
- }
- if (card.clone) {
- card.clone.delete();
- }
- ui.arena.classList.remove("thrownhighlight");
- },
- event.videoId,
- event.card
- );
- ui.arena.classList.remove("thrownhighlight");
- } else if (result.targets) {
- event.dialog.close();
- game.addVideo("judge2", null, event.videoId);
- player.line(result.targets, "green");
- result.targets[0].gain(event.card, "log");
- event.node.moveDelete(result.targets[0]);
- game.addVideo("gain2", result.targets[0], [get.cardInfo(event.node)]);
- ui.arena.classList.remove("thrownhighlight");
- game.broadcast(
- function (card, target, id) {
- var dialog = get.idDialog(id);
- if (dialog) {
- dialog.close();
- }
- ui.arena.classList.remove("thrownhighlight");
- if (card.clone) {
- card.clone.moveDelete(target);
- }
- },
- event.card,
- result.targets[0],
- event.videoId
- );
- } else {
- game.addVideo("deletenode", player, [get.cardInfo(event.node)]);
- event.node.delete();
- game.broadcast(
- function (id) {
- var dialog = get.idDialog(id);
- if (dialog) {
- dialog.close();
- }
- if (card.clone) {
- card.clone.delete();
- }
- ui.arena.classList.remove("thrownhighlight");
- },
- event.videoId,
- event.card
- );
- event.dialog.close();
- game.addVideo("judge2", null, event.videoId);
- ui.arena.classList.remove("thrownhighlight");
- }
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2];
- },
- },
- },
- },
- olpaoxiao: {
- audio: "paoxiao",
- audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"],
- trigger: { player: "shaMiss" },
- forced: true,
- content: function () {
- player.addTempSkill("olpaoxiao2");
- player.addMark("olpaoxiao2", 1, false);
- },
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return Infinity;
- },
- },
- },
- olpaoxiao2: {
- trigger: { source: "damageBegin1" },
- forced: true,
- audio: "paoxiao",
- audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"],
- filter: function (event, player) {
- return event.card && event.card.name == "sha" && player.countMark("olpaoxiao2") > 0;
- },
- onremove: true,
- content: function () {
- trigger.num += player.countMark("olpaoxiao2");
- player.removeSkill("olpaoxiao2");
- },
- intro: { content: "本回合内下一次使用【杀】造成伤害时令伤害值+#" },
- },
- oltishen: {
- audio: "retishen",
- unique: true,
- mark: true,
- skillAnimation: true,
- animationColor: "soil",
- limited: true,
- trigger: { player: "phaseZhunbeiBegin" },
- filter: function (event, player) {
- if (player.storage.oltishen) return false;
- return player.isDamaged();
- },
- check: function (event, player) {
- if (player.hp <= 2 || player.getDamagedHp() > 2) return true;
- if (player.getDamagedHp() <= 1) return false;
- return player.getDamagedHp() < game.roundNumber;
- },
- content: function () {
- player.awakenSkill("oltishen");
- player.recover(player.maxHp - player.hp);
- player.draw(player.maxHp - player.hp);
- },
- intro: {
- content: "limited",
- },
- },
- rexuanfeng: {
- audio: "xuanfeng",
- audioname: ["boss_lvbu3", "re_heqi", "re_lingtong"],
- trigger: {
- player: ["loseAfter", "phaseDiscardEnd"],
- global: [
- "equipAfter",
- "addJudgeAfter",
- "gainAfter",
- "loseAsyncAfter",
- "addToExpansionAfter",
- ],
- },
- direct: true,
- filter: function (event, player) {
- if (
- !game.hasPlayer(function (current) {
- return current != player && current.countCards("he") > 0;
- })
- )
- return false;
- if (event.name == "phaseDiscard") {
- var cards = [];
- player.getHistory("lose", function (evt) {
- if (
- evt &&
- evt.type == "discard" &&
- evt.getParent("phaseDiscard") == event &&
- evt.hs
- )
- cards.addArray(evt.hs);
- });
- return cards.length > 1;
- }
- var evt = event.getl(player);
- return evt && evt.es && evt.es.length > 0;
- },
- content: function () {
- "step 0";
- var list = ["弃置至多两名其他角色的合计两张牌"];
- if (lib.skill.rexuanfeng.canMoveCard(player))
- list.push("将一名其他角色装备区内的一张牌移动到另一名角色的装备区内");
- player
- .chooseControl("cancel2")
- .set("choiceList", list)
- .set("prompt", get.prompt("rexuanfeng"))
- .set("ai", function () {
- if (lib.skill.rexuanfeng.canMoveCard(player, true)) return 1;
- return 0;
- });
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("rexuanfeng");
- if (result.index == 1) event.goto(5);
- else event.count = 2;
- } else event.finish();
- "step 2";
- player
- .chooseTarget("弃置一名其他角色的一张牌", function (card, player, target) {
- if (player == target) return false;
- return target.countDiscardableCards(player, "he");
- })
- .set("ai", function (target) {
- return -get.attitude(_status.event.player, target);
- });
- "step 3";
- if (result.bool) {
- player.line(result.targets[0], "green");
- player.discardPlayerCard(result.targets[0], "he", true);
- event.count--;
- } else event.finish();
- "step 4";
- if (event.count) event.goto(2);
- else event.finish();
- "step 5";
- var next = player.chooseTarget(2, function (card, player, target) {
- if (player == target) return false;
- if (ui.selected.targets.length) {
- var from = ui.selected.targets[0];
- if (target.isMin()) return false;
- var es = from.getCards("e");
- for (var i = 0; i < es.length; i++) {
- if (target.canEquip(es[i])) return true;
- }
- return false;
- } else {
- return target.countCards("e") > 0;
- }
- });
- next.set("ai", function (target) {
- var player = _status.event.player;
- var att = get.attitude(player, target);
- var sgnatt = get.sgn(att);
- if (ui.selected.targets.length == 0) {
- if (att > 0) {
- if (
- target.countCards("e", function (card) {
- return (
- get.value(card, target) < 0 &&
- game.hasPlayer(function (current) {
- return (
- current != player &&
- current != target &&
- get.attitude(player, current) < 0 &&
- current.canEquip(card) &&
- get.effect(current, card, player, player) > 0
- );
- })
- );
- }) > 0
- )
- return 9;
- } else if (att < 0) {
- if (
- game.hasPlayer(function (current) {
- if (
- current != target &&
- current != player &&
- get.attitude(player, current) > 0
- ) {
- var es = target.getCards("e");
- for (var i = 0; i < es.length; i++) {
- if (
- get.value(es[i], target) > 0 &&
- current.canEquip(es[i]) &&
- get.effect(current, es[i], player, player) > 0
- )
- return true;
- }
- }
- })
- ) {
- return -att;
- }
- }
- return 0;
- }
- var es = ui.selected.targets[0].getCards("e");
- var i;
- var att2 = get.sgn(get.attitude(player, ui.selected.targets[0]));
- for (i = 0; i < es.length; i++) {
- if (
- sgnatt != 0 &&
- att2 != 0 &&
- sgnatt != att2 &&
- get.sgn(get.value(es[i], ui.selected.targets[0])) == -att2 &&
- get.sgn(get.value(es[i], target)) == sgnatt &&
- target.canEquip(es[i])
- ) {
- return Math.abs(att);
- }
- }
- if (i == es.length) {
- return 0;
- }
- return -att * get.attitude(player, ui.selected.targets[0]);
- });
- next.set("multitarget", true);
- next.set("targetprompt", ["被移走", "移动目标"]);
- next.set("prompt", event.prompt || "移动场上的一张装备牌");
- next.set("forced", true);
- "step 6";
- if (result.bool) {
- player.line2(result.targets, "green");
- event.targets = result.targets;
- } else {
- event.finish();
- }
- "step 7";
- game.delay();
- "step 8";
- if (targets.length == 2) {
- player
- .choosePlayerCard(
- "e",
- true,
- function (button) {
- var player = _status.event.player;
- var targets0 = _status.event.targets0;
- var targets1 = _status.event.targets1;
- if (get.attitude(player, targets0) > get.attitude(player, targets1)) {
- if (get.value(button.link, targets0) < 0)
- return get.effect(targets1, button.link, player, player);
- return 0;
- } else {
- return (
- get.value(button.link, targets0) *
- get.effect(targets1, button.link, player, player)
- );
- }
- },
- targets[0]
- )
- .set("targets0", targets[0])
- .set("targets1", targets[1])
- .set("filterButton", function (button) {
- var targets1 = _status.event.targets1;
- return targets1.canEquip(button.link);
- });
- } else {
- event.finish();
- }
- "step 9";
- if (result.bool && result.links.length) {
- var link = result.links[0];
- event.targets[1].equip(link);
- event.targets[0].$give(link, event.targets[1]);
- game.delay();
- event.result = { bool: true };
- }
- },
- canMoveCard: function (player, withatt) {
- return game.hasPlayer(function (current) {
- if (player == current) return false;
- var att = get.sgn(get.attitude(player, current));
- if (!withatt || att != 0) {
- var es = current.getCards("e");
- for (var i = 0; i < es.length; i++) {
- if (
- game.hasPlayer(function (current2) {
- if (player == current2) return false;
- if (withatt) {
- if (get.sgn(get.value(es[i], current)) != -att) return false;
- var att2 = get.sgn(get.attitude(player, current2));
- if (att == att2 || att2 != get.sgn(get.value(es[i], current2)))
- return false;
- }
- return (
- current != current2 &&
- !current2.isMin() &&
- current2.canEquip(es[i])
- );
- })
- ) {
- return true;
- }
- }
- }
- });
- },
- ai: {
- effect: {
- target: function (card, player, target, current) {
- if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3];
- },
- },
- reverseEquip: true,
- noe: true,
- },
- },
- rechunlao: {
- trigger: { player: "phaseUseEnd" },
- direct: true,
- audio: 2,
- filter: function (event, player) {
- return (
- player.countCards("h") > 0 &&
- (_status.connectMode || player.countCards("h", "sha") > 0) &&
- !player.getExpansions("rechunlao").length
- );
- },
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- content: function () {
- "step 0";
- player
- .chooseCard(
- [1, Math.max(1, player.countCards("h", "sha"))],
- get.prompt("rechunlao"),
- "将任意张【杀】置于武将牌上作为“醇”",
- { name: "sha" }
- )
- .set("ai", function () {
- return 1;
- });
- "step 1";
- if (result.bool) {
- player.logSkill("rechunlao");
- player.addToExpansion("gain2", result.cards).gaintag.add("rechunlao");
- }
- },
- ai: {
- threaten: 1.4,
- },
- group: "rechunlao2",
- },
- rechunlao2: {
- enable: "chooseToUse",
- filter: function (event, player) {
- return (
- event.type == "dying" &&
- event.dying &&
- event.dying.hp <= 0 &&
- player.getExpansions("rechunlao").length > 0
- );
- },
- filterTarget: function (card, player, target) {
- return target == _status.event.dying;
- },
- direct: true,
- delay: false,
- selectTarget: -1,
- content: function () {
- "step 0";
- player.chooseCardButton(
- get.translation("rechunlao"),
- player.getExpansions("rechunlao"),
- true
- );
- "step 1";
- if (result.bool) {
- player.logSkill("rechunlao");
- event.type = "dying";
- player.loseToDiscardpile(result.links);
- target.useCard({ name: "jiu", isCard: true }, target);
- var natures = get.natureList(result.links[0]);
- if (natures.includes("fire")) player.recover();
- if (natures.includes("thunder")) player.draw(2);
- }
- },
- ai: {
- order: 6,
- skillTagFilter: function (player) {
- return player.getExpansions("rechunlao").length > 0;
- },
- save: true,
- result: {
- target: 3,
- },
- threaten: 1.6,
- },
- },
- reluoying: {
- audio: 2,
- audioname: ["dc_caozhi"],
- group: ["reluoying_discard", "reluoying_judge"],
- subfrequent: ["judge"],
- subSkill: {
- discard: {
- audio: "reluoying",
- audioname: ["dc_caozhi"],
- trigger: { global: ["loseAfter", "loseAsyncAfter"] },
- filter: function (event, player) {
- if (event.type != "discard" || event.getlx === false) return false;
- var cards = event.cards.slice(0);
- var evt = event.getl(player);
- if (evt && evt.cards) cards.removeArray(evt.cards);
- for (var i = 0; i < cards.length; i++) {
- if (
- cards[i].original != "j" &&
- get.suit(cards[i], event.player) == "club" &&
- get.position(cards[i], true) == "d"
- ) {
- return true;
- }
- }
- return false;
- },
- direct: true,
- content: function () {
- "step 0";
- if (trigger.delay == false) game.delay();
- "step 1";
- var cards = [],
- cards2 = trigger.cards.slice(0),
- evt = trigger.getl(player);
- if (evt && evt.cards) cards2.removeArray(evt.cards);
- for (var i = 0; i < cards2.length; i++) {
- if (
- cards2[i].original != "j" &&
- get.suit(cards2[i], trigger.player) == "club" &&
- get.position(cards2[i], true) == "d"
- ) {
- cards.push(cards2[i]);
- }
- }
- if (cards.length) {
- player
- .chooseButton(["落英:选择要获得的牌", cards], [1, cards.length])
- .set("ai", function (button) {
- return get.value(button.link, _status.event.player, "raw");
- });
- }
- "step 2";
- if (result.bool) {
- player.logSkill(event.name);
- player.gain(result.links, "gain2", "log");
- }
- },
- },
- judge: {
- audio: "reluoying",
- audioname: ["dc_caozhi"],
- trigger: { global: "cardsDiscardAfter" },
- direct: true,
- filter: function (event, player) {
- var evt = event.getParent().relatedEvent;
- if (!evt || evt.name != "judge") return;
- if (evt.player == player) return false;
- if (get.position(event.cards[0], true) != "d") return false;
- return get.suit(event.cards[0]) == "club";
- },
- content: function () {
- "step 0";
- player
- .chooseButton(
- ["落英:选择要获得的牌", trigger.cards],
- [1, trigger.cards.length]
- )
- .set("ai", function (button) {
- return get.value(button.link, _status.event.player, "raw");
- });
- "step 1";
- if (result.bool) {
- player.logSkill(event.name);
- player.gain(result.links, "gain2", "log");
- }
- },
- },
- },
- },
- chengzhang: {
- trigger: { player: "phaseZhunbeiBegin" },
- derivation: "rejiushi_mark",
- forced: true,
- unique: true,
- juexingji: true,
- skillAnimation: true,
- animationColor: "water",
- filter: function (event, player) {
- var num = 0;
- player.getAllHistory("sourceDamage", function (evt) {
- num += evt.num;
- });
- if (num >= 7) return true;
- player.getAllHistory("damage", function (evt) {
- num += evt.num;
- });
- return num > 7;
- },
- content: function () {
- player.markSkill("rejiushi_mark");
- player.awakenSkill("chengzhang");
- player.storage.chengzhang = true;
- player.recover();
- player.draw();
- },
- },
- rejiushi: {
- audio: 2,
- audioname: ["mb_caomao"],
- group: ["rejiushi1", "rejiushi2", "rejiushi3", "rejiushi_gain"],
- subfrequent: ["gain"],
- subSkill: {
- gain: {
- audio: "rejiushi",
- trigger: { player: "turnOverAfter" },
- frequent: true,
- filter: function (event, player) {
- return player.storage.chengzhang == true;
- },
- prompt: "是否发动【酒诗】,获得牌堆中的一张锦囊牌?",
- content: function () {
- var card = get.cardPile2(function (card) {
- return get.type2(card) == "trick";
- });
- if (card) player.gain(card, "gain2", "log");
- },
- },
- },
- },
- rejiushi1: {
- hiddenCard: function (player, name) {
- if (name == "jiu") return !player.isTurnedOver();
- return false;
- },
- audio: "rejiushi",
- audioname: ["mb_caomao"],
- enable: "chooseToUse",
- filter: function (event, player) {
- if (player.classList.contains("turnedover")) return false;
- return event.filterCard({ name: "jiu", isCard: true }, player, event);
- },
- content: function () {
- if (_status.event.getParent(2).type == "dying") {
- event.dying = player;
- event.type = "dying";
- }
- player.turnOver();
- player.useCard({ name: "jiu", isCard: true }, player);
- },
- ai: {
- order: 5,
- result: {
- player: function (player) {
- if (_status.event.parent.name == "phaseUse") {
- if (player.countCards("h", "jiu") > 0) return 0;
- if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0;
- if (!player.countCards("h", "sha")) return 0;
- var targets = [];
- var target;
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (get.attitude(player, players[i]) < 0) {
- if (player.canUse("sha", players[i], true, true)) {
- targets.push(players[i]);
- }
- }
- }
- if (targets.length) {
- target = targets[0];
- } else {
- return 0;
- }
- var num = get.effect(target, { name: "sha" }, player, player);
- for (var i = 1; i < targets.length; i++) {
- var num2 = get.effect(targets[i], { name: "sha" }, player, player);
- if (num2 > num) {
- target = targets[i];
- num = num2;
- }
- }
- if (num <= 0) return 0;
- var e2 = target.getEquip(2);
- if (e2) {
- if (e2.name == "tengjia") {
- if (
- !player.countCards("h", { name: "sha", nature: "fire" }) &&
- !player.getEquip("zhuque")
- )
- return 0;
- }
- if (e2.name == "renwang") {
- if (!player.countCards("h", { name: "sha", color: "red" })) return 0;
- }
- if (e2.name == "baiyin") return 0;
- }
- if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1;
- return target.countCards("h") > 3 ? 0 : 1;
- }
- if (player == _status.event.dying || player.isTurnedOver()) return 3;
- },
- },
- effect: {
- target: function (card, player, target) {
- if (card.name == "guiyoujie") return [0, 0.5];
- if (target.isTurnedOver()) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- if (target.hp == 1) return;
- return [1, target.countCards("h") / 2];
- }
- }
- },
- },
- },
- },
- rejiushi2: {
- trigger: { player: "damageBegin3" },
- silent: true,
- firstDo: true,
- filter: function (event, player) {
- return player.classList.contains("turnedover");
- },
- content: function () {
- trigger.rejiushi = true;
- },
- },
- rejiushi3: {
- audio: "rejiushi",
- trigger: { player: "damageEnd" },
- check: function (event, player) {
- return player.isTurnedOver();
- },
- filter: function (event, player) {
- if (event.rejiushi) {
- return true;
- }
- return false;
- },
- prompt: function (event, player) {
- var str = "是否发动【酒诗】,将武将牌翻面";
- if (!player.storage.chengzhang) str += ",并获得牌堆中的一张锦囊牌";
- str += "?";
- return str;
- },
- content: function () {
- delete trigger.rejiushi;
- player.turnOver();
- if (!player.storage.chengzhang) {
- var card = get.cardPile2(function (card) {
- return get.type2(card) == "trick";
- });
- if (card) player.gain(card, "gain2", "log");
- }
- },
- },
- rejiushi_mark: {
- mark: true,
- marktext: "改",
- intro: {
- content:
- "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。",
- },
- },
- rehongyan: {
- audio: 2,
- mod: {
- suit: function (card, suit) {
- if (suit == "spade") return "heart";
- },
- },
- trigger: { player: "loseEnd" },
- filter: function (event, player) {
- if (
- player == _status.currentPhase ||
- !event.visible ||
- player.hp <= player.countCards("h")
- )
- return false;
- for (var i = 0; i < event.cards2.length; i++) {
- if (get.suit(event.cards2[i], player) == "heart") return true;
- }
- return false;
- },
- frequent: true,
- content: function () {
- player.draw();
- },
- },
- reqimou: {
- unique: true,
- limited: true,
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return !player.storage.reqimou;
- },
- init: function (player) {
- player.storage.reqimou = false;
- },
- mark: true,
- intro: {
- content: "limited",
- },
- skillAnimation: true,
- animationColor: "orange",
- content: function () {
- "step 0";
- var num = player.hp - 1;
- if (player.countCards("hs", { name: ["tao", "jiu"] })) {
- num = player.hp;
- }
- var map = {};
- var list = [];
- for (var i = 1; i <= player.hp; i++) {
- var cn = get.cnNumber(i, true);
- map[cn] = i;
- list.push(cn);
- }
- event.map = map;
- player.awakenSkill("reqimou");
- player.storage.reqimou = true;
- player
- .chooseControl(list, function () {
- return get.cnNumber(_status.event.goon, true);
- })
- .set("prompt", "失去任意点体力")
- .set("goon", num);
- "step 1";
- var num = event.map[result.control] || 1;
- player.storage.reqimou2 = num;
- player.loseHp(num);
- player.draw(num);
- player.addTempSkill("reqimou2");
- },
- ai: {
- order: 14,
- result: {
- player: function (player) {
- if (player.hp < 3) return false;
- var mindist = player.hp;
- if (player.countCards("hs", (card) => player.canSaveCard(card, player)))
- mindist++;
- if (
- game.hasPlayer(function (current) {
- return (
- get.distance(player, current) <= mindist &&
- player.canUse("sha", current, false) &&
- get.effect(current, { name: "sha" }, player, player) > 0
- );
- })
- ) {
- return 1;
- }
- return 0;
- },
- },
- },
- },
- reqimou2: {
- onremove: true,
- mod: {
- cardUsable: function (card, player, num) {
- if (typeof player.storage.reqimou2 == "number" && card.name == "sha") {
- return num + player.storage.reqimou2;
- }
- },
- globalFrom: function (from, to, distance) {
- if (typeof from.storage.reqimou2 == "number") {
- return distance - from.storage.reqimou2;
- }
- },
- },
- },
- olniepan: {
- audio: 2,
- unique: true,
- enable: "chooseToUse",
- mark: true,
- skillAnimation: true,
- limited: true,
- animationColor: "orange",
- init: function (player) {
- player.storage.olniepan = false;
- },
- filter: function (event, player) {
- if (player.storage.olniepan) return false;
- if (event.type == "dying") {
- if (player != event.dying) return false;
- return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- player.awakenSkill("olniepan");
- player.storage.olniepan = true;
- player.discard(player.getCards("hej"));
- "step 1";
- player.link(false);
- "step 2";
- player.turnOver(false);
- "step 3";
- player.draw(3);
- "step 4";
- if (player.hp < 3) {
- player.recover(3 - player.hp);
- }
- "step 5";
- player
- .chooseControl("bazhen", "olhuoji", "olkanpo")
- .set("prompt", "选择获得一个技能").ai = function () {
- return ["olhuoji", "bazhen"].randomGet();
- };
- "step 6";
- player.addSkills(result.control);
- },
- derivation: ["bazhen", "olhuoji", "olkanpo"],
- ai: {
- order: 1,
- skillTagFilter: function (player, tag, target) {
- if (player != target || player.storage.olniepan) return false;
- },
- save: true,
- result: {
- player: function (player) {
- if (player.hp <= 0) return 10;
- if (player.hp <= 2 && player.countCards("he") <= 1) return 10;
- return 0;
- },
- },
- threaten: function (player, target) {
- if (!target.storage.olniepan) return 0.6;
- },
- },
- intro: {
- content: "limited",
- },
- },
- rewurong: {
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.countCards("h") > 0;
- },
- filterTarget: function (card, player, target) {
- return target != player && target.countCards("h") > 0;
- },
- content: function () {
- "step 0";
- if (target.countCards("h") == 0 || player.countCards("h") == 0) {
- event.finish();
- return;
- }
- "step 1";
- var sendback = function () {
- if (_status.event != event) {
- return function () {
- event.resultOL = _status.event.resultOL;
- };
- }
- };
- if (player.isOnline()) {
- player.wait(sendback);
- event.ol = true;
- player.send(function () {
- game.me.chooseCard(true).set("glow_result", true).ai = function () {
- return Math.random();
- };
- game.resume();
- });
- } else {
- event.localPlayer = true;
- var hasShan = !target.countCards("h", "shan");
- player.chooseCard(true).set("glow_result", true).ai = function (card) {
- if (hasShan && get.name(card) == "sha") return 1;
- return Math.random();
- };
- }
- if (target.isOnline()) {
- target.wait(sendback);
- event.ol = true;
- target.send(function () {
- var rand = Math.random() < 0.4;
- game.me.chooseCard(true).set("glow_result", true).ai = function (card) {
- if (rand) return card.name == "shan" ? 1 : 0;
- return card.name == "shan" ? 0 : 1;
- };
- game.resume();
- });
- } else {
- event.localTarget = true;
- }
- "step 2";
- if (event.localPlayer) {
- event.card1 = result.cards[0];
- }
- if (event.localTarget) {
- var rand = Math.random() < 0.4;
- target.chooseCard(true).set("glow_result", true).ai = function (card) {
- if (rand) return card.name == "shan" ? 1 : 0;
- return card.name == "shan" ? 0 : 1;
- };
- }
- "step 3";
- if (event.localTarget) {
- event.card2 = result.cards[0];
- }
- if (!event.resultOL && event.ol) {
- game.pause();
- }
- "step 4";
- try {
- if (!event.card1) event.card1 = event.resultOL[player.playerid].cards[0];
- if (!event.card2) event.card2 = event.resultOL[target.playerid].cards[0];
- if (!event.card1 || !event.card2) {
- throw "err";
- }
- } catch (e) {
- console.log(e);
- event.finish();
- return;
- }
- game.broadcastAll(
- function (card1, card2) {
- card1.classList.remove("glow");
- card2.classList.remove("glow");
- },
- event.card1,
- event.card2
- );
- "step 5";
- game.broadcastAll(function () {
- ui.arena.classList.add("thrownhighlight");
- });
- game.addVideo("thrownhighlight1");
- player.$compare(event.card1, target, event.card2);
- game.delay(4);
- "step 6";
- var next = game.createEvent("showCards");
- next.player = player;
- next.cards = [event.card1];
- next.setContent("emptyEvent");
- game.log(player, "展示了", event.card1);
- "step 7";
- var next = game.createEvent("showCards");
- next.player = target;
- next.cards = [event.card2];
- next.setContent("emptyEvent");
- game.log(target, "展示了", event.card2);
- "step 8";
- var name1 = get.name(event.card1);
- var name2 = get.name(event.card2);
- if (name1 == "sha" && name2 != "shan") {
- //player.discard(event.card1).set('animate',false);
- target.$gain2(event.card2);
- var clone = event.card1.clone;
- if (clone) {
- clone.style.transition = "all 0.5s";
- clone.style.transform = "scale(1.2)";
- clone.delete();
- game.addVideo("deletenode", player, get.cardsInfo([clone]));
- }
- game.broadcast(function (card) {
- var clone = card.clone;
- if (clone) {
- clone.style.transition = "all 0.5s";
- clone.style.transform = "scale(1.2)";
- clone.delete();
- }
- }, event.card1);
- target.damage("nocard");
- } else if (name1 != "sha" && name2 == "shan") {
- //player.discard(event.card1).set('animate',false);
- target.$gain2(event.card2);
- var clone = event.card1.clone;
- if (clone) {
- clone.style.transition = "all 0.5s";
- clone.style.transform = "scale(1.2)";
- clone.delete();
- game.addVideo("deletenode", player, get.cardsInfo([clone]));
- }
- game.broadcast(function (card) {
- var clone = card.clone;
- if (clone) {
- clone.style.transition = "all 0.5s";
- clone.style.transform = "scale(1.2)";
- clone.delete();
- }
- }, event.card1);
- player.gainPlayerCard(target, true, "he");
- } else {
- player.$gain2(event.card1);
- target.$gain2(event.card2);
- }
- game.broadcastAll(function () {
- ui.arena.classList.remove("thrownhighlight");
- });
- game.addVideo("thrownhighlight2");
- },
- ai: {
- order: 6,
- result: {
- target: -1,
- },
- },
- },
- cangzhuo: {
- trigger: { player: "phaseDiscardBegin" },
- frequent: true,
- audio: 2,
- filter: function (event, player) {
- return (
- player.getHistory("useCard", function (card) {
- return get.type(card.card, "trick") == "trick";
- }).length == 0
- );
- },
- content: function () {
- player.addTempSkill("cangzhuo2");
- },
- },
- cangzhuo2: {
- mod: {
- ignoredHandcard: function (card, player) {
- if (get.type(card, "trick") == "trick") {
- return true;
- }
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && get.type(card, "trick") == "trick") return false;
- },
- },
- },
- shebian: {
- trigger: { player: "turnOverEnd" },
- check: function (event, player) {
- return player.canMoveCard(true, true);
- },
- filter: function (event, player) {
- return player.canMoveCard(null, true);
- },
- content: function () {
- player.moveCard().nojudge = true;
- },
- },
- rexianzhen: {
- audio: 2,
- 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.player && get.name(result.player, player) == "sha")
- player.addTempSkill("rexianzhen4");
- if (result.bool) {
- player.storage[event.name] = target;
- player.addTempSkill(event.name + 2);
- } else {
- player.addTempSkill(event.name + 3);
- }
- },
- ai: {
- order: function (name, player) {
- var cards = player.getCards("h");
- if (player.countCards("h", "sha") == 0) {
- return 1;
- }
- for (var i = 0; i < cards.length; i++) {
- if (
- cards[i].name != "sha" &&
- get.number(cards[i]) > 11 &&
- get.value(cards[i]) < 7
- ) {
- return 9;
- }
- }
- return get.order({ name: "sha" }) - 1;
- },
- result: {
- player: function (player) {
- if (player.countCards("h", "sha") > 0) return 0;
- var num = player.countCards("h");
- if (num > player.hp) return 0;
- if (num == 1) return -2;
- if (num == 2) return -1;
- return -0.7;
- },
- target: function (player, target) {
- var num = target.countCards("h");
- if (num == 1) return -1;
- if (num == 2) return -0.7;
- return -0.5;
- },
- },
- threaten: 1.3,
- },
- },
- rexianzhen2: {
- charlotte: true,
- mod: {
- targetInRange: function (card, player, target) {
- if (target == player.storage.rexianzhen) return true;
- },
- cardUsableTarget: function (card, player, target) {
- if (target == player.storage.rexianzhen) return true;
- },
- },
- ai: {
- unequip: true,
- skillTagFilter: function (player, tag, arg) {
- if (arg.target != player.storage.rexianzhen) return false;
- },
- },
- },
- rexianzhen3: {
- charlotte: true,
- mod: {
- cardEnabled: function (card) {
- if (card.name == "sha") return false;
- },
- },
- },
- rexianzhen4: {
- mod: {
- ignoredHandcard: function (card, player) {
- if (get.name(card) == "sha") {
- return true;
- }
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && get.name(card) == "sha") {
- return false;
- }
- },
- },
- },
- rejinjiu: {
- mod: {
- cardname: function (card, player) {
- if (card.name == "jiu") return "sha";
- },
- },
- ai: {
- skillTagFilter: function (player) {
- if (!player.countCards("h", "jiu")) return false;
- },
- respondSha: true,
- },
- audio: 2,
- trigger: { player: ["useCard1", "respond"] },
- firstDo: true,
- forced: true,
- filter: function (event, player) {
- return (
- event.card.name == "sha" &&
- !event.skill &&
- event.cards.length == 1 &&
- event.cards[0].name == "jiu"
- );
- },
- content: function () {},
- group: "rejinjiu2",
- global: "rejinjiu3",
- },
- rejinjiu3: {
- mod: {
- cardEnabled: function (card, player) {
- if (
- card.name == "jiu" &&
- _status.currentPhase &&
- _status.currentPhase != player &&
- _status.currentPhase.hasSkill("rejinjiu")
- )
- return false;
- },
- cardSavable: function (card, player) {
- if (
- card.name == "jiu" &&
- _status.currentPhase &&
- _status.currentPhase != player &&
- _status.currentPhase.hasSkill("rejinjiu")
- )
- return false;
- },
- },
- },
- rejinjiu2: {
- audio: "rejinjiu",
- forced: true,
- trigger: { player: "damageBegin3" },
- filter: function (event, player) {
- return event.getParent(2).jiu == true;
- },
- content: function () {
- trigger.num -= trigger.getParent(2).jiu_add;
- },
- ai: {
- filterDamage: true,
- skillTagFilter: function (player, tag, arg) {
- return arg && arg.jiu == true;
- },
- },
- },
- repojun: {
- shaRelated: true,
- audio: 2,
- trigger: { player: "useCardToPlayered" },
- direct: true,
- filter: function (event, player) {
- return (
- event.card.name == "sha" && event.target.hp > 0 && event.target.countCards("he") > 0
- );
- },
- content: function () {
- "step 0";
- var next = player.choosePlayerCard(
- trigger.target,
- "he",
- [1, Math.min(trigger.target.hp, trigger.target.countCards("he"))],
- get.prompt("repojun", trigger.target)
- );
- next.set("ai", function (button) {
- if (!_status.event.goon) return 0;
- var val = get.value(button.link);
- if (button.link == _status.event.target.getEquip(2)) return 2 * (val + 3);
- return val;
- });
- next.set("goon", get.attitude(player, trigger.target) <= 0);
- next.set("forceAuto", true);
- "step 1";
- if (result.bool) {
- var target = trigger.target;
- player.logSkill("repojun", target);
- target.addSkill("repojun2");
- target.addToExpansion("giveAuto", result.cards, target).gaintag.add("repojun2");
- }
- },
- ai: {
- unequip_ai: true,
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- if (get.attitude(player, arg.target) > 0) return false;
- if (tag == "directHit_ai")
- return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1);
- if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true;
- return false;
- },
- },
- group: "repojun3",
- },
- repojun3: {
- audio: "repojun",
- trigger: { source: "damageBegin1" },
- filter: function (event, player) {
- var target = event.player;
- return (
- event.card &&
- event.card.name == "sha" &&
- player.countCards("h") >= target.countCards("h") &&
- player.countCards("e") >= target.countCards("e")
- );
- },
- forced: true,
- locked: false,
- logTarget: "player",
- content: function () {
- trigger.num++;
- },
- },
- repojun2: {
- trigger: { global: "phaseEnd" },
- forced: true,
- popup: false,
- charlotte: true,
- filter: function (event, player) {
- return player.getExpansions("repojun2").length > 0;
- },
- content: function () {
- "step 0";
- var cards = player.getExpansions("repojun2");
- player.gain(cards, "draw");
- game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌");
- "step 1";
- player.removeSkill("repojun2");
- },
- intro: {
- markcount: "expansion",
- mark: function (dialog, storage, player) {
- var cards = player.getExpansions("repojun2");
- if (player.isUnderControl(true)) dialog.addAuto(cards);
- else return "共有" + get.cnNumber(cards.length) + "张牌";
- },
- },
- },
- sishu: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- content: function () {
- "step 0";
- player.chooseTarget(get.prompt2("sishu")).ai = function (target) {
- var att = get.attitude(_status.event.player, target);
- if (target.countMark("sishu2") % 2 == 1) return -att;
- return att;
- };
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("sishu", target);
- target.addSkill("sishu2");
- target.addMark("sishu2", 1, false);
- }
- },
- },
- sishu2: {
- charlotte: true,
- marktext: "思",
- intro: {
- name: "思蜀",
- content: "本局游戏内计算【乐不思蜀】的效果时反转#次",
- },
- mod: {
- judge: function (player, result) {
- if (_status.event.cardname == "lebu" && player.countMark("sishu2") % 2 == 1) {
- if (result.bool == false) {
- result.bool = true;
- } else {
- result.bool = false;
- }
- }
- },
- },
- },
- olruoyu: {
- skillAnimation: true,
- animationColor: "fire",
- audio: 2,
- unique: true,
- juexingji: true,
- zhuSkill: true,
- keepSkill: true,
- derivation: ["rejijiang", "sishu"],
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- filter: function (event, player) {
- if (!player.hasZhuSkill("olruoyu")) return false;
- return player.isMinHp();
- },
- content: function () {
- "step 0";
- player.awakenSkill("olruoyu");
- player.gainMaxHp();
- "step 1";
- if (player.hp < 3) player.recover(3 - player.hp);
- player.addSkills(["sishu", "rejijiang"]);
- },
- },
- olfangquan: {
- audio: 2,
- audioname: ["shen_caopi"],
- trigger: { player: "phaseUseBefore" },
- filter: function (event, player) {
- return player.countCards("h") > 0 && !player.hasSkill("olfangquan3");
- },
- direct: true,
- content: function () {
- "step 0";
- var fang =
- player.countMark("olfangquan2") == 0 &&
- player.hp >= 2 &&
- player.countCards("h") <= player.hp + 2;
- player
- .chooseBool(get.prompt2("olfangquan"))
- .set("ai", function () {
- if (!_status.event.fang) return false;
- return game.hasPlayer(function (target) {
- if (target.hasJudge("lebu") || target == player) return false;
- if (get.attitude(player, target) > 4) {
- return (
- get.threaten(target) /
- Math.sqrt(target.hp + 1) /
- Math.sqrt(target.countCards("h") + 1) >
- 0
- );
- }
- return false;
- });
- })
- .set("fang", fang);
- "step 1";
- if (result.bool) {
- player.logSkill("olfangquan");
- trigger.cancel();
- player.addTempSkill("olfangquan2");
- player.addMark("olfangquan2", 1, false);
- }
- },
- },
- olfangquan2: {
- trigger: { player: "phaseDiscardBegin" },
- forced: true,
- popup: false,
- audio: false,
- onremove: true,
- content: function () {
- "step 0";
- event.count = player.countMark(event.name);
- player.removeMark(event.name, event.count, false);
- "step 1";
- event.count--;
- player
- .chooseToDiscard("是否弃置一张牌并令一名其他角色进行一个额外回合?")
- .set("logSkill", "olfangquan").ai = function (card) {
- return 20 - get.value(card);
- };
- "step 2";
- if (result.bool) {
- player.chooseTarget(true, "请选择进行额外回合的目标角色", lib.filter.notMe).ai =
- function (target) {
- if (target.hasJudge("lebu")) return -1;
- if (get.attitude(player, target) > 4) {
- return (
- get.threaten(target) /
- Math.sqrt(target.hp + 1) /
- Math.sqrt(target.countCards("h") + 1)
- );
- }
- return -1;
- };
- } else event.finish();
- "step 3";
- var target = result.targets[0];
- player.line(target, "fire");
- target.markSkillCharacter("olfangquan", player, "放权", "进行一个额外回合");
- target.insertPhase();
- target.addSkill("olfangquan3");
- if (event.count > 0) event.goto(1);
- },
- },
- olfangquan3: {
- trigger: { player: ["phaseAfter", "phaseCancelled"] },
- forced: true,
- popup: false,
- audio: false,
- content: function () {
- player.unmarkSkill("olfangquan");
- player.removeSkill("olfangquan3");
- },
- },
- olluanji: {
- inherit: "luanji",
- audioname: ["shen_caopi"],
- audio: 2,
- line: false,
- group: "olluanji_remove",
- check: function (card) {
- return 7 - get.value(card);
- },
- },
- olluanji_remove: {
- trigger: { player: "useCard2" },
- direct: true,
- filter: function (event, player) {
- return event.card.name == "wanjian" && event.targets.length > 0;
- },
- line: false,
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("olluanji"),
- "为" + get.translation(trigger.card) + "减少一个目标",
- function (card, player, target) {
- return _status.event.targets.includes(target);
- }
- )
- .set("targets", trigger.targets)
- .set("ai", function (target) {
- var player = _status.event.player;
- return -get.effect(target, _status.event.getTrigger().card, player, player);
- });
- "step 1";
- if (result.bool) {
- player.logSkill("olluanji", result.targets);
- trigger.targets.remove(result.targets[0]);
- }
- },
- },
- olxueyi: {
- audio: 2,
- trigger: { global: "phaseBefore", player: "enterGame" },
- forced: true,
- zhuSkill: true,
- unique: true,
- filter: function (event, player) {
- return (event.name != "phase" || game.phaseNumber == 0) && player.hasZhuSkill("olxueyi");
- },
- content: function () {
- // player.storage.olxueyi_inited=true;
- var num = game.countPlayer(function (current) {
- return current.group == "qun";
- });
- if (num) player.addMark("olxueyi", num * 2);
- },
- marktext: "裔",
- intro: {
- name2: "裔",
- content: "mark",
- },
- mod: {
- maxHandcard: function (player, num) {
- if (player.hasZhuSkill("olxueyi")) return num + player.countMark("olxueyi");
- },
- },
- group: "olxueyi_draw",
- },
- olxueyi_draw: {
- audio: "olxueyi",
- trigger: { player: "phaseUseBegin" },
- prompt2: "弃置一枚「裔」标记,然后摸一张牌",
- check: function (event, player) {
- return player.getUseValue("wanjian") > 0 || !player.needsToDiscard();
- },
- filter: function (event, player) {
- return player.hasZhuSkill("olxueyi") && player.hasMark("olxueyi");
- },
- content: function () {
- player.removeMark("olxueyi", 1);
- player.draw();
- },
- },
- olhunzi: {
- audio: 2,
- audioname: ["re_sunyi"],
- inherit: "hunzi",
- content: function () {
- player.awakenSkill(event.name);
- player.loseMaxHp();
- //player.recover();
- player.addSkills(["reyingzi", "gzyinghun"]);
- player.addTempSkill("olhunzi_effect");
- },
- subSkill: {
- effect: {
- trigger: { player: "phaseJieshuBegin" },
- forced: true,
- popup: false,
- charlotte: true,
- content: function () {
- player.chooseDrawRecover(2, true);
- },
- },
- },
- },
- olzhiba: {
- audio: 2,
- unique: true,
- zhuSkill: true,
- global: "olzhiba2",
- },
- olzhiba2: {
- ai: {
- order: 1,
- result: {
- target: function (player, target) {
- if (
- player.hasZhuSkill("olzhiba") &&
- !player.hasSkill("olzhiba3") &&
- target.group == "wu"
- ) {
- if (
- player.countCards("h", function (card) {
- var val = get.value(card);
- if (val < 0) return true;
- if (val <= 5) {
- return get.number(card) >= 12;
- }
- if (val <= 6) {
- return get.number(card) >= 13;
- }
- return false;
- }) > 0
- )
- return -1;
- return 0;
- } else {
- if (player.countCards("h", "du") && get.attitude(player, target) < 0)
- return -1;
- if (player.countCards("h") <= player.hp) return 0;
- var maxnum = 0;
- var cards2 = target.getCards("h");
- for (var i = 0; i < cards2.length; i++) {
- if (get.number(cards2[i]) > maxnum) {
- maxnum = get.number(cards2[i]);
- }
- }
- if (maxnum > 10) maxnum = 10;
- if (maxnum < 5 && cards2.length > 1) maxnum = 5;
- var cards = player.getCards("h");
- for (var i = 0; i < cards.length; i++) {
- if (get.number(cards[i]) < maxnum) return 1;
- }
- return 0;
- }
- },
- },
- },
- enable: "phaseUse",
- //usable:1,
- prompt: "请选择〖制霸〗的目标",
- filter: function (event, player) {
- if (
- player.hasZhuSkill("olzhiba") &&
- !player.hasSkill("olzhiba3") &&
- game.hasPlayer(function (current) {
- return current != player && current.group == "wu" && player.canCompare(current);
- })
- )
- return true;
- return (
- player.group == "wu" &&
- game.hasPlayer(function (current) {
- return (
- current != player &&
- current.hasZhuSkill("olzhiba", player) &&
- !current.hasSkill("olzhiba3") &&
- player.canCompare(current)
- );
- })
- );
- },
- filterTarget: function (card, player, target) {
- if (
- player.hasZhuSkill("olzhiba") &&
- !player.hasSkill("olzhiba3") &&
- target.group == "wu" &&
- player.canCompare(target)
- )
- return true;
- return (
- player.group == "wu" &&
- target.hasZhuSkill("olzhiba", player) &&
- !target.hasSkill("olzhiba3") &&
- player.canCompare(target)
- );
- },
- prepare: function (cards, player, targets) {
- if (player.hasZhuSkill("olzhiba")) player.logSkill("olzhiba");
- if (targets[0].hasZhuSkill("olzhiba", player)) targets[0].logSkill("olzhiba");
- },
- direct: true,
- clearTime: true,
- contentBefore: function () {
- "step 0";
- var list = [];
- if (
- player.hasZhuSkill("olzhiba") &&
- targets[0].group == "wu" &&
- !player.hasSkill("olzhiba3")
- )
- list.push(player);
- if (
- player.group == "wu" &&
- targets[0].hasZhuSkill("olzhiba") &&
- !targets[0].hasSkill("olzhiba3")
- )
- list.push(targets[0]);
- if (list.length == 1) {
- event.target = list[0];
- event.goto(2);
- } else
- player
- .chooseTarget(
- true,
- "请选择获得所有拼点牌的角色",
- function (card, player, target) {
- return _status.event.list.includes(target);
- }
- )
- .set("list", list);
- "step 1";
- event.target = result.targets[0];
- "step 2";
- target.addTempSkill("olzhiba3", "phaseUseEnd");
- if (target == targets[0]) {
- target
- .chooseBool("是否接受来自" + get.translation(player) + "的拼点请求?")
- .set(
- "choice",
- get.attitude(target, player) > 0 ||
- target.countCards("h", function (card) {
- var val = get.value(card);
- if (val < 0) return true;
- if (val <= 5) {
- return get.number(card) >= 12;
- }
- if (val <= 6) {
- return get.number(card) >= 13;
- }
- return false;
- }) > 0
- )
- .set("ai", function () {
- return _status.event.choice;
- });
- } else event._result = { bool: true };
- "step 3";
- if (result.bool) event.getParent().zhiba_target = target;
- else {
- game.log(target, "拒绝了", player, "的拼点请求");
- target.chat("拒绝");
- }
- },
- content: function () {
- "step 0";
- event.source = event.getParent().zhiba_target;
- if (!event.source) {
- event.finish();
- }
- "step 1";
- player
- .chooseToCompare(target)
- .set("small", target == source && get.attitude(player, target) > 0).clear = false;
- "step 2";
- if ((player == source && result.bool) || (target == source && !result.bool)) {
- event.cards = [result.player, result.target].filterInD("d");
- if (!event.cards.length) event.finish();
- else
- source
- .chooseControl("ok", "cancel2")
- .set("dialog", ["是否获得拼点牌?", event.cards])
- .set("ai", function () {
- if (get.value(event.cards, source, "raw") <= 0) return false;
- return true;
- });
- } else event.finish();
- "step 3";
- if (result.control != "cancel2") source.gain(event.cards, "gain2", "log");
- else ui.clear();
- },
- },
- olzhiba3: {},
- rehuashen: {
- unique: true,
- audio: 2,
- trigger: {
- global: "phaseBefore",
- player: ["enterGame", "phaseBegin", "phaseEnd", "rehuashen"],
- },
- filter: function (event, player, name) {
- if (event.name != "phase") return true;
- if (name == "phaseBefore") return game.phaseNumber == 0;
- return player.storage.rehuashen && player.storage.rehuashen.character.length > 0;
- },
- direct: true,
- content: function () {
- "step 0";
- var name = event.triggername;
- if (trigger.name != "phase" || (name == "phaseBefore" && game.phaseNumber == 0)) {
- player.logSkill("rehuashen");
- lib.skill.rehuashen.addHuashens(player, 3);
- event.logged = true;
- }
- _status.noclearcountdown = true;
- event.videoId = lib.status.videoId++;
- var cards = player.storage.rehuashen.character.slice(0);
- var skills = [];
- var sto = player.storage.rehuashen;
- for (var i in player.storage.rehuashen.map) {
- skills.addArray(player.storage.rehuashen.map[i]);
- }
- var cond = "out";
- if (event.triggername == "phaseBegin") {
- cond = "in";
- }
- skills.randomSort();
- skills.sort(function (a, b) {
- return get.skillRank(b, cond) - get.skillRank(a, cond);
- });
- event.aiChoice = skills[0];
- var choice = "更换技能";
- if (
- event.aiChoice == player.storage.rehuashen.current2 ||
- get.skillRank(event.aiChoice, cond) < 1
- )
- choice = "弃置化身";
- if (player.isOnline2()) {
- player.send(
- function (cards, id) {
- var dialog = ui.create.dialog("是否发动【化身】?", [
- cards,
- (item, type, position, noclick, node) =>
- lib.skill.rehuashen.$createButton(
- item,
- type,
- position,
- noclick,
- node
- ),
- ]);
- dialog.videoId = id;
- },
- cards,
- event.videoId
- );
- }
- event.dialog = ui.create.dialog(get.prompt("rehuashen"), [
- cards,
- (item, type, position, noclick, node) =>
- lib.skill.rehuashen.$createButton(item, type, position, noclick, node),
- ]);
- event.dialog.videoId = event.videoId;
- if (!event.isMine()) {
- event.dialog.style.display = "none";
- }
- if (event.logged) event._result = { control: "更换技能" };
- else
- player
- .chooseControl("弃置化身", "更换技能", "cancel2")
- .set("ai", function () {
- return _status.event.choice;
- })
- .set("choice", choice);
- "step 1";
- event.control = result.control;
- if (event.control == "cancel2") {
- if (player.isOnline2()) {
- player.send("closeDialog", event.videoId);
- }
- delete _status.noclearcountdown;
- if (!_status.noclearcountdown) {
- game.stopCountChoose();
- }
- event.dialog.close();
- event.finish();
- return;
- }
- if (!event.logged) {
- player.logSkill("rehuashen");
- event.logged = true;
- }
- var next = player.chooseButton(true).set("dialog", event.videoId);
- if (event.control == "弃置化身") {
- next.set("selectButton", [1, 2]);
- next.set("filterButton", function (button) {
- return button.link != _status.event.current;
- });
- next.set("current", player.storage.rehuashen.current);
- } else {
- next.set("ai", function (button) {
- return player.storage.rehuashen.map[button.link].includes(_status.event.choice)
- ? 2.5
- : 1 + Math.random();
- });
- next.set("choice", event.aiChoice);
- }
- var prompt = event.control == "弃置化身" ? "选择制衡至多两张化身" : "选择要切换的化身";
- var func = function (id, prompt) {
- var dialog = get.idDialog(id);
- if (dialog) {
- dialog.content.childNodes[0].innerHTML = prompt;
- }
- };
- if (player.isOnline2()) {
- player.send(func, event.videoId, prompt);
- } else if (event.isMine()) {
- func(event.videoId, prompt);
- }
- "step 2";
- if (result.bool && event.control != "弃置化身") {
- event.card = result.links[0];
- var func = function (card, id) {
- var dialog = get.idDialog(id);
- if (dialog) {
- for (var i = 0; i < dialog.buttons.length; i++) {
- if (dialog.buttons[i].link == card) {
- dialog.buttons[i].classList.add("selectedx");
- } else {
- dialog.buttons[i].classList.add("unselectable");
- }
- }
- }
- };
- if (player.isOnline2()) {
- player.send(func, event.card, event.videoId);
- } else if (event.isMine()) {
- func(event.card, event.videoId);
- }
- var list = player.storage.rehuashen.map[event.card].slice(0);
- list.push("返回");
- player
- .chooseControl(list)
- .set("choice", event.aiChoice)
- .set("ai", function () {
- return _status.event.choice;
- });
- } else {
- lib.skill.rehuashen.removeHuashen(player, result.links.slice(0));
- lib.skill.rehuashen.addHuashens(player, result.links.length);
- }
- "step 3";
- if (result.control == "返回") {
- var func = function (id) {
- var dialog = get.idDialog(id);
- if (dialog) {
- for (var i = 0; i < dialog.buttons.length; i++) {
- dialog.buttons[i].classList.remove("selectedx");
- dialog.buttons[i].classList.remove("unselectable");
- }
- }
- };
- if (player.isOnline2()) {
- player.send(func, event.videoId);
- } else if (event.isMine()) {
- func(event.videoId);
- }
- event._result = { control: "更换技能" };
- event.goto(1);
- return;
- }
- if (player.isOnline2()) {
- player.send("closeDialog", event.videoId);
- }
- event.dialog.close();
- delete _status.noclearcountdown;
- if (!_status.noclearcountdown) {
- game.stopCountChoose();
- }
- if (event.control == "弃置化身") return;
- if (player.storage.rehuashen.current != event.card) {
- const old = player.storage.rehuashen.current;
- player.storage.rehuashen.current = event.card;
- const sex = get.character(event.card).sex;
- game.broadcastAll(
- function (player, character, old, sex) {
- player.tempname.remove(old);
- player.tempname.add(character);
- player.sex = sex;
- },
- player,
- event.card,
- old,
- sex
- );
- game.log(
- player,
- "将性别变为了",
- "#y" + get.translation(sex) + "性"
- );
- player.changeGroup(get.character(event.card).group);
- }
- var link = result.control;
- player.storage.rehuashen.current2 = link;
- if (
- !player.additionalSkills.rehuashen ||
- !player.additionalSkills.rehuashen.includes(link)
- ) {
- player.addAdditionalSkills("rehuashen", link);
- player.flashAvatar("rehuashen", event.card);
- player.syncStorage("rehuashen");
- player.updateMarks("rehuashen");
- // lib.skill.rehuashen.createAudio(event.card,link,'re_zuoci');
- }
- },
- init: function (player, skill) {
- if (!player.storage[skill])
- player.storage[skill] = {
- character: [],
- map: {},
- };
- player.when("dieBegin").then(() => {
- const name = player.name ? player.name : player.name1;
- if (name) {
- const sex = get.character(name).sex;
- const group = get.character(name).group;
- if (player.sex != sex) {
- game.broadcastAll(
- (player, sex) => {
- player.sex = sex;
- },
- player,
- sex
- );
- game.log(player, "将性别变为了", "#y" + get.translation(sex) + "性");
- }
- if (player.group != group) player.changeGroup(group);
- }
- });
- },
- banned: [
- "lisu",
- "sp_xiahoudun",
- "xushao",
- "jsrg_xushao",
- "zhoutai",
- "old_zhoutai",
- "shixie",
- "xin_zhoutai",
- "dc_shixie",
- "old_shixie",
- ],
- bannedType: ["Charlotte", "主公技", "觉醒技", "限定技", "隐匿技", "使命技"],
- addHuashen: function (player) {
- if (!player.storage.rehuashen) return;
- if (!_status.characterlist) {
- lib.skill.pingjian.initList();
- }
- _status.characterlist.randomSort();
- for (let i = 0; i < _status.characterlist.length; i++) {
- let name = _status.characterlist[i];
- if (
- name.indexOf("zuoci") != -1 ||
- name.indexOf("key_") == 0 ||
- name.indexOf("sp_key_") == 0 ||
- get.is.double(name) ||
- lib.skill.rehuashen.banned.includes(name) ||
- player.storage.rehuashen.character.includes(name)
- )
- continue;
- let skills = lib.character[name][3].filter((skill) => {
- const categories = get.skillCategoriesOf(skill);
- return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type));
- });
- if (skills.length) {
- player.storage.rehuashen.character.push(name);
- player.storage.rehuashen.map[name] = skills;
- _status.characterlist.remove(name);
- return name;
- }
- }
- },
- addHuashens: function (player, num) {
- var list = [];
- for (var i = 0; i < num; i++) {
- var name = lib.skill.rehuashen.addHuashen(player);
- if (name) list.push(name);
- }
- if (list.length) {
- player.syncStorage("rehuashen");
- player.updateMarks("rehuashen");
- game.log(player, "获得了", get.cnNumber(list.length) + "张", "#g化身");
- lib.skill.rehuashen.drawCharacter(player, list);
- }
- },
- removeHuashen: function (player, links) {
- player.storage.rehuashen.character.removeArray(links);
- _status.characterlist.addArray(links);
- game.log(player, "移去了", get.cnNumber(links.length) + "张", "#g化身");
- },
- drawCharacter: function (player, list) {
- game.broadcastAll(
- function (player, list) {
- if (player.isUnderControl(true)) {
- 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
- );
- },
- $createButton: function (item, type, position, noclick, node) {
- node = ui.create.buttonPresets.character(item, "character", position, noclick);
- const info = lib.character[item];
- const skills = info[3].filter(function (skill) {
- const categories = get.skillCategoriesOf(skill);
- return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type));
- });
- if (skills.length) {
- const skillstr = skills.map((i) => `[${get.translation(i)}]`).join("
");
- const skillnode = ui.create.caption(
- `${skillstr}
`,
- node
- );
- skillnode.style.left = "2px";
- skillnode.style.bottom = "2px";
- }
- node._customintro = function (uiintro, evt) {
- const character = node.link,
- characterInfo = get.character(node.link);
- let capt = get.translation(character);
- if (characterInfo) {
- capt += ` ${get.translation(characterInfo.sex)}`;
- let charactergroup;
- const charactergroups = get.is.double(character, true);
- if (charactergroups)
- charactergroup = charactergroups.map((i) => get.translation(i)).join("/");
- else charactergroup = get.translation(characterInfo.group);
- capt += ` ${charactergroup}`;
- }
- uiintro.add(capt);
-
- if (lib.characterTitle[node.link]) {
- uiintro.addText(get.colorspan(lib.characterTitle[node.link]));
- }
- for (let i = 0; i < skills.length; i++) {
- if (lib.translate[skills[i] + "_info"]) {
- let translation =
- lib.translate[skills[i] + "_ab"] ||
- get.translation(skills[i]).slice(0, 2);
- if (lib.skill[skills[i]] && lib.skill[skills[i]].nobracket) {
- uiintro.add(
- '' +
- get.translation(skills[i]) +
- "
" +
- get.skillInfoTranslation(skills[i]) +
- "
"
- );
- } else {
- uiintro.add(
- '【' +
- translation +
- "】
" +
- get.skillInfoTranslation(skills[i]) +
- "
"
- );
- }
- if (lib.translate[skills[i] + "_append"]) {
- uiintro._place_text = uiintro.add(
- '' + lib.translate[skills[i] + "_append"] + "
"
- );
- }
- }
- }
- };
- return node;
- },
- // createAudio:(character,skillx,name)=>{
- // var skills=game.expandSkills([skillx]);
- // skills=skills.filter(skill=>get.info(skill));
- // if(!skills.length) return;
- // var skillss=skills.filter(skill=>get.info(skill).derivation);
- // if(skillss.length){
- // skillss.forEach(skill=>{
- // var derivationSkill=get.info(skill).derivation;
- // skills[Array.isArray(derivationSkill)?'addArray':'add'](derivationSkill);
- // });
- // }
- // skills.forEach(skill=>{
- // var info=lib.skill[skill];
- // if(info){
- // if(!info.audioname2) info.audioname2={};
- // if(info.audioname&&info.audioname.includes(character)){
- // if(info.audio){
- // if(typeof info.audio=='string') skill=info.audio;
- // if(Array.isArray(info.audio)) skill=info.audio[0];
- // }
- // if(!lib.skill[skill+'_'+character]) lib.skill[skill+'_'+character]={audio:2};
- // info.audioname2[name]=(skill+'_'+character);
- // }
- // else if(info.audioname2[character]){
- // info.audioname2[name]=info.audioname2[character];
- // }
- // else{
- // if(info.audio){
- // if(typeof info.audio=='string') skill=info.audio;
- // if(Array.isArray(info.audio)) skill=info.audio[0];
- // }
- // info.audioname2[name]=skill;
- // }
- // }
- // });
- // },
- mark: true,
- intro: {
- onunmark: function (storage, player) {
- _status.characterlist.addArray(storage.character);
- storage.character = [];
- },
- mark: function (dialog, storage, player) {
- if (storage && storage.current)
- dialog.addSmall([
- [storage.current],
- (item, type, position, noclick, node) =>
- lib.skill.rehuashen.$createButton(item, type, position, noclick, node),
- ]);
- if (storage && storage.current2)
- dialog.add(
- '【' +
- get.translation(
- lib.translate[storage.current2 + "_ab"] ||
- get.translation(storage.current2).slice(0, 2)
- ) +
- "】
" +
- get.skillInfoTranslation(storage.current2, player) +
- "
"
- );
- if (storage && storage.character.length) {
- if (player.isUnderControl(true)) {
- dialog.addSmall([
- storage.character,
- (item, type, position, noclick, node) =>
- lib.skill.rehuashen.$createButton(
- item,
- type,
- position,
- noclick,
- node
- ),
- ]);
- } else {
- dialog.addText("共有" + get.cnNumber(storage.character.length) + "张“化身”");
- }
- } else {
- return "没有化身";
- }
- },
- content: function (storage, player) {
- return "共有" + get.cnNumber(storage.character.length) + "张“化身”";
- },
- markcount: function (storage, player) {
- if (storage && storage.character) return storage.character.length;
- return 0;
- },
- },
- },
- rexinsheng: {
- unique: true,
- audio: 2,
- trigger: { player: "damageEnd" },
- frequent: true,
- content: function () {
- "step 0";
- event.num = trigger.num;
- "step 1";
- lib.skill.rehuashen.addHuashens(player, 1);
- "step 2";
- if (
- --event.num > 0 &&
- player.hasSkill(event.name) &&
- !get.is.blocked(event.name, player)
- ) {
- player.chooseBool(get.prompt2("rexinsheng")).set("frequentSkill", event.name);
- } else event.finish();
- "step 3";
- if (result.bool && player.hasSkill("rexinsheng")) {
- player.logSkill("rexinsheng");
- event.goto(1);
- }
- },
- ai: {
- combo: "rehuasheng"
- },
- },
- reguhuo: {
- audio: 2,
- derivation: "rechanyuan",
- enable: ["chooseToUse", "chooseToRespond"],
- hiddenCard: function (player, name) {
- return (
- lib.inpile.includes(name) &&
- player.countCards("h") > 0 &&
- !player.hasSkill("reguhuo_phase")
- );
- },
- filter: function (event, player) {
- if (!player.countCards("hs") || player.hasSkill("reguhuo_phase")) 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;
- if (i == "sha") {
- for (var j of lib.inpile_nature) {
- if (
- event.filterCard(
- get.autoViewAs({ name: i, nature: j }, "unsure"),
- player,
- event
- )
- )
- return true;
- }
- }
- }
- return false;
- },
- chooseButton: {
- dialog: function () {
- var list = [];
- for (var i of lib.inpile) {
- var type = get.type(i);
- if (type == "basic" || type == "trick") list.push([type, "", i]);
- if (i == "sha") {
- for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]);
- }
- }
- return ui.create.dialog("蛊惑", [list, "vcard"]);
- },
- filter: function (button, player) {
- var evt = _status.event.getParent();
- return evt.filterCard(
- get.autoViewAs({ name: button.link[2], nature: button.link[3] }, "unsure"),
- player,
- evt
- );
- },
- check: function (button) {
- var player = _status.event.player;
- var rand = _status.event.getParent().getRand("reguhuo");
- var hasEnemy = game.hasPlayer(function (current) {
- return (
- current != player &&
- !current.hasSkill("rechanyuan") &&
- (get.realAttitude || get.attitude)(current, player) < 0
- );
- });
- var card = { name: button.link[2], nature: button.link[3] };
- var val = _status.event.getParent().type == "phase" ? player.getUseValue(card) : 1;
- if (val <= 0) return 0;
- if (hasEnemy && rand > 0.3) {
- if (
- !player.countCards("h", function (cardx) {
- if (card.name == cardx.name) {
- if (card.name != "sha") return true;
- return get.is.sameNature(card, cardx);
- }
- return false;
- })
- )
- return 0;
- return 3 * val;
- }
- return val;
- },
- backup: function (links, player) {
- return {
- viewAs: {
- name: links[0][2],
- nature: links[0][3],
- suit: "none",
- number: null,
- },
- filterCard: function (card, player, target) {
- var result = true;
- var suit = card.suit,
- number = card.number;
- card.suit = "none";
- card.number = null;
- var mod = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
- if (mod != "unchanged") result = mod;
- card.suit = suit;
- card.number = number;
- return result;
- },
- position: "hs",
- ignoreMod: true,
- ai1: function (card) {
- var player = _status.event.player;
- var hasEnemy = game.hasPlayer(function (current) {
- return (
- current != player &&
- !current.hasSkill("rechanyuan") &&
- (get.realAttitude || get.attitude)(current, player) < 0
- );
- });
- var rand = _status.event.getRand("reguhuo");
- var cardx = lib.skill.reguhuo_backup.viewAs;
- if (hasEnemy && rand > 0.3) {
- if (
- card.name == cardx.name &&
- (card.name != "sha" || get.is.sameNature(card, cardx))
- )
- return 10;
- return 0;
- }
- return 6 - get.value(card);
- },
- precontent: function () {
- player.logSkill("reguhuo");
- player.addTempSkill("reguhuo_guess");
- var card = event.result.cards[0];
- event.result.card.suit = get.suit(card);
- event.result.card.number = get.number(card);
- },
- };
- },
- prompt: function (links) {
- return (
- "将一张手牌当做" +
- (get.translation(links[0][3]) || "") +
- get.translation(links[0][2]) +
- "使用"
- );
- },
- },
- ai: {
- fireAttack: true,
- respondShan: true,
- respondSha: true,
- skillTagFilter: function (player) {
- if (!player.countCards("hs") || player.hasSkill("reguhuo_phase")) return false;
- },
- order: 10,
- result: {
- player: 1,
- },
- threaten: 1.3,
- },
- },
- reguhuo_guess: {
- trigger: {
- player: ["useCardBefore", "respondBefore"],
- },
- forced: true,
- silent: true,
- popup: false,
- charlotte: true,
- firstDo: true,
- filter: function (event, player) {
- return event.skill && event.skill.indexOf("reguhuo_") == 0;
- },
- content: function () {
- "step 0";
- player.addTempSkill("reguhuo_phase");
- event.fake = false;
- var card = trigger.cards[0];
- if (
- card.name != trigger.card.name ||
- (card.name == "sha" && !get.is.sameNature(trigger.card, card))
- )
- event.fake = true;
- //player.logSkill('reguhuo');
- player.line(trigger.targets, get.nature(trigger.card));
- event.cardTranslate = get.translation(trigger.card.name);
- trigger.card.number = get.number(card);
- trigger.card.suit = get.suit(card);
- //trigger.line=false;
- trigger.skill = "reguhuo_backup";
- if (trigger.card.name == "sha" && get.natureList(trigger.card).length)
- event.cardTranslate = get.translation(trigger.card.nature) + event.cardTranslate;
- player.popup(event.cardTranslate, trigger.name == "useCard" ? "metal" : "wood");
- event.prompt =
- "是否质疑" + get.translation(player) + "声明的" + event.cardTranslate + "?";
- game.log(player, "声明了", "#y" + event.cardTranslate);
- event.targets = game
- .filterPlayer(function (current) {
- return current != player && !current.hasSkill("rechanyuan");
- })
- .sortBySeat();
- event.targets2 = event.targets.slice(0);
- player.lose(card, ui.ordering).relatedEvent = trigger;
- if (!event.targets.length) event.goto(5);
- else if (_status.connectMode) event.goto(3);
- event.betrays = [];
- "step 1";
- event.target = targets.shift();
- event.target.chooseButton(
- [event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]],
- true,
- function (button) {
- var player = _status.event.player;
- var evt = _status.event.getParent("reguhuo_guess");
- if (!evt) return Math.random();
- var ally = button.link[2] == "reguhuo_ally";
- if (ally && (player.hp <= 1 || get.attitude(player, evt.player) >= 0)) return 1.1;
- return Math.random();
- }
- );
- "step 2";
- if (result.links[0][2] == "reguhuo_betray") {
- event.betrays.push(target);
- target.addExpose(0.2);
- }
- event.goto(targets.length ? 1 : 5);
- "step 3";
- var list = event.targets.map(function (target) {
- return [target, [event.prompt, [["reguhuo_ally", "reguhuo_betray"], "vcard"]], true];
- });
- player
- .chooseButtonOL(list)
- .set("switchToAuto", function () {
- _status.event.result = "ai";
- })
- .set("processAI", function () {
- var choice = Math.random() > 0.5 ? "reguhuo_ally" : "reguhuo_betray";
- var player = _status.event.player;
- var evt = _status.event.getParent("reguhuo_guess");
- if (
- player.hp <= 1 ||
- (evt && (get.realAttitude || get.attitude)(player, evt.player) >= 0)
- )
- choice = "reguhuo_ally";
- return {
- bool: true,
- links: [["", "", choice]],
- };
- });
- "step 4";
- for (var i in result) {
- if (result[i].links[0][2] == "reguhuo_betray") {
- event.betrays.push(lib.playerOL[i]);
- lib.playerOL[i].addExpose(0.2);
- }
- }
- "step 5";
- for (var i of event.targets2) {
- var b = event.betrays.includes(i);
- i.popup(b ? "质疑" : "不质疑", b ? "fire" : "wood");
- game.log(i, b ? "#y质疑" : "#g不质疑");
- }
- game.delay();
- "step 6";
- player.showCards(trigger.cards);
- if (event.betrays.length) {
- event.betrays.sortBySeat();
- if (event.fake) {
- game.asyncDraw(event.betrays);
- trigger.cancel();
- trigger.getParent().goto(0);
- game.log(player, "声明的", "#y" + event.cardTranslate, "作废了");
- } else {
- var next = game.createEvent("reguhuo_final", false);
- event.next.remove(next);
- trigger.after.push(next);
- next.targets = event.betrays;
- next.setContent(lib.skill.reguhuo_guess.contentx);
- event.finish();
- }
- } else event.finish();
- "step 7";
- game.delayx();
- },
- contentx: function () {
- "step 0";
- event.target = targets.shift();
- event.target.chooseToDiscard("弃置一张牌或失去1点体力").set("ai", function (card) {
- return 9 - get.value(card);
- });
- "step 1";
- if (!result.bool) target.loseHp();
- "step 2";
- target.addSkills("rechanyuan");
- if (targets.length) event.goto(0);
- },
- },
- reguhuo_backup: {},
- reguhuo_phase: {},
- rechanyuan: {
- init: function (player, skill) {
- if (player.hp <= 1) {
- player.logSkill(skill);
- player.addSkill("rechanyuan_log");
- }
- player.addSkillBlocker(skill);
- },
- onremove: function (player, skill) {
- player.removeSkill("rechanyuan_log");
- player.removeSkillBlocker(skill);
- },
- skillBlocker: function (skill, player) {
- return (
- skill != "chanyuan" &&
- skill != "rechanyuan" &&
- !lib.skill[skill].charlotte &&
- player.hp <= 1
- );
- },
- mark: true,
- intro: {
- content: function (storage, player, skill) {
- var str =
- "锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。";
- var list = player.getSkills(null, false, false).filter(function (i) {
- return lib.skill.rechanyuan.skillBlocker(i, player);
- });
- if (list.length) str += "
失效技能:" + get.translation(list);
- return str;
- },
- },
- audio: 2,
- trigger: { player: "changeHp" },
- filter: function (event, player) {
- return player.hp <= 1 != player.hasSkill("rechanyuan_log");
- },
- direct: true,
- locked: true,
- content: function () {
- if (player.hp <= 1) {
- player.logSkill("rechanyuan");
- player.addSkill("rechanyuan_log");
- } else player.removeSkill("rechanyuan_log");
- },
- subSkill: {
- log: { charlotte: true },
- },
- },
- botu: {
- audio: 2,
- trigger: { player: "phaseAfter" },
- frequent: true,
- filter: function (event, player) {
- var history = player.getHistory("useCard", function (evt) {
- return evt.isPhaseUsing();
- });
- var suits = [];
- for (var i = 0; i < history.length; i++) {
- var suit = get.suit(history[i].card);
- if (suit) suits.add(suit);
- }
- return suits.length == 4;
- },
- content: function () {
- player.insertPhase();
- },
- },
- xinleiji: {
- group: "xinleiji_misa",
- audio: 2,
- derivation: "xinleiji_faq",
- audioname: ["boss_qinglong"],
- trigger: { player: ["useCard", "respond"] },
- filter: function (event, player) {
- return (
- event.card.name == "shan" ||
- (event.name == "useCard" && event.card.name == "shandian")
- );
- },
- judgeCheck: function (card, bool) {
- var suit = get.suit(card);
- if (suit == "spade") {
- if (bool && get.number(card) > 1 && get.number(card) < 10) return 5;
- return 4;
- }
- if (suit == "club") return 2;
- return 0;
- },
- content: function () {
- player.judge(lib.skill.xinleiji.judgeCheck).judge2 = function (result) {
- return result.bool ? true : false;
- };
- },
- ai: {
- useShan: true,
- effect: {
- target: function (card, player, target, current) {
- let name;
- if (typeof card == "object") {
- if (card.viewAs) name = card.viewAs;
- else name = get.name(card);
- }
- if (
- name == "shandian" ||
- (get.tag(card, "respondShan") &&
- !player.hasSkillTag(
- "directHit_ai",
- true,
- {
- target: target,
- card: card,
- },
- true
- ))
- ) {
- let club = 0,
- spade = 0;
- if (
- game.hasPlayer(function (current) {
- return (
- get.attitude(target, current) < 0 &&
- get.damageEffect(current, target, target, "thunder") > 0
- );
- })
- ) {
- club = 2;
- spade = 4;
- }
- if (!target.isHealthy()) club += 2;
- if (!club && !spade) return 1;
- if (name === "sha") {
- if (
- !target.mayHaveShan(
- player,
- "use",
- target.getCards("h", (i) => {
- return i.hasGaintag("sha_notshan");
- })
- )
- )
- return;
- } else if (!target.mayHaveShan(player))
- return 1 - 0.1 * Math.min(5, target.countCards("hs"));
- if (!target.hasSkillTag("rejudge")) return [1, (club + spade) / 4];
- let pos =
- player == target ||
- player.hasSkillTag("viewHandcard", null, target, true)
- ? "hes"
- : "e",
- better = club > spade ? "club" : "spade",
- max = 0;
- target.hasCard(function (cardx) {
- if (get.suit(cardx) == better) {
- max = 2;
- return true;
- }
- if (spade && get.color(cardx) == "black") max = 1;
- }, pos);
- if (max == 2) return [1, Math.max(club, spade)];
- if (max == 1) return [1, Math.min(club, spade)];
- if (pos == "e")
- return [
- 1,
- Math.min(
- (Math.max(1, target.countCards("hs")) * (club + spade)) / 4,
- Math.max(club, spade)
- ),
- ];
- return [1, (club + spade) / 4];
- }
- if (name == "lebu" || name == "bingliang")
- return [
- target.hasSkillTag("rejudge") ? 0.4 : 1,
- 2,
- target.hasSkillTag("rejudge") ? 0.4 : 1,
- 0,
- ];
- },
- },
- },
- },
- xinleiji_misa: {
- audio: "xinleiji",
- trigger: { player: "judgeEnd" },
- direct: true,
- disableReason: ["暴虐", "助祭", "弘仪", "孤影"],
- filter: function (event, player) {
- return (
- !lib.skill.xinleiji_misa.disableReason.includes(event.judgestr) &&
- ["spade", "club"].includes(event.result.suit)
- );
- },
- content: function () {
- "step 0";
- event.num = 1 + ["club", "spade"].indexOf(trigger.result.suit);
- event.logged = false;
- if (event.num == 1 && player.isDamaged()) {
- event.logged = true;
- player.logSkill("xinleiji");
- player.recover();
- }
- player.chooseTarget("雷击:是否对一名角色造成" + event.num + "点雷电伤害?").ai =
- function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player, "thunder");
- };
- "step 1";
- if (result.bool && result.targets && result.targets.length) {
- if (!event.logged) player.logSkill("xinleiji", result.targets);
- else player.line(result.targets, "thunder");
- result.targets[0].damage(event.num, "thunder");
- }
- },
- },
- xinguidao: {
- audio: 2,
- mod: {
- aiOrder: function (player, card, num) {
- if (
- num > 0 &&
- get.itemtype(card) == "card" &&
- get.color(card) == "black" &&
- get.type(card) == "equip"
- )
- num * 1.35;
- },
- aiValue: function (player, card, num) {
- if (num > 0 && get.itemtype(card) == "card" && get.color(card) == "black")
- return num * 1.15;
- },
- aiUseful: function (player, card, num) {
- if (num > 0 && get.itemtype(card) == "card" && get.color(card) == "black")
- return num * 1.35;
- },
- },
- locked: false,
- trigger: { global: "judge" },
- filter: function (event, player) {
- return player.countCards("hes", { color: "black" }) > 0;
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseCard(
- get.translation(trigger.player) +
- "的" +
- (trigger.judgestr || "") +
- "判定为" +
- get.translation(trigger.player.judging[0]) +
- "," +
- get.prompt("xinguidao"),
- "hes",
- function (card) {
- if (get.color(card) != "black") return false;
- 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) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.player;
- var judging = _status.event.judging;
- var result = trigger.judge(card) - trigger.judge(judging);
- var attitude = get.attitude(player, trigger.player);
- if (attitude == 0 || result == 0) {
- if (trigger.player != player) return 0;
- if (
- game.hasPlayer(function (current) {
- return get.attitude(player, current) < 0;
- })
- ) {
- var checkx =
- lib.skill.xinleiji.judgeCheck(card, true) -
- lib.skill.xinleiji.judgeCheck(judging);
- if (checkx > 0) return checkx;
- }
- return 0;
- }
- if (attitude > 0) {
- return result;
- } else {
- return -result;
- }
- })
- .set("judging", trigger.player.judging[0]);
- "step 1";
- if (result.bool) {
- player.respond(result.cards, "highlight", "xinguidao", "noOrdering");
- } else {
- event.finish();
- }
- "step 2";
- if (result.bool) {
- player.$gain2(trigger.player.judging[0]);
- player.gain(trigger.player.judging[0]);
- var card = result.cards[0];
- if (get.suit(card) == "spade" && get.number(card) > 1 && get.number(card) < 10)
- player.draw("nodelay");
- trigger.player.judging[0] = result.cards[0];
- trigger.orderingCards.addArray(result.cards);
- game.log(trigger.player, "的判定牌改为", result.cards[0]);
- }
- "step 3";
- game.delay(2);
- },
- ai: {
- rejudge: true,
- tag: {
- rejudge: 1,
- },
- },
- },
- reqingguo: {
- mod: {
- aiValue: function (player, card, num) {
- if (get.name(card) != "shan" && get.color(card) != "black") return;
- var cards = player.getCards("hs", function (card) {
- return get.name(card) == "shan" || get.color(card) == "black";
- });
- cards.sort(function (a, b) {
- return (get.name(b) == "shan" ? 1 : 2) - (get.name(a) == "shan" ? 1 : 2);
- });
- var geti = function () {
- if (cards.includes(card)) {
- return cards.indexOf(card);
- }
- return cards.length;
- };
- if (get.name(card) == "shan")
- return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6;
- return Math.max(num, [6.5, 4, 3][Math.min(geti(), 2)]);
- },
- aiUseful: function () {
- return lib.skill.reqingguo.mod.aiValue.apply(this, arguments);
- },
- },
- locked: false,
- audio: 2,
- enable: ["chooseToRespond", "chooseToUse"],
- filterCard: function (card) {
- return get.color(card) == "black";
- },
- position: "hes",
- viewAs: { name: "shan" },
- viewAsFilter: function (player) {
- if (!player.countCards("hes", { color: "black" })) return false;
- },
- prompt: "将一张黑色牌当闪打出",
- check: function () {
- return 1;
- },
- ai: {
- order: 2,
- respondShan: true,
- skillTagFilter: function (player) {
- if (!player.countCards("hes", { color: "black" })) return false;
- },
- effect: {
- target: function (card, player, target, current) {
- if (get.tag(card, "respondShan") && current < 0) return 0.6;
- },
- },
- },
- },
- reqiangxi: {
- subSkill: {
- off: {
- sub: true,
- },
- },
- audio: 2,
- enable: "phaseUse",
- filterCard: function (card) {
- return get.subtype(card) == "equip1";
- },
- selectCard: function () {
- return [0, 1];
- },
- filterTarget: function (card, player, target) {
- if (player == target) return false;
- if (target.hasSkill("reqiangxi_off")) return false;
- return player.inRange(target);
- },
- content: function () {
- "step 0";
- if (cards.length == 0) {
- player.loseHp();
- }
- "step 1";
- target.addTempSkill("reqiangxi_off");
- target.damage("nocard");
- },
- check: function (card) {
- return 10 - get.value(card);
- },
- position: "he",
- ai: {
- order: 8.5,
- result: {
- target: function (player, target) {
- if (!ui.selected.cards.length) {
- if (player.hp < 2) return 0;
- if (target.hp >= player.hp) return 0;
- }
- return get.damageEffect(target, player);
- },
- },
- },
- threaten: 1.5,
- },
- rehuoji: {
- position: "hes",
- audio: 2,
- audioname: ["ol_sp_zhugeliang", "ol_pangtong"],
- enable: "chooseToUse",
- filterCard: function (card) {
- return get.color(card) == "red";
- },
- viewAs: {
- name: "huogong",
- },
- viewAsFilter: function (player) {
- if (!player.countCards("hes", { color: "red" })) return false;
- },
- prompt: "将一张红色牌当火攻使用",
- check: function (card) {
- var player = get.player();
- if (player.countCards("h") > player.hp) {
- return 6 - get.value(card);
- }
- return 4 - get.value(card);
- },
- ai: {
- fireAttack: true,
- },
- },
- rekanpo: {
- mod: {
- aiValue: function (player, card, num) {
- if (get.name(card) != "wuxie" && get.color(card) != "black") return;
- var cards = player.getCards("hs", function (card) {
- return get.name(card) == "wuxie" || get.color(card) == "black";
- });
- cards.sort(function (a, b) {
- return (get.name(b) == "wuxie" ? 1 : 2) - (get.name(a) == "wuxie" ? 1 : 2);
- });
- var geti = function () {
- if (cards.includes(card)) {
- return cards.indexOf(card);
- }
- return cards.length;
- };
- if (get.name(card) == "wuxie")
- return Math.min(num, [6, 4, 3][Math.min(geti(), 2)]) * 0.6;
- return Math.max(num, [6, 4, 3][Math.min(geti(), 2)]);
- },
- aiUseful: function () {
- return lib.skill.rekanpo.mod.aiValue.apply(this, arguments);
- },
- },
- locked: false,
- audio: 2,
- audioname: ["ol_sp_zhugeliang", "ol_pangtong"],
- position: "hes",
- enable: "chooseToUse",
- filterCard: function (card) {
- return get.color(card) == "black";
- },
- viewAsFilter: function (player) {
- return player.countCards("hes", { color: "black" }) > 0;
- },
- viewAs: {
- name: "wuxie",
- },
- prompt: "将一张黑色牌当无懈可击使用",
- check: function (card) {
- return 8 - get.value(card);
- },
- },
- reshuangxiong: {
- audio: "shuangxiong",
- audioname: ["re_yanwen"],
- group: ["reshuangxiong1", "reshuangxiong2"],
- },
- reshuangxiong1: {
- audio: "shuangxiong1",
- audioname2: {
- re_yanwen: "shuangxiong_re_yanwen1",
- },
- trigger: { player: "phaseDrawBegin1" },
- check: function (event, player) {
- if (player.countCards("h") > player.hp) return true;
- if (player.countCards("h") > 3) return true;
- return false;
- },
- filter: function (event, player) {
- return !event.numFixed;
- },
- prompt2: function () {
- return "放弃摸牌,然后亮出牌堆顶的两张牌并选择获得其中的一张。本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用";
- },
- content: function () {
- "step 0";
- trigger.changeToZero();
- event.cards = get.cards(2);
- event.videoId = lib.status.videoId++;
- game.broadcastAll(
- function (player, id, cards) {
- var str;
- if (player == game.me && !_status.auto) {
- str = "【双雄】选择获得其中一张牌";
- } else {
- 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 next = player.chooseButton([1, 1], true);
- next.set("dialog", event.videoId);
- next.set("ai", function (button) {
- var player = _status.event.player;
- var color = get.color(button.link);
- var value = get.value(button.link, player);
- if (
- player.countCards("h", { color: color }) >
- player.countCards("h", ["red", "black"].remove(color)[0])
- )
- value += 5;
- return value;
- });
- "step 2";
- if (result.bool && result.links) {
- var cards2 = [];
- for (var i = 0; i < result.links.length; i++) {
- cards2.push(result.links[i]);
- cards.remove(result.links[i]);
- }
- game.cardsDiscard(cards);
- event.card2 = cards2[0];
- }
- var time = 1000 - (get.utc() - event.time);
- if (time > 0) {
- game.delay(0, time);
- }
- "step 3";
- game.broadcastAll("closeDialog", event.videoId);
- var card2 = event.card2;
- player.gain(card2, "gain2");
- player.addTempSkill("shuangxiong2");
- player.markAuto("shuangxiong2", [get.color(card2, false)]);
- },
- },
- reshuangxiong2: {
- trigger: {
- player: "damageEnd",
- },
- direct: true,
- filter: function (event, player) {
- var evt = event.getParent();
- return (
- (evt &&
- evt.name == "juedou" &&
- evt[player == evt.player ? "targetCards" : "playerCards"].length) > 0
- );
- },
- content: function () {
- "step 0";
- var evt = trigger.getParent();
- var cards = evt[player == evt.player ? "targetCards" : "playerCards"].slice(0);
- for (var i = 0; i < cards.length; i++) {
- if (get.position(cards[i]) != "d") cards.remove(cards[i--]);
- }
- if (!cards.length) event.finish();
- else {
- event.cards = cards;
- player.chooseBool("是否发动【双雄】,获得" + get.translation(event.cards) + "?").ai =
- function () {
- return true;
- };
- }
- "step 1";
- if (result.bool) {
- player.logSkill("reshuangxiong");
- player.gain(cards, "gain2");
- }
- },
- },
- new_yajiao: {
- audio: "reyajiao",
- trigger: {
- player: "loseEnd",
- },
- frequent: true,
- filter: function (event, player) {
- return (
- player != _status.currentPhase &&
- event.hs &&
- event.hs.length > 0 &&
- ["useCard", "respond"].includes(event.getParent().name)
- );
- },
- content: function () {
- "step 0";
- event.card = get.cards();
- player.showCards(event.card);
- event.same = false;
- if (get.type(event.card[0], "trick") == get.type(trigger.getParent().card, "trick"))
- event.same = true;
- player
- .chooseTarget("选择获得此牌的角色", true)
- .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 (!_status.event.same) att += target == _status.event.player ? 1 : 0;
- if (att > 0) {
- return att + Math.max(0, 5 - target.countCards("h"));
- }
- return att;
- })
- .set("du", event.card.name == "du")
- .set("same", event.same);
- "step 1";
- if (result.targets) {
- player.line(result.targets, "green");
- result.targets[0].gain(event.card, "gain2");
- if (!event.same) player.chooseToDiscard(true, "he");
- }
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2];
- },
- },
- },
- },
- new_liyu: {
- audio: "liyu",
- trigger: {
- source: "damageSource",
- },
- filter: function (event, player) {
- if (event._notrigger.includes(event.player)) return false;
- return (
- event.card &&
- event.card.name == "sha" &&
- event.player != player &&
- event.player.isIn() &&
- event.player.countGainableCards(player, "hej") > 0
- );
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .gainPlayerCard(
- get.prompt("new_liyu", trigger.player),
- trigger.player,
- "hej",
- "visibleMove"
- )
- .set("ai", function (button) {
- var player = _status.event.player,
- target = _status.event.target;
- if (get.attitude(player, target) > 0 && get.position(button.link) === "j")
- return 4 + get.value(button.link);
- if (get.type(button.link) === "equip") return _status.event.juedou;
- return 3;
- })
- .set(
- "juedou",
- (() => {
- if (
- get.attitude(player, trigger.player) > 0 &&
- game.hasPlayer(function (current) {
- return (
- player.canUse({ name: "juedou" }, current) &&
- current != trigger.player &&
- current != player &&
- get.effect(
- current,
- { name: "juedou" },
- player,
- _status.event.player
- ) > 2
- );
- })
- )
- return 5;
- if (
- game.hasPlayer(function (current) {
- return (
- player.canUse({ name: "juedou" }, current) &&
- current != trigger.player &&
- current != player &&
- get.effect(
- current,
- { name: "juedou" },
- player,
- _status.event.player
- ) < 0
- );
- })
- )
- return 1;
- return 4;
- })()
- )
- .set("logSkill", ["new_liyu", trigger.player]);
- "step 1";
- if (result.bool) {
- if (get.type(result.cards[0]) != "equip") {
- trigger.player.draw();
- event.finish();
- } else {
- if (
- !game.hasPlayer(function (current) {
- return (
- current != player &&
- current != trigger.player &&
- player.canUse("juedou", current)
- );
- })
- ) {
- event.finish();
- return;
- }
- trigger.player
- .chooseTarget(
- true,
- function (card, player, target) {
- var evt = _status.event.getParent();
- return (
- evt.player.canUse({ name: "juedou" }, target) &&
- target != _status.event.player
- );
- },
- "请选择一名角色,视为" + get.translation(player) + "对其使用【决斗】"
- )
- .set("ai", function (target) {
- var evt = _status.event.getParent();
- return (
- get.effect(
- target,
- { name: "juedou" },
- evt.player,
- _status.event.player
- ) - 2
- );
- });
- }
- } else event.finish();
- "step 2";
- if (result.targets) {
- player.useCard({ name: "juedou", isCard: true }, result.targets[0], "noai");
- }
- },
- ai: {
- halfneg: true,
- },
- },
- new_retuxi: {
- audio: "retuxi",
- trigger: {
- player: "phaseDrawBegin2",
- },
- direct: true,
- preHidden: true,
- filter: function (event, player) {
- return (
- event.num > 0 &&
- !event.numFixed &&
- game.hasPlayer(function (target) {
- return target.countCards("h") > 0 && player != target;
- })
- );
- },
- content: function () {
- "step 0";
- var num = get.copy(trigger.num);
- if (get.mode() == "guozhan" && num > 2) num = 2;
- player
- .chooseTarget(
- get.prompt("new_retuxi"),
- "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌",
- [1, num],
- function (card, player, target) {
- return target.countCards("h") > 0 && player != target;
- },
- function (target) {
- var att = get.attitude(_status.event.player, target);
- if (target.hasSkill("tuntian")) return att / 10;
- return 1 - att;
- }
- )
- .setHiddenSkill("new_retuxi");
- "step 1";
- if (result.bool) {
- result.targets.sortBySeat();
- player.logSkill("new_retuxi", result.targets);
- player.gainMultiple(result.targets);
- trigger.num -= result.targets.length;
- } else {
- event.finish();
- }
- "step 2";
- if (trigger.num <= 0) game.delay();
- },
- ai: {
- threaten: 1.6,
- expose: 0.2,
- },
- },
- new_reyiji: {
- audio: "reyiji",
- trigger: {
- player: "damageEnd",
- },
- frequent: true,
- filter: function (event) {
- return event.num > 0;
- },
- getIndex(event, player, triggername) {
- return event.num;
- },
- content: function () {
- "step 0";
- player.draw(2);
- if (_status.connectMode)
- game.broadcastAll(function () {
- _status.noclearcountdown = true;
- });
- event.given_map = {};
- event.num = 2;
- "step 1";
- player.chooseCardTarget({
- filterCard: function (card) {
- return get.itemtype(card) == "card" && !card.hasGaintag("reyiji_tag");
- },
- filterTarget: lib.filter.notMe,
- selectCard: [1, event.num],
- prompt: "请选择要分配的卡牌和目标",
- ai1: function (card) {
- if (!ui.selected.cards.length) return 1;
- return 0;
- },
- ai2: function (target) {
- var player = _status.event.player,
- card = ui.selected.cards[0];
- var val = target.getUseValue(card);
- if (val > 0) return val * get.attitude(player, target) * 2;
- return get.value(card, target) * get.attitude(player, target);
- },
- });
- "step 2";
- if (result.bool) {
- var res = result.cards,
- target = result.targets[0].playerid;
- player.addGaintag(res, "reyiji_tag");
- event.num -= res.length;
- if (!event.given_map[target]) event.given_map[target] = [];
- event.given_map[target].addArray(res);
- if (event.num > 0) event.goto(1);
- } else if (event.num == 2) {
- if (_status.connectMode) {
- game.broadcastAll(function () {
- delete _status.noclearcountdown;
- game.stopCountChoose();
- });
- }
- event.finish();
- }
- "step 3";
- if (_status.connectMode) {
- game.broadcastAll(function () {
- delete _status.noclearcountdown;
- game.stopCountChoose();
- });
- }
- var map = [],
- cards = [];
- for (var i in event.given_map) {
- var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i];
- player.line(source, "green");
- if (player !== source && (get.mode() !== "identity" || player.identity !== "nei"))
- player.addExpose(0.18);
- map.push([source, event.given_map[i]]);
- cards.addArray(event.given_map[i]);
- }
- game.loseAsync({
- gain_list: map,
- player: player,
- cards: cards,
- giver: player,
- animate: "giveAuto",
- }).setContent("gaincardMultiple");
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- result: {
- effect: function (card, player, target) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- if (!target.hasFriend()) return;
- var num = 1;
- if (get.attitude(player, target) > 0) {
- if (player.needsToDiscard()) num = 0.7;
- else num = 0.5;
- }
- if (player.hp >= 4) return [1, num * 2];
- if (target.hp == 3) return [1, num * 1.5];
- if (target.hp == 2) return [1, num * 0.5];
- }
- },
- },
- threaten: 0.6,
- },
- },
- new_rejianxiong: {
- audio: "rejianxiong",
- audioname: ["shen_caopi"],
- trigger: {
- player: "damageEnd",
- },
- content: function () {
- "step 0";
- if (
- get.itemtype(trigger.cards) == "cards" &&
- get.position(trigger.cards[0], true) == "o"
- ) {
- player.gain(trigger.cards, "gain2");
- }
- player.draw("nodelay");
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- effect: {
- target: function (card, player, target) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -1];
- if (get.tag(card, "damage") && player != target) {
- var cards = card.cards,
- evt = _status.event;
- if (
- evt.player == target &&
- card.name == "damage" &&
- evt.getParent().type == "card"
- )
- cards = evt.getParent().cards.filterInD();
- if (target.hp <= 1) return;
- if (get.itemtype(cards) != "cards") return;
- for (var i of cards) {
- if (get.name(i, target) == "tao") return [1, 5];
- }
- if (get.value(cards, target) >= 7 + target.getDamagedHp()) return [1, 3];
- return [1, 0.6];
- }
- },
- },
- },
- },
- new_reluoyi: {
- audio: "reluoyi",
- trigger: {
- player: "phaseDrawBegin1",
- },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return !event.numFixed;
- },
- content: function () {
- "step 0";
- var cards = get.cards(3);
- game.cardsGotoOrdering(cards);
- player.showCards(cards, "裸衣");
- var cardsx = [];
- for (var i = 0; i < cards.length; i++) {
- if (
- get.type(cards[i]) == "basic" ||
- cards[i].name == "juedou" ||
- (get.type(cards[i]) == "equip" && get.subtype(cards[i]) == "equip1")
- ) {
- cardsx.push(cards[i]);
- }
- }
- event.cards = cardsx;
- player.chooseBool(
- "是否放弃摸牌" + (cardsx.length ? ",改为获得" + get.translation(cardsx) : "") + "?"
- ).ai = function () {
- var num = 3;
- return cardsx.length >= trigger.num;
- };
- "step 1";
- if (result.bool) {
- if (cards.length) player.gain(cards, "gain2");
- //game.cardsDiscard(cards2);
- player.addTempSkill("reluoyi2", { player: "phaseBefore" });
- trigger.changeToZero();
- }
- //else game.cardsDiscard(cards);
- },
- },
- new_rewusheng: {
- mod: {
- targetInRange: function (card) {
- if (get.suit(card) == "diamond" && card.name == "sha") return true;
- },
- },
- locked: false,
- audio: "wusheng",
- audioname: [
- "re_guanyu",
- "guanzhang",
- "jsp_guanyu",
- "guansuo",
- "re_guanzhang",
- "dc_jsp_guanyu",
- ],
- audioname2: {
- dc_guansuo: "wusheng_guansuo",
- },
- enable: ["chooseToRespond", "chooseToUse"],
- filterCard: function (card, player) {
- if (get.zhu(player, "shouyue")) return true;
- return get.color(card) == "red";
- },
- position: "hes",
- viewAs: {
- name: "sha",
- },
- viewAsFilter: function (player) {
- if (get.zhu(player, "shouyue")) {
- if (!player.countCards("hes")) return false;
- } else {
- if (!player.countCards("hes", { color: "red" })) return false;
- }
- },
- prompt: "将一张红色牌当杀使用或打出",
- check: function (card) {
- var val = get.value(card);
- if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val);
- return 5 - val;
- },
- ai: {
- respondSha: true,
- skillTagFilter: function (player) {
- if (get.zhu(player, "shouyue")) {
- if (!player.countCards("hes")) return false;
- } else {
- if (!player.countCards("hes", { color: "red" })) return false;
- }
- },
- },
- },
- wusheng_guansuo: { audio: 2 },
- new_yijue: {
- audio: "yijue",
- enable: "phaseUse",
- usable: 1,
- position: "he",
- filterTarget: function (card, player, target) {
- return player != target && target.countCards("h");
- },
- filterCard: true,
- check: function (card) {
- return 8 - get.value(card);
- },
- content: function () {
- "step 0";
- if (!target.countCards("h")) {
- event.finish();
- return;
- } else
- target.chooseCard(true, "h").set("ai", function (card) {
- var player = _status.event.player;
- if ((player.hasShan() || player.hp < 3) && get.color(card) == "black") return 0.5;
- return Math.max(1, 20 - get.value(card));
- });
- "step 1";
- target.showCards(result.cards);
- event.card2 = result.cards[0];
- if (get.color(event.card2) == "black") {
- if (!target.hasSkill("fengyin")) {
- target.addTempSkill("fengyin");
- }
- target.addTempSkill("new_yijue2");
- event.finish();
- } else if (get.color(event.card2) == "red") {
- player.gain(event.card2, target, "give", "bySelf");
- if (target.hp < target.maxHp) {
- player.chooseBool("是否让目标回复1点体力?").ai = function (event, player) {
- return get.recoverEffect(target, player, player) > 0;
- };
- }
- }
- "step 2";
- if (result.bool) {
- target.recover();
- }
- },
- ai: {
- result: {
- target: function (player, target) {
- var hs = player.getCards("h");
- if (hs.length < 3) return 0;
- if (target.countCards("h") > target.hp + 1 && get.recoverEffect(target) > 0) {
- return 1;
- }
- if (
- player.canUse("sha", target) &&
- (player.countCards("h", "sha") || player.countCards("he", { color: "red" }))
- ) {
- return -2;
- }
- return -0.5;
- },
- },
- order: 9,
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- if (!arg.target.hasSkillTag("new_yijue2")) return false;
- },
- },
- },
- new_yijue2: {
- trigger: {
- player: "damageBegin1",
- },
- filter: function (event) {
- return (
- event.source &&
- event.source == _status.currentPhase &&
- event.card &&
- event.card.name == "sha" &&
- get.suit(event.card) == "heart" &&
- event.notLink()
- );
- },
- popup: false,
- forced: true,
- charlotte: true,
- content: function () {
- trigger.num++;
- },
- mark: true,
- mod: {
- cardEnabled2: function (card) {
- if (get.position(card) == "h") return false;
- },
- },
- intro: {
- content: "不能使用或打出手牌",
- },
- },
- paoxiao_re_zhangfei: { audio: 2 },
- new_repaoxiao: {
- audio: "paoxiao",
- firstDo: true,
- audioname2: {
- old_guanzhang: "old_fuhun",
- xin_zhangfei: "paoxiao_re_zhangfei",
- dc_xiahouba: "paoxiao_xiahouba",
- },
- audioname: ["re_zhangfei", "guanzhang", "xiahouba", "re_guanzhang"],
- trigger: { player: "useCard1" },
- forced: true,
- filter: function (event, player) {
- return event.card.name == "sha" && (!event.audioed || !player.hasSkill("new_repaoxiao2"));
- },
- content: function () {
- trigger.audioed = true;
- player.addTempSkill("new_repaoxiao2");
- },
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return Infinity;
- },
- },
- ai: {
- unequip: true,
- skillTagFilter: function (player, tag, arg) {
- if (!get.zhu(player, "shouyue")) return false;
- if (arg && arg.name == "sha") return true;
- return false;
- },
- },
- },
- new_repaoxiao2: {
- charlotte: true,
- mod: {
- targetInRange: function (card, player) {
- if (card.name == "sha") return true;
- },
- },
- },
- new_tishen: {
- trigger: {
- player: "phaseUseEnd",
- },
- check: function (event, player) {
- var num = 0;
- var he = player.getCards("he");
- for (var i = 0; i < he.length; i++) {
- if (get.type(he[i], "trick") == "trick") {
- num++;
- }
- if (get.type(he[i]) == "equip") {
- var subtype = get.subtype(he[i]);
- if (subtype == "equip3" || subtype == "equip4" || subtype == "equip6") {
- num++;
- }
- }
- }
- return num == 0 || num <= player.countCards("h") - player.getHandcardLimit();
- },
- content: function () {
- var list = [];
- var he = player.getCards("he");
- for (var i = 0; i < he.length; i++) {
- if (get.type(he[i], "trick") == "trick") {
- list.push(he[i]);
- }
- if (get.type(he[i]) == "equip") {
- var subtype = get.subtype(he[i]);
- if (subtype == "equip3" || subtype == "equip4" || subtype == "equip6") {
- list.push(he[i]);
- }
- }
- }
- if (list.length) player.discard(list);
- player.addTempSkill("new_tishen2", { player: "phaseBefore" });
- },
- audio: "retishen",
- },
- new_tishen2: {
- audio: "retishen",
- trigger: {
- global: "useCardAfter",
- },
- filter: function (event, player) {
- return (
- event.card.name == "sha" &&
- event.targets &&
- event.targets.includes(player) &&
- !player.hasHistory("damage", (evt) => evt.card == event.card) &&
- event.cards.filterInD("od").length
- );
- },
- forced: true,
- charlotte: true,
- content: function () {
- player.gain(trigger.cards.filterInD("od"), "gain2");
- },
- },
- new_qingjian: {
- audio: "qingjian",
- trigger: {
- player: "gainAfter",
- global: "loseAsyncAfter",
- },
- direct: true,
- usable: 1,
- filter: function (event, player) {
- var evt = event.getParent("phaseDraw");
- if (evt && evt.player == player) return false;
- return event.getg(player).length > 0;
- },
- content: function () {
- "step 0";
- player.chooseCardTarget({
- position: "he",
- filterCard: true,
- selectCard: [1, Infinity],
- filterTarget: function (card, player, target) {
- return player != target;
- },
- ai1: function (card) {
- if (
- card.name != "du" &&
- get.attitude(_status.event.player, _status.currentPhase) < 0 &&
- _status.currentPhase.needsToDiscard()
- )
- return -1;
- for (var i = 0; i < ui.selected.cards.length; i++) {
- if (
- get.type(ui.selected.cards[i]) == get.type(card) ||
- (ui.selected.cards[i].name == "du" && card.name != "du")
- )
- return -1;
- }
- if (card.name == "du") return 20;
- return _status.event.player.countCards("h") - _status.event.player.hp;
- },
- ai2: function (target) {
- if (get.attitude(_status.event.player, _status.currentPhase) < 0) return -1;
- var att = get.attitude(_status.event.player, target);
- if (ui.selected.cards.length && ui.selected.cards[0].name == "du") {
- if (target.hasSkillTag("nodu")) return 0;
- return 1 - att;
- }
- if (target.countCards("h") > _status.event.player.countCards("h")) return 0;
- return att - 4;
- },
- prompt: get.prompt2("new_qingjian"),
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- var cards = result.cards;
- var type = [];
- for (var i = 0; i < cards.length; i++) {
- type.add(get.type2(cards[i]));
- }
- player.logSkill("new_qingjian", target);
- player.give(cards, target);
- var current = _status.currentPhase;
- if (current) {
- current.addTempSkill("qingjian_add");
- current.addMark("qingjian_add", type.length);
- }
- } else player.storage.counttrigger.new_qingjian--;
- },
- ai: {
- expose: 0.3,
- },
- },
- qingjian_add: {
- mark: true,
- intro: {
- content: "手牌上限+#",
- },
- mod: {
- maxHandcard: function (player, num) {
- return num + player.countMark("qingjian_add");
- },
- },
- onremove: true,
- },
- new_reqingnang: {
- subSkill: {
- off: {
- sub: true,
- },
- off2: {
- sub: true,
- },
- },
- audio: 2,
- enable: "phaseUse",
- filterCard: true,
- check: function (card) {
- var player = _status.event.player;
- if (
- game.countPlayer(function (current) {
- return (
- get.recoverEffect(current, player, player) > 0 &&
- get.attitude(player, current) > 2
- );
- }) > 1 &&
- get.color(card) == "black" &&
- player.countCards("h", { color: "red" }) > 0
- )
- return 3 - get.value(card);
- return 9 - get.value(card);
- },
- filter: function (event, player) {
- return !player.hasSkill("new_reqingnang_off2");
- },
- filterTarget: function (card, player, target) {
- if (target.hp >= target.maxHp || target.hasSkill("new_reqingnang_off")) return false;
- return true;
- },
- content: function () {
- target.addTempSkill("new_reqingnang_off");
- if (get.color(cards[0]) == "black") player.addTempSkill("new_reqingnang_off2");
- target.recover();
- },
- ai: {
- order: 9,
- result: {
- target: function (player, target) {
- if (target.hp == 1) return 5;
- if (player == target && player.countCards("h") > player.hp) return 5;
- return 2;
- },
- },
- threaten: 2,
- },
- },
- reyaowu: {
- trigger: { player: "damageBegin3" },
- audio: "new_reyaowu",
- forced: true,
- filter: function (event) {
- return (
- event.card &&
- (get.color(event.card) != "red" || (event.source && event.source.isIn()))
- );
- },
- content: function () {
- trigger[get.color(trigger.card) != "red" ? "player" : "source"].draw();
- },
- ai: {
- effect: {
- target: (card, player, target) => {
- if (
- typeof card !== "object" ||
- !get.tag(card, "damage") ||
- target.hasSkill("gangzhi")
- )
- return;
- if (player.hasSkillTag("jueqing", null, true)) return;
- if (get.color(card) === "red") return [1, 0, 1, 0.6];
- return [1, 0.6];
- },
- },
- },
- },
- new_reyaowu: {
- trigger: {
- player: "damageBegin3",
- },
- //priority:1,
- audio: 2,
- audioname: ["sb_huaxiong"],
- filter: function (event) {
- return (
- event.card &&
- event.card.name == "sha" &&
- (get.color(event.card) != "red" || (event.source && event.source.isIn()))
- );
- },
- forced: true,
- content: function () {
- if (get.color(trigger.card) != "red") player.draw();
- else trigger.source.chooseDrawRecover(true);
- },
- ai: {
- effect: {
- target: (card, player, target, current) => {
- if (card.name == "sha") {
- if (get.color(card) == "red") {
- let num = player.isDamaged() ? 1.6 : 0.7;
- if (get.attitude(player, target) > 0 && player.hp < 3)
- return [1, 0, 1, num];
- return [1, 0, 1, num / 2];
- }
- return [1, 0.6];
- }
- },
- },
- },
- },
- reguanxing: {
- audio: "guanxing",
- audioname: ["jiangwei", "re_jiangwei", "re_zhugeliang", "gexuan", "ol_jiangwei"],
- trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] },
- frequent: true,
- filter: function (event, player, name) {
- if (name == "phaseJieshuBegin") {
- return player.hasSkill("reguanxing_on");
- }
- return true;
- },
- content: function () {
- "step 0";
- var num = game.countPlayer() < 4 ? 3 : 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next;
- var att = get.sgn(get.attitude(player, target));
- var top = [];
- var judges = target.getCards("j");
- var stopped = false;
- if (player != target || !target.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)) * att;
- });
- if (judge(cards[0]) * att < 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)) * att;
- });
- while (cards.length) {
- if (get.value(cards[0], player) <= 5 == att > 0) break;
- top.unshift(cards.shift());
- }
- }
- bottom = cards;
- return [top, bottom];
- };
- "step 1";
- var top = result.moved[0];
- var bottom = result.moved[1];
- top.reverse();
- game.cardsGotoPile(top.concat(bottom), ["top_cards", top], function (event, card) {
- if (event.top_cards.includes(card)) return ui.cardPile.firstChild;
- return null;
- });
- if (event.triggername == "phaseZhunbeiBegin" && top.length == 0) {
- player.addTempSkill("reguanxing_on");
- }
- player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下");
- game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶");
- "step 2";
- game.delayx();
- },
- subSkill: {
- on: { charlotte: true },
- },
- },
- reluoshen: {
- audio: 2,
- locked: false,
- trigger: { player: "phaseZhunbeiBegin" },
- frequent: true,
- content: function () {
- "step 0";
- player.addTempSkill("reluoshen_add");
- event.cards = [];
- "step 1";
- var next = player.judge(function (card) {
- if (get.color(card) == "black") return 1.5;
- return -1.5;
- });
- next.judge2 = function (result) {
- return result.bool;
- };
- if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge"))
- next.set("callback", function () {
- if (event.judgeResult.color == "black" && get.position(card, true) == "o") {
- player.gain(card, "gain2").gaintag.add("reluoshen");
- }
- });
- else
- next.set("callback", function () {
- if (event.judgeResult.color == "black")
- event.getParent().orderingCards.remove(card);
- });
- "step 2";
- if (result.bool) {
- event.cards.push(result.card);
- player.chooseBool("是否再次发动【洛神】?").set("frequentSkill", "reluoshen");
- } 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").gaintag.add("reluoshen");
- }
- event.finish();
- }
- "step 3";
- if (result.bool) {
- event.goto(1);
- } 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").gaintag.add("reluoshen");
- }
- }
- },
- subSkill: {
- add: {
- mod: {
- ignoredHandcard: function (card, player) {
- if (card.hasGaintag("reluoshen")) {
- return true;
- }
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && card.hasGaintag("reluoshen")) {
- return false;
- }
- },
- },
- onremove: function (player) {
- player.removeGaintag("reluoshen");
- },
- },
- },
- },
- rejieyin: {
- audio: 2,
- enable: "phaseUse",
- filterCard: true,
- usable: 1,
- position: "he",
- filter: function (event, player) {
- return player.countCards("he") > 0;
- },
- check: function (card) {
- var player = _status.event.player;
- if (get.position(card) == "e") {
- var subtype = get.subtype(card);
- if (
- !game.hasPlayer(function (current) {
- return (
- current != player &&
- current.hp != player.hp &&
- get.attitude(player, current) > 0 &&
- !current.countCards("e", { subtype: subtype })
- );
- })
- ) {
- return 0;
- }
- if (player.countCards("h", { subtype: subtype })) return 20 - get.value(card);
- return 10 - get.value(card);
- } else {
- if (player.countCards("e")) return 0;
- if (player.countCards("h", { type: "equip" })) return 0;
- return 8 - get.value(card);
- }
- },
- filterTarget: function (card, player, target) {
- if (!target.hasSex("male")) return false;
- var card = ui.selected.cards[0];
- if (!card) return false;
- if (get.position(card) == "e" && !target.canEquip(card)) return false;
- return true;
- },
- discard: false,
- delay: false,
- lose: false,
- content: function () {
- "step 0";
- if (get.position(cards[0]) == "e") event._result = { index: 0 };
- else if (get.type(cards[0]) != "equip" || !target.canEquip(cards[0]))
- event._result = { index: 1 };
- else
- player
- .chooseControl()
- .set("choiceList", [
- "将" +
- get.translation(cards[0]) +
- "置入" +
- get.translation(target) +
- "的装备区",
- "弃置" + get.translation(cards[0]),
- ]).ai = function () {
- return 1;
- };
- "step 1";
- if (result.index == 0) {
- player.$give(cards, target, false);
- target.equip(cards[0]);
- } else {
- player.discard(cards);
- }
- "step 2";
- if (player.hp > target.hp) {
- player.draw();
- if (target.isDamaged()) target.recover();
- } else if (player.hp < target.hp) {
- target.draw();
- if (player.isDamaged()) player.recover();
- }
- },
- ai: {
- order: function () {
- var player = _status.event.player;
- var es = player.getCards("e");
- for (var i = 0; i < es.length; i++) {
- if (player.countCards("h", { subtype: get.subtype(es[i]) })) return 10;
- }
- return 2;
- },
- result: {
- target: function (player, target) {
- var goon = function () {
- var es = player.getCards("e");
- for (var i = 0; i < es.length; i++) {
- if (player.countCards("h", { subtype: get.subtype(es[i]) })) return true;
- }
- return false;
- };
- if (player.hp < target.hp) {
- if (player.isHealthy()) {
- if (!player.needsToDiscard(1) || goon()) return 0.1;
- return 0;
- }
- return 1.5;
- }
- if (player.hp > target.hp) {
- if (target.isHealthy()) {
- if (!player.needsToDiscard(1) || goon()) return 0.1;
- return 0;
- }
- return 1;
- }
- return 0;
- },
- },
- },
- },
- rejiuyuan: {
- audio: 2,
- zhuSkill: true,
- trigger: { global: "recoverBefore" },
- direct: true,
- filter: function (event, player) {
- return (
- player != event.player &&
- event.player.group == "wu" &&
- player.hp <= event.player.hp &&
- event.getParent().name != "rejiuyuan" &&
- player.hasZhuSkill("rejiuyuan", event.player)
- );
- },
- content: function () {
- "step 0";
- trigger.player
- .chooseBool(
- "是否对" + get.translation(player) + "发动【救援】?",
- "改为令其回复1点体力,然后你摸一张牌"
- )
- .set("ai", function () {
- var evt = _status.event;
- return get.attitude(evt.player, evt.getParent().player) > 0;
- });
- "step 1";
- if (result.bool) {
- player.logSkill("rejiuyuan");
- trigger.player.line(player, "green");
- trigger.cancel();
- player.recover();
- trigger.player.draw();
- }
- },
- },
- rezhiheng: {
- audio: 2,
- audioname: ["shen_caopi"],
- mod: {
- aiOrder: function (player, card, num) {
- if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip")
- return num;
- let eq = player.getEquip(get.subtype(card));
- if (eq && get.equipValue(card) - get.equipValue(eq) < Math.max(1.2, 6 - player.hp))
- return 0;
- },
- },
- locked: false,
- enable: "phaseUse",
- usable: 1,
- position: "he",
- filterCard: lib.filter.cardDiscardable,
- discard: false,
- lose: false,
- delay: false,
- selectCard: [1, Infinity],
- check: function (card) {
- var player = _status.event.player;
- if (
- get.position(card) == "h" &&
- !player.countCards("h", "du") &&
- (player.hp > 2 ||
- !player.countCards("h", function (card) {
- return get.value(card) >= 8;
- }))
- ) {
- return 1;
- }
- return 6 - get.value(card);
- },
- content: function () {
- "step 0";
- player.discard(cards);
- event.num = 1;
- var hs = player.getCards("h");
- if (!hs.length) event.num = 0;
- for (var i = 0; i < hs.length; i++) {
- if (!cards.includes(hs[i])) {
- event.num = 0;
- break;
- }
- }
- "step 1";
- player.draw(event.num + cards.length);
- },
- //group:'rezhiheng_draw',
- subSkill: {
- draw: {
- trigger: { player: "loseEnd" },
- silent: true,
- filter: function (event, player) {
- if (
- event.getParent(2).skill != "rezhiheng" &&
- event.getParent(2).skill != "jilue_zhiheng"
- )
- return false;
- if (player.countCards("h")) return false;
- for (var i = 0; i < event.cards.length; i++) {
- if (event.cards[i].original == "h") return true;
- }
- return false;
- },
- content: function () {
- player.addTempSkill("rezhiheng_delay", trigger.getParent(2).skill + "After");
- },
- },
- delay: {},
- },
- ai: {
- order: function (item, player) {
- if (player.hasCard((i) => get.value(i) > Math.max(6, 9 - player.hp), "he")) return 1;
- return 10;
- },
- result: {
- player: 1,
- },
- nokeep: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag === "nokeep")
- return (
- (!arg || (arg && arg.card && get.name(arg.card) === "tao")) &&
- player.isPhaseUsing() &&
- !player.getStat().skill.rezhiheng &&
- player.hasCard((card) => get.name(card) !== "tao", "h")
- );
- },
- threaten: 1.55,
- },
- },
- reqicai: {
- mod: {
- targetInRange: function (card, player, target, now) {
- var type = get.type(card);
- if (type == "trick" || type == "delay") return true;
- },
- canBeDiscarded: function (card) {
- if (get.position(card) == "e" && ["equip2", "equip5"].includes(get.subtype(card)))
- return false;
- },
- },
- },
- rejizhi: {
- audio: 2,
- audioname: ["lukang"],
- locked: false,
- trigger: { player: "useCard" },
- frequent: true,
- filter: function (event) {
- return get.type(event.card, "trick") == "trick" && event.card.isCard;
- },
- init: function (player) {
- player.storage.rejizhi = 0;
- },
- content: function () {
- "step 0";
- player.draw();
- "step 1";
- event.card = result[0];
- if (get.type(event.card) == "basic") {
- player
- .chooseBool("是否弃置" + get.translation(event.card) + "并令本回合手牌上限+1?")
- .set("ai", function (evt, player) {
- return (
- _status.currentPhase == player &&
- player.needsToDiscard(-3) &&
- _status.event.value < 6
- );
- })
- .set("value", get.value(event.card, player));
- }
- "step 2";
- if (result.bool) {
- player.discard(event.card);
- player.storage.rejizhi++;
- if (_status.currentPhase == player) {
- player.markSkill("rejizhi");
- }
- }
- },
- ai: {
- threaten: 1.4,
- noautowuxie: true,
- },
- mod: {
- maxHandcard: function (player, num) {
- return num + player.storage.rejizhi;
- },
- },
- intro: {
- content: "本回合手牌上限+#",
- },
- group: "rejizhi_clear",
- subSkill: {
- clear: {
- trigger: { global: "phaseAfter" },
- silent: true,
- content: function () {
- player.storage.rejizhi = 0;
- player.unmarkSkill("rejizhi");
- },
- },
- },
- },
- rebiyue: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- frequent: true,
- content: function () {
- var num = 1;
- if (!player.countCards("h")) {
- num = 2;
- }
- player.draw(num);
- },
- },
- rerende: {
- audio: 2,
- audioname: ["gz_jun_liubei", "shen_caopi"],
- enable: "phaseUse",
- filterCard: true,
- selectCard: [1, Infinity],
- discard: false,
- lose: false,
- delay: false,
- filterTarget: function (card, player, target) {
- if (player.storage.rerende2 && player.storage.rerende2.includes(target)) return false;
- return player != target;
- },
- onremove: ["rerende", "rerende2"],
- 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.rerende < 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.rerende) {
- var next = game.createEvent("rerende_clear");
- _status.event.next.remove(next);
- evt.after.push(next);
- evt.rerende = true;
- next.player = player;
- next.setContent(lib.skill.rerende1.content);
- }
- if (!Array.isArray(player.storage.rerende2)) {
- player.storage.rerende2 = [];
- }
- player.storage.rerende2.push(target);
- player.give(cards, target);
- "step 1";
- if (typeof player.storage.rerende != "number") {
- player.storage.rerende = 0;
- }
- if (player.storage.rerende >= 0) {
- player.storage.rerende += cards.length;
- if (player.storage.rerende >= 2) {
- var list = [];
- if (
- lib.filter.cardUsable(
- { name: "sha" },
- 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 },
- player,
- event.getParent("chooseToUse")
- ) &&
- game.hasPlayer(function (current) {
- return player.canUse({ name: "sha", nature: i }, current);
- })
- ) {
- list.push(["基本", "", "sha", i]);
- }
- }
- if (
- lib.filter.cardUsable(
- { name: "tao" },
- player,
- event.getParent("chooseToUse")
- ) &&
- game.hasPlayer(function (current) {
- return player.canUse("tao", current);
- })
- ) {
- list.push(["基本", "", "tao"]);
- }
- if (
- lib.filter.cardUsable(
- { name: "jiu" },
- 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.rerende = -1;
- } else {
- event.finish();
- }
- } else {
- event.finish();
- }
- "step 2";
- if (result && result.bool && result.links[0]) {
- var card = { name: result.links[0][2], nature: result.links[0][3] };
- player.chooseUseTarget(card, true);
- }
- },
- ai: {
- fireAttack: true,
- order: function (skill, player) {
- if (
- player.hp < player.maxHp &&
- player.storage.rerende < 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.rerende < 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,
- },
- },
- rerende1: {
- trigger: { player: "phaseUseBegin" },
- silent: true,
- content: function () {
- player.storage.rerende = 0;
- player.storage.rerende2 = [];
- },
- },
- liyu: {
- audio: 2,
- trigger: { source: "damageSource" },
- forced: true,
- filter: function (event, player) {
- if (event._notrigger.includes(event.player)) return false;
- return (
- event.card &&
- event.card.name == "sha" &&
- event.player.isIn() &&
- event.player.countGainableCards(player, "he") > 0
- );
- },
- check: function () {
- return false;
- },
- content: function () {
- "step 0";
- trigger.player
- .chooseTarget(function (card, player, target) {
- var evt = _status.event.getParent();
- return (
- evt.player.canUse({ name: "juedou" }, target) &&
- target != _status.event.player
- );
- }, get.prompt("liyu"))
- .set("ai", function (target) {
- var evt = _status.event.getParent();
- return (
- get.effect(target, { name: "juedou" }, evt.player, _status.event.player) - 2
- );
- });
- "step 1";
- if (result.bool) {
- player.gainPlayerCard(trigger.player, "he", true);
- event.target = result.targets[0];
- trigger.player.line(player, "green");
- } else {
- event.finish();
- }
- "step 2";
- if (event.target) {
- player.useCard({ name: "juedou", isCard: true }, event.target, "noai");
- }
- },
- ai: {
- halfneg: true,
- },
- },
- /*reqicai:{
- trigger:{player:'equipEnd'},
- frequent:true,
- content:function(){
- player.draw();
- },
- mod:{
- targetInRange:function(card,player,target,now){
- var type=get.type(card);
- if(type=='trick'||type=='delay') return true;
- }
- },
- },*/
- retuxi: {
- audio: 2,
- trigger: { player: "phaseDrawBegin2" },
- direct: true,
- filter: function (event) {
- return event.num > 0;
- },
- content: function () {
- "step 0";
- player.chooseTarget(
- get.prompt("retuxi"),
- [1, trigger.num],
- function (card, player, target) {
- return (
- target.countCards("h") > 0 &&
- player != target &&
- target.countCards("h") >= player.countCards("h")
- );
- },
- function (target) {
- var att = get.attitude(_status.event.player, target);
- if (target.hasSkill("tuntian")) return att / 10;
- return 1 - att;
- }
- );
- "step 1";
- if (result.bool) {
- player.logSkill("retuxi", result.targets);
- player.gainMultiple(result.targets);
- trigger.num -= result.targets.length;
- } else {
- event.finish();
- }
- "step 2";
- if (trigger.num <= 0) game.delay();
- },
- ai: {
- threaten: 1.6,
- expose: 0.2,
- },
- },
- reguicai: {
- audio: 2,
- trigger: { global: "judge" },
- direct: true,
- filter: function (event, player) {
- return player.countCards("hes") > 0;
- },
- content: function () {
- "step 0";
- player
- .chooseCard(
- get.translation(trigger.player) +
- "的" +
- (trigger.judgestr || "") +
- "判定为" +
- get.translation(trigger.player.judging[0]) +
- "," +
- get.prompt("reguicai"),
- "hes",
- 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) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.player;
- var judging = _status.event.judging;
- var result = trigger.judge(card) - trigger.judge(judging);
- var attitude = get.attitude(player, trigger.player);
- if (attitude == 0 || result == 0) return 0;
- if (attitude > 0) {
- return result - get.value(card) / 2;
- } else {
- return -result - get.value(card) / 2;
- }
- })
- .set("judging", trigger.player.judging[0]);
- "step 1";
- if (result.bool) {
- player.respond(result.cards, "reguicai", "highlight", "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);
- }
- },
- ai: {
- rejudge: true,
- tag: {
- rejudge: 1,
- },
- },
- },
- refankui: {
- audio: 2,
- trigger: { player: "damageEnd" },
- direct: true,
- filter: function (event, player) {
- return (
- event.source &&
- event.source.countGainableCards(player, event.source != player ? "he" : "e") &&
- event.num > 0
- );
- },
- content: function () {
- "step 0";
- event.count = trigger.num;
- "step 1";
- event.count--;
- player
- .gainPlayerCard(
- get.prompt("refankui", trigger.source),
- trigger.source,
- get.buttonValue,
- trigger.source != player ? "he" : "e"
- )
- .set("logSkill", [event.name, trigger.source]);
- "step 2";
- if (
- result.bool &&
- event.count > 0 &&
- trigger.source.countGainableCards(player, trigger.source != player ? "he" : "e") >
- 0 &&
- player.hasSkill(event.name)
- )
- event.goto(1);
- },
- ai: {
- maixie_defend: true,
- effect: {
- target: function (card, player, target) {
- if (player.countCards("he") > 1 && get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5];
- if (get.attitude(target, player) < 0) return [1, 1];
- }
- },
- },
- },
- },
- reluoyi: {
- audio: 2,
- trigger: { player: "phaseDrawBegin1" },
- check: function (event, player) {
- if (player.countCards("h", "sha")) return true;
- return Math.random() < 0.5;
- },
- content: function () {
- "step 0";
- player.addTempSkill("reluoyi2", { player: "phaseBefore" });
- trigger.cancel(null, null, "notrigger");
- "step 1";
- event.cards = get.cards(3);
- player.showCards(event.cards, "裸衣");
- "step 2";
- for (var i = 0; i < cards.length; i++) {
- if (
- get.type(cards[i]) != "basic" &&
- cards[i].name != "juedou" &&
- (get.type(cards[i]) != "equip" || get.subtype(cards[i]) != "equip1")
- ) {
- cards[i].discard();
- cards.splice(i--, 1);
- }
- }
- player.gain(cards, "gain2");
- },
- },
- reluoyi2: {
- trigger: { source: "damageBegin1" },
- filter: function (event) {
- return (
- event.card &&
- (event.card.name == "sha" || event.card.name == "juedou") &&
- event.notLink()
- );
- },
- forced: true,
- content: function () {
- trigger.num++;
- },
- ai: {
- damageBonus: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag === "damageBonus")
- return arg && arg.card && (arg.card.name === "sha" || arg.card.name === "juedou");
- },
- },
- },
- reganglie: {
- audio: 2,
- trigger: { player: "damageEnd" },
- filter: function (event, player) {
- return event.source != undefined && event.num > 0;
- },
- check: function (event, player) {
- return get.attitude(player, event.source) <= 0;
- },
- logTarget: "source",
- preHidden: true,
- content: function () {
- "step 0";
- event.num = trigger.num;
- if (get.mode() == "guozhan") event.num = 1;
- "step 1";
- player.judge(function (card) {
- if (get.color(card) == "red") return 1;
- return 0;
- });
- "step 2";
- if (result.color == "black") {
- if (trigger.source.countCards("he")) {
- player.discardPlayerCard(trigger.source, "he", true);
- }
- } else if (trigger.source.isIn()) {
- trigger.source.damage();
- }
- event.num--;
- if (event.num > 0 && player.hasSkill("reganglie")) {
- player.chooseBool(get.prompt2("reganglie"));
- } else {
- event.finish();
- }
- "step 3";
- if (result.bool) {
- player.logSkill("reganglie", trigger.source);
- event.goto(1);
- }
- },
- ai: {
- maixie_defend: true,
- expose: 0.4,
- },
- },
- qinxue: {
- skillAnimation: true,
- animationColor: "wood",
- audio: 2,
- unique: true,
- juexingji: true,
- derivation: "gongxin",
- trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin"] },
- forced: true,
- filter: function (event, player) {
- if (player.countCards("h") >= player.hp + 2) return true;
- return false;
- },
- content: function () {
- player.awakenSkill("qinxue");
- player.loseMaxHp();
- player.chooseDrawRecover(2, true);
- player.addSkills("gongxin");
- },
- },
- qingjian: {
- audio: 2,
- unique: true,
- trigger: { player: "gainAfter" },
- direct: true,
- usable: 4,
- filter: function (event, player) {
- var evt = event.getParent("phaseDraw");
- if (evt && evt.player == player) return false;
- return event.getg(player).length > 0;
- },
- content: function () {
- "step 0";
- event.cards = trigger.getg(player);
- "step 1";
- player.chooseCardTarget({
- filterCard: function (card) {
- return _status.event.getParent().cards.includes(card);
- },
- selectCard: [1, event.cards.length],
- filterTarget: function (card, player, target) {
- return player != target;
- },
- ai1: function (card) {
- if (ui.selected.cards.length > 0) return -1;
- if (card.name == "du") return 20;
- return _status.event.player.countCards("h") - _status.event.player.hp;
- },
- ai2: function (target) {
- var att = get.attitude(_status.event.player, target);
- if (ui.selected.cards.length && ui.selected.cards[0].name == "du") {
- if (target.hasSkillTag("nodu")) return 0;
- return 1 - att;
- }
- if (target.countCards("h") > _status.event.player.countCards("h")) return 0;
- return att - 4;
- },
- prompt: "请选择要送人的卡牌",
- });
- "step 2";
- if (result.bool) {
- player.storage.qingjian++;
- player.logSkill("qingjian", result.targets);
- result.targets[0].gain(result.cards, player, "give");
- for (var i = 0; i < result.cards.length; i++) {
- event.cards.remove(result.cards[i]);
- }
- if (event.cards.length) event.goto(1);
- } else {
- player.storage.counttrigger.qingjian--;
- }
- },
- ai: {
- expose: 0.3,
- },
- },
- reyingzi: {
- audio: 2,
- audioname: ["heqi", "sunce", "gexuan", "re_sunben", "re_sunce", "re_heqi"],
- audioname2: { re_sunyi: "reyingzi_re_sunyi" },
- trigger: { player: "phaseDrawBegin2" },
- forced: true,
- preHidden: true,
- filter: function (event, player) {
- return !event.numFixed;
- },
- content: function () {
- trigger.num++;
- },
- ai: {
- threaten: 1.5,
- },
- mod: {
- maxHandcardBase: function (player, num) {
- return player.maxHp;
- },
- },
- },
- refanjian: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.countCards("h") > 0;
- },
- filterTarget: function (card, player, target) {
- return player != target;
- },
- filterCard: true,
- check: function (card) {
- return 8 - get.value(card);
- },
- discard: false,
- lose: false,
- delay: false,
- content: function () {
- "step 0";
- target.storage.refanjian = cards[0];
- player.give(cards[0], target);
- "step 1";
- var suit = get.suit(target.storage.refanjian);
- if (!target.countCards("h")) event._result = { control: "refanjian_hp" };
- else
- target.chooseControl("refanjian_card", "refanjian_hp").ai = function (event, player) {
- var cards = player.getCards("he", { suit: get.suit(player.storage.refanjian) });
- if (cards.length == 1) return 0;
- if (cards.length >= 2) {
- for (var i = 0; i < cards.length; i++) {
- if (get.tag(cards[i], "save")) return 1;
- }
- }
- if (player.hp == 1) return 0;
- for (var i = 0; i < cards.length; i++) {
- if (get.value(cards[i]) >= 8) return 1;
- }
- if (cards.length > 2 && player.hp > 2) return 1;
- if (cards.length > 3) return 1;
- return 0;
- };
- "step 2";
- if (result.control == "refanjian_card") {
- target.showHandcards();
- } else {
- target.loseHp();
- event.finish();
- }
- "step 3";
- var suit = get.suit(target.storage.refanjian);
- target.discard(
- target.getCards("he", function (i) {
- return get.suit(i) == suit && lib.filter.cardDiscardable(i, target, "refanjian");
- })
- );
- delete target.storage.refanjian;
- },
- ai: {
- order: 9,
- result: {
- target: function (player, target) {
- return -target.countCards("he") - (player.countCards("h", "du") ? 1 : 0);
- },
- },
- threaten: 2,
- },
- },
- reqianxun: {
- audio: 2,
- trigger: {
- target: "useCardToBegin",
- player: "judgeBefore",
- },
- filter: function (event, player) {
- if (player.countCards("h") == 0) return false;
- if (event.getParent().name == "phaseJudge") {
- return true;
- }
- if (event.name == "judge") return false;
- if (event.targets && event.targets.length > 1) return false;
- if (event.card && get.type(event.card) == "trick" && event.player != player) return true;
- },
- content: function () {
- var cards = player.getCards("h");
- player.addToExpansion(cards, "giveAuto", player).gaintag.add("reqianxun2");
- player.addSkill("reqianxun2");
- },
- ai: {
- effect: function (card, player, target) {
- if (player == target || !target.hasFriend()) return;
- var type = get.type(card);
- var nh = Math.min(
- target.countCards(),
- game.countPlayer((i) => get.attitude(target, i) > 0)
- );
- if (type == "trick") {
- if (!get.tag(card, "multitarget") || get.info(card).singleCard) {
- if (get.tag(card, "damage")) return [1.5, nh - 1];
- return [1, nh];
- }
- } else if (type == "delay") return [0.5, 0.5];
- },
- },
- },
- reqianxun2: {
- trigger: { global: "phaseEnd" },
- forced: true,
- audio: false,
- content: function () {
- var cards = player.getExpansions("reqianxun2");
- if (cards.length) player.gain(cards, "draw");
- player.removeSkill("reqianxun2");
- },
- intro: {
- mark: function (dialog, storage, player) {
- var cards = player.getExpansions("reqianxun2");
- if (player.isUnderControl(true)) dialog.addAuto(cards);
- else return "共有" + get.cnNumber(cards.length) + "张牌";
- },
- markcount: "expansion",
- },
- },
- relianying: {
- audio: 2,
- trigger: {
- player: "loseAfter",
- global: [
- "equipAfter",
- "addJudgeAfter",
- "gainAfter",
- "loseAsyncAfter",
- "addToExpansionAfter",
- ],
- },
- direct: true,
- filter: function (event, player) {
- if (player.countCards("h")) return false;
- var evt = event.getl(player);
- return evt && evt.hs && evt.hs.length;
- },
- content: function () {
- "step 0";
- var num = trigger.getl(player).hs.length;
- player.chooseTarget(
- get.prompt("relianying"),
- "令至多" + get.cnNumber(num) + "名角色各摸一张牌",
- [1, num]
- ).ai = function (target) {
- var player = _status.event.player;
- if (player == target) return get.attitude(player, target) + 10;
- return get.attitude(player, target);
- };
- "step 1";
- if (result.bool) {
- player.logSkill("relianying", result.targets);
- game.asyncDraw(result.targets);
- } else event.finish();
- "step 2";
- game.delay();
- },
- ai: {
- threaten: 0.8,
- effect: {
- target: function (card) {
- if (card.name == "guohe" || card.name == "liuxinghuoyu") return 0.5;
- },
- },
- noh: true,
- },
- },
- retishen: {
- audio: 2,
- unique: true,
- mark: true,
- skillAnimation: true,
- animationColor: "soil",
- limited: true,
- trigger: { player: "phaseZhunbeiBegin" },
- init: function (player) {
- player.storage.retishen = false;
- },
- filter: function (event, player) {
- if (player.storage.retishen) return false;
- if (typeof player.storage.retishen2 == "number") {
- return player.hp < player.storage.retishen2;
- }
- return false;
- },
- check: function (event, player) {
- if (player.hp <= 1) return true;
- return player.hp < player.storage.retishen2 - 1;
- },
- content: function () {
- player.awakenSkill("retishen");
- player.recover(player.storage.retishen2 - player.hp);
- player.draw(player.storage.retishen2 - player.hp);
- player.storage.retishen = true;
- },
- intro: {
- mark: function (dialog, content, player) {
- if (player.storage.retishen) return;
- if (typeof player.storage.retishen2 != "number") {
- return "上回合体力:无";
- }
- return "上回合体力:" + player.storage.retishen2;
- },
- content: "limited",
- },
- group: ["retishen2"],
- },
- retishen2: {
- trigger: { player: "phaseJieshuBegin" },
- priority: -10,
- silent: true,
- content: function () {
- player.storage.retishen2 = player.hp;
- game.broadcast(function (player) {
- player.storage.retishen2 = player.hp;
- }, player);
- game.addVideo("storage", player, ["retishen2", player.storage.retishen2]);
- },
- intro: {
- content: function (storage, player) {
- if (player.storage.retishen) return;
- return "上回合体力:" + storage;
- },
- },
- },
- reyajiao: {
- audio: 2,
- trigger: { player: ["respond", "useCard"] },
- frequent: true,
- filter: function (event, player) {
- return player != _status.currentPhase && get.itemtype(event.cards) == "cards";
- },
- content: function () {
- "step 0";
- event.card = get.cards()[0];
- game.broadcast(function (card) {
- ui.arena.classList.add("thrownhighlight");
- card.copy("thrown", "center", "thrownhighlight", ui.arena).addTempClass("start");
- }, event.card);
- event.node = event.card
- .copy("thrown", "center", "thrownhighlight", ui.arena)
- .addTempClass("start");
- ui.arena.classList.add("thrownhighlight");
- game.addVideo("thrownhighlight1");
- game.addVideo("centernode", null, get.cardInfo(event.card));
- if (get.type(event.card, "trick") == get.type(trigger.card, "trick")) {
- player
- .chooseTarget("选择获得此牌的角色")
- .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 (att > 0) {
- return att + Math.max(0, 5 - target.countCards("h"));
- }
- return att;
- })
- .set("du", event.card.name == "du");
- } else {
- player.chooseBool("是否弃置" + get.translation(event.card) + "?");
- event.disbool = true;
- }
- game.delay(2);
- "step 1";
- if (event.disbool) {
- if (!result.bool) {
- game.log(player, "展示了", event.card);
- ui.cardPile.insertBefore(event.card, ui.cardPile.firstChild);
- } else {
- game.log(player, "展示并弃掉了", event.card);
- event.card.discard();
- }
- game.addVideo("deletenode", player, [get.cardInfo(event.node)]);
- event.node.delete();
- game.broadcast(function (card) {
- ui.arena.classList.remove("thrownhighlight");
- if (card.clone) {
- card.clone.delete();
- }
- }, event.card);
- } else if (result.targets) {
- player.line(result.targets, "green");
- result.targets[0].gain(event.card, "log");
- event.node.moveDelete(result.targets[0]);
- game.addVideo("gain2", result.targets[0], [get.cardInfo(event.node)]);
- game.broadcast(
- function (card, target) {
- ui.arena.classList.remove("thrownhighlight");
- if (card.clone) {
- card.clone.moveDelete(target);
- }
- },
- event.card,
- result.targets[0]
- );
- } else {
- game.log(player, "展示并弃掉了", event.card);
- event.card.discard();
- game.addVideo("deletenode", player, [get.cardInfo(event.node)]);
- event.node.delete();
- game.broadcast(function (card) {
- ui.arena.classList.remove("thrownhighlight");
- if (card.clone) {
- card.clone.delete();
- }
- }, event.card);
- }
- game.addVideo("thrownhighlight2");
- ui.arena.classList.remove("thrownhighlight");
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "respond") && target.countCards("h") > 1) return [1, 0.2];
- },
- },
- },
- },
- rejianxiong: {
- audio: 2,
- audioname: ["shen_caopi"],
- trigger: { player: "damageEnd" },
- filter: function (event, player) {
- return get.itemtype(event.cards) == "cards" && get.position(event.cards[0], true) == "o";
- },
- content: function () {
- player.gain(trigger.cards);
- player.$gain2(trigger.cards);
- player.draw();
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- effect: {
- target: function (card, player, target) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -1];
- if (get.tag(card, "damage")) return [1, 0.55];
- },
- },
- },
- },
- rejianxiong_old: {
- audio: "rejianxiong",
- audioname2: {
- gz_caocao: "jianxiong",
- },
- trigger: { player: "damageEnd" },
- async cost(event, trigger, player) {
- let list = ["摸牌"];
- if (get.itemtype(trigger.cards) == "cards" && trigger.cards.filterInD().length) {
- list.push("拿牌");
- }
- list.push("cancel2");
- const {
- result: { control },
- } = await player
- .chooseControl(list)
- .set("prompt", get.prompt2("rejianxiong_old"))
- .set("ai", () => {
- const player = get.event("player"),
- trigger = get.event().getTrigger();
- const cards = trigger.cards.filterInD();
- if (get.event().controls.includes("拿牌")) {
- if (
- cards.reduce((sum, card) => {
- return sum + (card.name == "du" ? -1 : 1);
- }, 0) > 1 ||
- player.getUseValue(cards[0]) > 6
- )
- return "拿牌";
- }
- return "摸牌";
- });
- event.result = { bool: control != "cancel2", cost_data: control };
- },
- async content(event, trigger, player) {
- if (event.cost_data == "摸牌") await player.draw();
- else await player.gain(trigger.cards.filterInD(), "gain2");
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- effect: {
- target(card, player, target) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -1];
- if (get.tag(card, "damage") && player != target) return [1, 0.6];
- },
- },
- },
- },
- reyiji: {
- audio: 2,
- trigger: { player: "damageEnd" },
- frequent: true,
- filter: function (event) {
- return event.num > 0;
- },
- content: function () {
- "step 0";
- event.num = 1;
- event.count = 1;
- "step 1";
- player.gain(get.cards(2));
- player.$draw(2);
- "step 2";
- player.chooseCardTarget({
- filterCard: true,
- selectCard: [1, 2],
- filterTarget: function (card, player, target) {
- return player != target && target != event.temp;
- },
- ai1: function (card) {
- if (ui.selected.cards.length > 0) return -1;
- if (card.name == "du") return 20;
- return _status.event.player.countCards("h") - _status.event.player.hp;
- },
- ai2: function (target) {
- var att = get.attitude(_status.event.player, target);
- if (ui.selected.cards.length && ui.selected.cards[0].name == "du") {
- if (target.hasSkillTag("nodu")) return 0;
- return 1 - att;
- }
- return att - 4;
- },
- prompt: "请选择要送人的卡牌",
- });
- "step 3";
- if (result.bool) {
- player.lose(result.cards, ui.special, "toStorage");
- if (result.targets[0].hasSkill("reyiji2")) {
- result.targets[0].storage.reyiji2 = result.targets[0].storage.reyiji2.concat(
- result.cards
- );
- } else {
- result.targets[0].addSkill("reyiji2");
- result.targets[0].storage.reyiji2 = result.cards;
- }
- player.$give(result.cards.length, result.targets[0], false);
- player.line(result.targets, "green");
- game.addVideo("storage", result.targets[0], [
- "reyiji2",
- get.cardsInfo(result.targets[0].storage.reyiji2),
- "cards",
- ]);
- if (num == 1) {
- event.temp = result.targets[0];
- event.num++;
- event.goto(2);
- } else if (event.count < trigger.num) {
- delete event.temp;
- event.num = 1;
- event.count++;
- event.goto(1);
- }
- } else if (event.count < trigger.num) {
- delete event.temp;
- event.num = 1;
- event.count++;
- event.goto(1);
- }
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- result: {
- effect: function (card, player, target) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- if (!target.hasFriend()) return;
- var num = 1;
- if (get.attitude(player, target) > 0) {
- if (player.needsToDiscard()) num = 0.7;
- else num = 0.5;
- }
- if (player.hp >= 4) return [1, num * 2];
- if (target.hp == 3) return [1, num * 1.5];
- if (target.hp == 2) return [1, num * 0.5];
- }
- },
- },
- threaten: 0.6,
- },
- },
- reyiji2: {
- trigger: { player: "phaseDrawBegin" },
- forced: true,
- mark: true,
- popup: "遗计拿牌",
- audio: false,
- content: function () {
- player.$draw(player.storage.reyiji2.length);
- player.gain(player.storage.reyiji2, "fromStorage");
- delete player.storage.reyiji2;
- player.removeSkill("reyiji2");
- game.delay();
- },
- intro: {
- content: "cardCount",
- },
- },
- yijue: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: function (card, player, target) {
- return player != target && target.countCards("h");
- },
- filter: function (event, player) {
- return player.countCards("h") > 0;
- },
- content: function () {
- "step 0";
- player.chooseToCompare(target).set("small", true);
- "step 1";
- if (result.bool) {
- if (!target.hasSkill("fengyin")) {
- target.addTempSkill("fengyin");
- }
- target.addTempSkill("yijue2");
- event.finish();
- } else if (target.hp < target.maxHp) {
- player.chooseBool("是否让目标回复1点体力?").ai = function (event, player) {
- return get.recoverEffect(target, player, player) > 0;
- };
- } else {
- event.finish();
- }
- "step 2";
- if (result.bool) {
- target.recover();
- }
- },
- 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 (get.number(hs[i]) >= 9 && get.value(hs[i]) < 7) {
- bool = true;
- break;
- }
- }
- if (!bool) return 0;
- if (target.countCards("h") > target.hp + 1 && get.recoverEffect(target) > 0) {
- return 1;
- }
- if (
- player.canUse("sha", target) &&
- (player.countCards("h", "sha") || player.countCards("he", { color: "red" }))
- ) {
- return -2;
- }
- return -0.5;
- },
- },
- order: 9,
- },
- },
- yijue2: {
- mark: true,
- mod: {
- cardEnabled: function () {
- return false;
- },
- cardRespondable: function () {
- return false;
- },
- cardSavable: function () {
- return false;
- },
- },
- intro: {
- content: "不能使用或打出卡牌",
- },
- },
- retieji: {
- shaRelated: true,
- audio: 2,
- audioname: ["boss_lvbu3"],
- trigger: { player: "useCardToPlayered" },
- check: function (event, player) {
- return get.attitude(player, event.target) <= 0;
- },
- filter: function (event, player) {
- return event.card.name == "sha";
- },
- logTarget: "target",
- content: function () {
- "step 0";
- player.judge(function () {
- return 0;
- });
- if (!trigger.target.hasSkill("fengyin")) {
- trigger.target.addTempSkill("fengyin");
- }
- "step 1";
- var suit = result.suit;
- var target = trigger.target;
- var num = target.countCards("h", "shan");
- target
- .chooseToDiscard(
- "请弃置一张" + get.translation(suit) + "牌,否则不能使用闪抵消此杀",
- "he",
- function (card) {
- return get.suit(card) == _status.event.suit;
- }
- )
- .set("ai", function (card) {
- var num = _status.event.num;
- if (num == 0) return 0;
- if (card.name == "shan") return num > 1 ? 2 : 0;
- return 8 - get.value(card);
- })
- .set("num", num)
- .set("suit", suit);
- "step 2";
- if (!result.bool) {
- trigger.getParent().directHit.add(trigger.target);
- }
- },
- ai: {
- ignoreSkill: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag == "directHit_ai") {
- return get.attitude(player, arg.target) <= 0;
- }
- if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false;
- if (!arg.target || get.attitude(player, arg.target) >= 0) return false;
- if (
- !arg.skill ||
- !lib.skill[arg.skill] ||
- lib.skill[arg.skill].charlotte ||
- get.is.locked(arg.skill) ||
- !arg.target.getSkills(true, false).includes(arg.skill)
- )
- return false;
- },
- directHit_ai: true,
- },
- },
- reyicong: {
- trigger: {
- player: ["changeHp"],
- },
- audio: 2,
- audioname2: { gongsunzan: "yicong" },
- forced: true,
- filter: function (event, player) {
- return get.sgn(player.hp - 2.5) != get.sgn(player.hp - 2.5 - event.num);
- },
- content: function () {},
- mod: {
- globalFrom: function (from, to, current) {
- return current - 1;
- },
- globalTo: function (from, to, current) {
- if (to.hp <= 2) return current + 1;
- },
- },
- ai: {
- threaten: 0.8,
- },
- },
- reqiaomeng: {
- audio: "qiaomeng",
- trigger: { source: "damageSource" },
- direct: true,
- filter: function (event, player) {
- if (event._notrigger.includes(event.player)) return false;
- return (
- event.card &&
- event.card.name == "sha" &&
- event.player.countDiscardableCards(player, "hej")
- );
- },
- content: function () {
- "step 0";
- player
- .discardPlayerCard(get.prompt("reqiaomeng", trigger.player), "hej", trigger.player)
- .set("logSkill", ["reqiaomeng", trigger.player]);
- "step 1";
- if (result.bool) {
- var card = result.cards[0];
- if (get.position(card) == "d") {
- if (
- get.subtype(card) == "equip3" ||
- get.subtype(card) == "equip4" ||
- get.subtype(card) == "equip6"
- ) {
- player.gain(card, player, "gain2");
- }
- }
- }
- },
- },
- qiaomeng: {
- audio: 2,
- trigger: { source: "damageSource" },
- direct: true,
- filter: function (event, player) {
- if (event._notrigger.includes(event.player)) return false;
- return (
- event.card &&
- event.card.name == "sha" &&
- event.cards &&
- get.color(event.cards) == "black" &&
- event.player.countDiscardableCards(player, "hej")
- );
- },
- content: function () {
- "step 0";
- player
- .discardPlayerCard(get.prompt("qiaomeng", trigger.player), "e", trigger.player)
- .set("logSkill", ["qiaomeng", trigger.player]);
- "step 1";
- if (result.bool) {
- var card = result.cards[0];
- if (get.position(card) == "d") {
- if (
- get.subtype(card) == "equip3" ||
- get.subtype(card) == "equip4" ||
- get.subtype(card) == "equip6"
- ) {
- player.gain(card, player, "gain2");
- }
- }
- }
- },
- },
- rekurou: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterCard: true,
- check: function (card) {
- return 8 - get.value(card);
- },
- position: "he",
- content: function () {
- player.loseHp();
- },
- ai: {
- order: 8,
- result: {
- player: function (player) {
- return get.effect(player, { name: "losehp" }, player, player);
- },
- },
- neg: true,
- },
- },
- zhaxiang: {
- audio: 2,
- audioname: ["ol_sb_jiangwei"],
- trigger: { player: "loseHpEnd" },
- forced: true,
- content: function () {
- "step 0";
- event.count = trigger.num;
- "step 1";
- event.count--;
- player.draw(3);
- if (player.isPhaseUsing()) {
- player.addTempSkill("zhaxiang2");
- player.addMark("zhaxiang2", 1, false);
- }
- "step 2";
- if (
- event.count > 0 &&
- player.hasSkill("zhaxiang") &&
- !get.is.blocked("zhaxiang", player)
- ) {
- player.logSkill("zhaxiang");
- event.goto(1);
- }
- },
- ai: {
- maihp: true,
- effect: function (card, player, target) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, 1];
- return 1.2;
- }
- if (get.tag(card, "loseHp")) {
- if (target.hp <= 1) return;
- var using = target.isPhaseUsing();
- if (target.hp <= 2) return [1, player.countCards("h") <= 1 && using ? 3 : 0];
- if (using && target.countCards("h", { name: "sha", color: "red" })) return [1, 3];
- return [
- 1,
- target.countCards("h") <= target.hp ||
- (using &&
- game.hasPlayer(function (current) {
- return (
- current != player &&
- get.attitude(player, current) < 0 &&
- player.inRange(current)
- );
- }))
- ? 3
- : 2,
- ];
- }
- },
- },
- },
- zhaxiang2: {
- mod: {
- targetInRange: function (card, player, target, now) {
- if (card.name == "sha" && get.color(card) == "red") return true;
- },
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return num + player.storage.zhaxiang2;
- },
- },
- charlotte: true,
- onremove: true,
- audio: "zhaxiang",
- audioname: ["ol_sb_jiangwei"],
- trigger: { player: "useCard" },
- filter: function (event, player) {
- return event.card && event.card.name == "sha" && get.color(event.card) == "red";
- },
- forced: true,
- content: function () {
- trigger.directHit.addArray(game.players);
- },
- intro: {
- content: "使用【杀】的次数上限+#
使用红色【杀】无距离限制且不能被【闪】响应",
- },
- ai: {
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- return arg.card.name == "sha" && get.color(arg.card) == "red";
- },
- },
- },
- zhuhai: {
- audio: 2,
- audioname: ["gz_re_xushu"],
- trigger: { global: "phaseJieshuBegin" },
- direct: true,
- filter: function (event, player) {
- return (
- event.player.isIn() &&
- event.player.getStat("damage") &&
- lib.filter.targetEnabled({ name: "sha" }, player, event.player) &&
- (player.hasSha() || (_status.connectMode && player.countCards("h") > 0))
- );
- },
- content: function () {
- player
- .chooseToUse(function (card, player, event) {
- if (get.name(card) != "sha") return false;
- return lib.filter.filterCard.apply(this, arguments);
- }, "诛害:是否对" + get.translation(trigger.player) + "使用一张杀?")
- .set("logSkill", "zhuhai")
- .set("complexSelect", true)
- .set("filterTarget", function (card, player, target) {
- if (
- target != _status.event.sourcex &&
- !ui.selected.targets.includes(_status.event.sourcex)
- )
- return false;
- return lib.filter.targetEnabled.apply(this, arguments);
- })
- .set("sourcex", trigger.player);
- },
- },
- qianxin: {
- skillAnimation: true,
- animationColor: "orange",
- audio: 2,
- unique: true,
- juexingji: true,
- trigger: { source: "damageSource" },
- forced: true,
- derivation: "jianyan",
- filter: function (event, player) {
- return player.hp < player.maxHp;
- },
- content: function () {
- player.awakenSkill("qianxin");
- player.addSkills("jianyan");
- player.loseMaxHp();
- },
- },
- jianyan: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- delay: false,
- filter: function (event, player) {
- return game.hasPlayer(function (current) {
- return current.hasSex("male");
- });
- },
- content: function () {
- "step 0";
- player.chooseControl(["red", "black", "basic", "trick", "equip"]).set("ai", function () {
- var player = _status.event.player;
- if (!player.hasShan()) return "basic";
- if (player.countCards("e") <= 1) return "equip";
- if (player.countCards("h") > 2) return "trick";
- return "red";
- });
- "step 1";
- event.card = get.cardPile(function (card) {
- if (get.color(card) == result.control) return true;
- if (get.type(card, "trick") == result.control) return true;
- return false;
- }, "cardPile");
- if (!event.card) {
- event.finish();
- return;
- }
- player.showCards([event.card]);
- "step 2";
- player
- .chooseTarget(
- true,
- "选择一名男性角色送出" + get.translation(event.card),
- function (card, player, target) {
- return target.hasSex("male");
- }
- )
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- if (_status.event.neg) return -att;
- return att;
- })
- .set("neg", get.value(event.card, player, "raw") < 0);
- "step 3";
- player.line(result.targets, "green");
- result.targets[0].gain(event.card, "gain2");
- },
- ai: {
- order: 9,
- result: {
- player: function (player) {
- if (
- game.hasPlayer(function (current) {
- return current.hasSex("male") && get.attitude(player, current) > 0;
- })
- )
- return 2;
- return 0;
- },
- },
- threaten: 1.2,
- },
- },
- reguose: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- discard: false,
- lose: false,
- delay: false,
- filter: function (event, player) {
- return player.countCards("hes", { suit: "diamond" }) > 0;
- },
- position: "hes",
- filterCard: { suit: "diamond" },
- filterTarget: function (card, player, target) {
- if (
- get.position(ui.selected.cards[0]) != "s" &&
- lib.filter.cardDiscardable(ui.selected.cards[0], player, "reguose") &&
- target.hasJudge("lebu")
- )
- return true;
- if (player == target) return false;
- if (!game.checkMod(ui.selected.cards[0], player, "unchanged", "cardEnabled2", player))
- return false;
- return player.canUse({ name: "lebu", cards: ui.selected.cards }, target);
- },
- check: function (card) {
- return 7 - get.value(card);
- },
- content: function () {
- if (target.hasJudge("lebu")) {
- player.discard(cards);
- target.discard(target.getJudge("lebu"));
- } else {
- player.useCard({ name: "lebu" }, target, cards).audio = false;
- }
- player.draw();
- },
- ai: {
- result: {
- target: function (player, target) {
- if (target.hasJudge("lebu"))
- return -get.effect(target, { name: "lebu" }, player, target);
- return get.effect(target, { name: "lebu" }, player, target);
- },
- },
- order: 9,
- },
- },
- fenwei: {
- skillAnimation: true,
- animationColor: "wood",
- audio: 2,
- audioname: ["heqi"],
- unique: true,
- mark: true,
- limited: true,
- trigger: { global: "useCardToPlayered" },
- //priority:5,
- filter: function (event, player) {
- if (event.getParent().triggeredTargets3.length > 1) 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;
- if (player.storage.fenwei) return false;
- return true;
- },
- init: function (player) {
- player.storage.fenwei = false;
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(
- get.prompt("fenwei"),
- [1, trigger.targets.length],
- function (card, player, target) {
- return _status.event.targets.includes(target);
- }
- )
- .set("ai", function (target) {
- var trigger = _status.event.getTrigger();
- if (
- game.phaseNumber > game.players.length * 2 &&
- trigger.targets.length >= game.players.length - 1 &&
- !trigger.excluded.includes(target)
- ) {
- return -get.effect(
- target,
- trigger.card,
- trigger.player,
- _status.event.player
- );
- }
- return -1;
- })
- .set("targets", trigger.targets);
- "step 1";
- if (result.bool) {
- player.awakenSkill("fenwei");
- player.logSkill("fenwei", result.targets);
- player.storage.fenwei = true;
- trigger.getParent().excluded.addArray(result.targets);
- game.delay();
- }
- },
- intro: {
- content: "limited",
- },
- },
- chulao: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: function (card, player, target) {
- if (player == target) return false;
- if (target.group == "unknown") return false;
- for (var i = 0; i < ui.selected.targets.length; i++) {
- if (ui.selected.targets[i].group == target.group) return false;
- }
- return target.countCards("he") > 0;
- },
- filter: function (event, player) {
- return player.countCards("he") > 0;
- },
- filterCard: true,
- position: "he",
- selectTarget: [1, Infinity],
- check: function (card) {
- if (get.suit(card) == "spade") return 8 - get.value(card);
- return 5 - get.value(card);
- },
- content: function () {
- "step 0";
- if (num == 0 && get.suit(cards[0]) == "spade") player.draw();
- player.choosePlayerCard(targets[num], "he", true);
- "step 1";
- if (result.bool) {
- if (result.links.length) targets[num].discard(result.links[0]);
- if (get.suit(result.links[0]) == "spade") targets[num].draw();
- }
- },
- ai: {
- result: {
- target: -1,
- },
- threaten: 1.2,
- order: 3,
- },
- },
- xunxun: {
- audio: 2,
- trigger: { player: "phaseDrawBegin1" },
- preHidden: true,
- content: function () {
- "step 0";
- var cards = get.cards(4);
- game.cardsGotoOrdering(cards);
- var next = player.chooseToMove("恂恂:将两张牌置于牌堆顶", true);
- next.set("list", [["牌堆顶", cards], ["牌堆底"]]);
- next.set("filterMove", function (from, to, moved) {
- if (to == 1 && moved[1].length >= 2) return false;
- return true;
- });
- next.set("filterOk", function (moved) {
- return moved[1].length == 2;
- });
- next.set("processAI", function (list) {
- var cards = list[0][1].slice(0).sort(function (a, b) {
- return get.value(b) - get.value(a);
- });
- return [cards, cards.splice(2)];
- });
- "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]);
- }
- game.updateRoundNumber();
- game.delayx();
- },
- },
- wangxi: {
- audio: 2,
- trigger: { player: "damageEnd", source: "damageSource" },
- filter: function (event) {
- if (event._notrigger.includes(event.player)) return false;
- return (
- event.num &&
- event.source &&
- event.player &&
- event.player.isIn() &&
- event.source.isIn() &&
- event.source != event.player
- );
- },
- check: function (event, player) {
- if (player.isPhaseUsing()) return true;
- if (event.player == player) return get.attitude(player, event.source) > -3;
- return get.attitude(player, event.player) > -3;
- },
- logTarget: function (event, player) {
- if (event.player == player) return event.source;
- return event.player;
- },
- preHidden: true,
- content: function () {
- "step 0";
- event.count = trigger.num;
- "step 1";
- game.asyncDraw([trigger.player, trigger.source]);
- event.count--;
- "step 2";
- game.delay();
- "step 3";
- if (event.count && player.hasSkill("wangxi")) {
- player.chooseBool(get.prompt2("wangxi", lib.skill.wangxi.logTarget(trigger, player)));
- } else event.finish();
- "step 4";
- if (result.bool) {
- player.logSkill("wangxi", lib.skill.wangxi.logTarget(trigger, player));
- event.goto(1);
- }
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- },
- },
- refangquan: {
- audio: 2,
- trigger: { player: "phaseUseBefore" },
- filter: function (event, player) {
- return player.countCards("h") > 0 && !player.hasSkill("fangquan3");
- },
- direct: true,
- content: function () {
- "step 0";
- var fang =
- player.countMark("fangquan2") == 0 &&
- player.hp >= 2 &&
- player.countCards("h") <= player.maxHp + 1;
- player
- .chooseBool(get.prompt2("refangquan"))
- .set("ai", function () {
- if (!_status.event.fang) return false;
- return game.hasPlayer(function (target) {
- if (target.hasJudge("lebu") || target == player) return false;
- if (get.attitude(player, target) > 4) {
- return (
- get.threaten(target) /
- Math.sqrt(target.hp + 1) /
- Math.sqrt(target.countCards("h") + 1) >
- 0
- );
- }
- return false;
- });
- })
- .set("fang", fang);
- "step 1";
- if (result.bool) {
- player.logSkill("refangquan");
- trigger.cancel();
- player.addTempSkill("fangquan2", "phaseAfter");
- player.addMark("fangquan2", 1, false);
- player.addTempSkill("refangquan2");
- //player.storage.fangquan=result.targets[0];
- }
- },
- },
- refangquan2: {
- mod: {
- maxHandcardBase: function (player, num) {
- return player.maxHp;
- },
- },
- },
- rehunzi: {
- inherit: "hunzi",
- filter: function (event, player) {
- return player.hp <= 2 && !player.storage.rehunzi;
- },
- ai: {
- threaten: function (player, target) {
- if (target.hp <= 2) return 2;
- return 0.5;
- },
- maixie: true,
- effect: {
- target: function (card, player, target) {
- if (!target.hasFriend()) return;
- if (
- target.hp === 3 &&
- get.tag(card, "damage") == 1 &&
- !target.isTurnedOver() &&
- _status.currentPhase != target &&
- get.distance(_status.currentPhase, target, "absolute") <= 3
- )
- return [0.5, 1];
- if (
- target.hp === 1 &&
- get.tag(card, "recover") &&
- !target.isTurnedOver() &&
- _status.currentPhase !== target &&
- get.distance(_status.currentPhase, target, "absolute") <= 3
- )
- return [1, -3];
- },
- },
- },
- },
- rezhijian: {
- inherit: "zhijian",
- group: ["rezhijian_use"],
- subfrequent: ["use"],
- subSkill: {
- use: {
- audio: "rezhijian",
- trigger: { player: "useCard" },
- frequent: true,
- filter: function (event, player) {
- return get.type(event.card) == "equip";
- },
- prompt: "是否发动【直谏】摸一张牌?",
- content: function () {
- player.draw("nodelay");
- },
- },
- },
- },
- retuntian: {
- audio: 2,
- trigger: {
- player: "loseAfter",
- global: [
- "equipAfter",
- "addJudgeAfter",
- "gainAfter",
- "loseAsyncAfter",
- "addToExpansionAfter",
- ],
- },
- frequent: true,
- filter: function (event, player) {
- if (player == _status.currentPhase) return false;
- if (event.name == "gain" && event.player == player) return false;
- var evt = event.getl(player);
- return evt && evt.cards2 && evt.cards2.length > 0;
- },
- content: function () {
- player.judge(function (card) {
- return 1;
- }).callback = lib.skill.retuntian.callback;
- },
- callback: function () {
- "step 0";
- if (event.judgeResult.suit == "heart") {
- player.gain(card, "gain2");
- event.finish();
- } else if (get.mode() == "guozhan") {
- player
- .chooseBool("是否将" + get.translation(card) + "作为“田”置于武将牌上?")
- .set("frequentSkill", "retuntian").ai = function () {
- return true;
- };
- } else event.directbool = true;
- "step 1";
- if (!result.bool && !event.directbool) {
- //game.cardsDiscard(card);
- return;
- }
- player.addToExpansion(card, "gain2").gaintag.add("tuntian");
- },
- group: "tuntian_dist",
- locked: false,
- ai: {
- effect: {
- target: function () {
- return lib.skill.tuntian.ai.effect.target.apply(this, arguments);
- },
- },
- threaten: function (player, target) {
- if (target.countCards("h") == 0) return 2;
- return 0.5;
- },
- nodiscard: true,
- nolose: true,
- },
- },
- rebeige: {
- audio: "beige",
- audioname: ["re_caiwenji"],
- trigger: { global: "damageEnd" },
- filter: function (event, player) {
- return (
- event.card &&
- event.card.name == "sha" &&
- event.source &&
- event.player.classList.contains("dead") == false &&
- player.countCards("he")
- );
- },
- direct: true,
- checkx: function (event, player) {
- var att1 = get.attitude(player, event.player);
- var att2 = get.attitude(player, event.source);
- return att1 > 0 && att2 <= 0;
- },
- content: function () {
- "step 0";
- var next = player.chooseToDiscard("he", get.prompt2("rebeige", trigger.player));
- var check = lib.skill.beige.checkx(trigger, player);
- next.set("ai", function (card) {
- if (_status.event.goon) return 8 - get.value(card);
- return 0;
- });
- next.set("logSkill", "rebeige");
- next.set("goon", check);
- "step 1";
- if (result.bool) {
- trigger.player.judge();
- } else {
- event.finish();
- }
- "step 2";
- switch (result.suit) {
- case "heart":
- trigger.player.recover(trigger.num);
- break;
- case "diamond":
- trigger.player.draw(3);
- break;
- case "club":
- trigger.source.chooseToDiscard("he", 2, true);
- break;
- case "spade":
- trigger.source.turnOver();
- break;
- }
- },
- ai: {
- expose: 0.3,
- },
- },
- rexingshang: {
- audio: 2,
- trigger: { global: "die" },
- filter: function (event, player) {
- return player.isDamaged() || event.player.countCards("he") > 0;
- },
- direct: true,
- content: function () {
- "step 0";
- var choice = [];
- if (player.isDamaged()) choice.push("回复体力");
- if (trigger.player.countCards("he")) choice.push("获得牌");
- choice.push("cancel2");
- player
- .chooseControl(choice)
- .set("prompt", get.prompt2("rexingshang"))
- .set("ai", function () {
- if (choice.length == 2) return 0;
- if (get.value(trigger.player.getCards("he")) > 8) return 1;
- return 0;
- });
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill(event.name, trigger.player);
- if (result.control == "获得牌") {
- event.togain = trigger.player.getCards("he");
- player.gain(event.togain, trigger.player, "giveAuto", "bySelf");
- } else player.recover();
- }
- },
- },
- refangzhu: {
- audio: 2,
- trigger: {
- player: "damageEnd",
- },
- direct: true,
- content: function () {
- "step 0";
- player.chooseTarget(get.prompt2("refangzhu"), function (card, player, target) {
- return player != target;
- }).ai = function (target) {
- if (target.hasSkillTag("noturn")) return 0;
- var player = _status.event.player;
- if (get.attitude(_status.event.player, target) == 0) return 0;
- if (get.attitude(_status.event.player, target) > 0) {
- if (target.classList.contains("turnedover")) return 1000 - target.countCards("h");
- if (player.getDamagedHp() < 3) return -1;
- return 100 - target.countCards("h");
- } else {
- if (target.classList.contains("turnedover")) return -1;
- if (player.getDamagedHp() >= 3) return -1;
- return 1 + target.countCards("h");
- }
- };
- "step 1";
- if (result.bool) {
- player.logSkill("refangzhu", result.targets);
- event.target = result.targets[0];
- if (player.isHealthy()) event._result = { bool: false };
- else
- event.target
- .chooseToDiscard("he", player.getDamagedHp())
- .set("ai", function (card) {
- var player = _status.event.player;
- if (
- player.isTurnedOver() ||
- _status.event.getTrigger().player.getDamagedHp() > 2
- )
- return -1;
- return player.hp * player.hp - get.value(card);
- })
- .set(
- "prompt",
- "弃置" +
- get.cnNumber(player.getDamagedHp()) +
- "张牌并失去1点体力;或选择不弃置,将武将牌翻面并摸" +
- get.cnNumber(player.getDamagedHp()) +
- "张牌。"
- );
- } else event.finish();
- "step 2";
- if (result.bool) {
- event.target.loseHp();
- } else {
- if (player.isDamaged()) event.target.draw(player.getDamagedHp());
- event.target.turnOver();
- }
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5];
- if (target.hp <= 1) return;
- if (!target.hasFriend()) return;
- var hastarget = false;
- var turnfriend = false;
- var players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- if (get.attitude(target, players[i]) < 0 && !players[i].isTurnedOver()) {
- hastarget = true;
- }
- if (get.attitude(target, players[i]) > 0 && players[i].isTurnedOver()) {
- hastarget = true;
- turnfriend = true;
- }
- }
- if (get.attitude(player, target) > 0 && !hastarget) return;
- if (turnfriend || target.hp == target.maxHp) return [0.5, 1];
- if (target.hp > 1) return [1, 0.5];
- }
- },
- },
- },
- },
- repolu: {
- audio: 1,
- trigger: {
- source: "dieAfter",
- player: "die",
- },
- forceDie: true,
- filter: function (event, player, name) {
- return name == "die" || player.isIn();
- },
- direct: true,
- content: function () {
- "step 0";
- if (!player.storage.repolu) player.storage.repolu = 0;
- event.num = player.storage.repolu + 1;
- player
- .chooseTarget(
- [1, Infinity],
- get.prompt("repolu"),
- "令任意名角色摸" + get.cnNumber(event.num) + "张牌"
- )
- .set("forceDie", true).ai = function (target) {
- return get.attitude(_status.event.player, target);
- };
- "step 1";
- if (result.bool) {
- player.storage.repolu++;
- result.targets.sortBySeat();
- player.logSkill("repolu", result.targets);
- game.asyncDraw(result.targets, num);
- } else event.finish();
- "step 2";
- game.delay();
- },
- },
- oljiuchi: {
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "jiu") return Infinity;
- },
- },
- audio: 2,
- enable: "chooseToUse",
- filterCard: function (card) {
- return get.suit(card) == "spade";
- },
- viewAs: { name: "jiu" },
- position: "hs",
- viewAsFilter: function (player) {
- return player.hasCard((card) => get.suit(card) == "spade", "hs");
- },
- prompt: "将一张黑桃手牌当酒使用",
- check: function (cardx, player) {
- if (player && player == cardx.player) return true;
- if (_status.event.type == "dying") return 1;
- var player = _status.event.player;
- var shas = player.getCards("hs", function (card) {
- return card != cardx && get.name(card, player) == "sha";
- });
- if (!shas.length) return -1;
- if (
- shas.length > 1 &&
- (player.getCardUsable("sha") > 1 || player.countCards("hs", "zhuge"))
- ) {
- return 0;
- }
- shas.sort(function (a, b) {
- return get.order(b) - get.order(a);
- });
- var card = false;
- if (shas.length) {
- for (var i = 0; i < shas.length; i++) {
- if (shas[i] != cardx && lib.filter.filterCard(shas[i], player)) {
- card = shas[i];
- break;
- }
- }
- }
- if (card) {
- if (
- game.hasPlayer(function (current) {
- return (
- get.attitude(player, current) < 0 &&
- !current.hasShan() &&
- current.hp + current.countCards("h", { name: ["tao", "jiu"] }) >
- 1 + (player.storage.jiu || 0) &&
- player.canUse(card, current, true, true) &&
- !current.hasSkillTag("filterDamage", null, {
- player: player,
- card: card,
- jiu: true,
- }) &&
- get.effect(current, card, player) > 0
- );
- })
- ) {
- return 4 - get.value(cardx);
- }
- }
- return -1;
- },
- ai: {
- threaten: 1.5,
- },
- trigger: { source: "damageEnd" },
- locked: false,
- forced: true,
- filter: function (event, player) {
- if (event.name == "chooseToUse")
- return player.hasCard((card) => get.suit(card) == "spade", "hs");
- return (
- event.card &&
- event.card.name == "sha" &&
- event.getParent(2).jiu == true &&
- !player.hasSkill("oljiuchi_air")
- );
- },
- content: function () {
- player.logSkill("oljiuchi");
- player.addTempSkill("oljiuchi_air");
- },
- subSkill: {
- air: {},
- },
- },
- rezaiqi: {
- count: function () {
- var num = 0;
- game.countPlayer2(function (current) {
- current.getHistory("lose", function (evt) {
- if (evt.position == ui.discardPile) {
- for (var i = 0; i < evt.cards.length; i++) {
- if (get.color(evt.cards[i]) == "red") num++;
- }
- }
- });
- });
- game.getGlobalHistory("cardMove", function (evt) {
- if (evt.name == "cardsDiscard") {
- for (var i = 0; i < evt.cards.length; i++) {
- if (get.color(evt.cards[i]) == "red") num++;
- }
- }
- });
- return num;
- },
- audio: 2,
- direct: true,
- filter: function (event, player) {
- return lib.skill.rezaiqi.count() > 0;
- },
- trigger: {
- player: "phaseJieshuBegin",
- },
- content: function () {
- "step 0";
- player.chooseTarget([1, lib.skill.rezaiqi.count()], get.prompt2("rezaiqi")).ai =
- function (target) {
- return get.attitude(_status.event.player, target);
- };
- "step 1";
- if (result.bool) {
- var targets = result.targets;
- targets.sortBySeat();
- player.line(targets, "fire");
- player.logSkill("rezaiqi", targets);
- event.targets = targets;
- } else event.finish();
- "step 2";
- event.current = targets.shift();
- if (player.isHealthy()) event._result = { index: 0 };
- else
- event.current
- .chooseControl()
- .set("choiceList", ["摸一张牌", "令" + get.translation(player) + "回复1点体力"])
- .set("ai", function () {
- if (get.attitude(event.current, player) > 0) return 1;
- return 0;
- });
- "step 3";
- if (result.index == 1) {
- event.current.line(player);
- player.recover();
- } else event.current.draw();
- game.delay();
- if (targets.length) event.goto(2);
- },
- },
- },
- dynamicTranslate: {
- rejiushi: function (player) {
- if (player.storage.chengzhang)
- return "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。";
- return "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。";
- },
- rejiaozhao: function (player) {
- return [
- "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。",
- "出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。",
- "出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。",
- ][player.countMark("redanxin")];
- },
- },
- translate: {
- re_zhangliao: "界张辽",
- re_zhangliao_prefix: "界",
- re_simayi: "界司马懿",
- re_simayi_prefix: "界",
- re_xuzhu: "界许褚",
- re_xuzhu_prefix: "界",
- re_xiahoudun: "界夏侯惇",
- re_xiahoudun_prefix: "界",
- re_lvmeng: "界吕蒙",
- re_lvmeng_prefix: "界",
- re_zhouyu: "界周瑜",
- re_zhouyu_prefix: "界",
- re_luxun: "界陆逊",
- re_luxun_prefix: "界",
- re_zhaoyun: "界赵云",
- re_zhaoyun_prefix: "界",
- re_guanyu: "界关羽",
- re_guanyu_prefix: "界",
- re_zhangfei: "界张飞",
- re_zhangfei_prefix: "界",
- re_machao: "界马超",
- re_machao_prefix: "界",
- re_caocao: "界曹操",
- re_caocao_prefix: "界",
- re_guojia: "界郭嘉",
- re_guojia_prefix: "界",
- re_lvbu: "界吕布",
- re_lvbu_prefix: "界",
- re_huanggai: "界黄盖",
- re_huanggai_prefix: "界",
- re_daqiao: "界大乔",
- re_daqiao_prefix: "界",
- re_ganning: "界甘宁",
- re_ganning_prefix: "界",
- re_huatuo: "界华佗",
- re_huatuo_prefix: "界",
- re_liubei: "界刘备",
- re_liubei_prefix: "界",
-
- re_diaochan: "界貂蝉",
- re_diaochan_prefix: "界",
- re_huangyueying: "界黄月英",
- re_huangyueying_prefix: "界",
- re_sunquan: "界孙权",
- re_sunquan_prefix: "界",
- re_sunshangxiang: "界孙尚香",
- re_sunshangxiang_prefix: "界",
- re_zhugeliang: "界诸葛亮",
- re_zhugeliang_prefix: "界",
- re_zhenji: "界甄宓",
- re_zhenji_prefix: "界",
- re_huaxiong: "界华雄",
- re_huaxiong_prefix: "界",
-
- ol_sp_zhugeliang: "界卧龙",
- ol_sp_zhugeliang_prefix: "界",
- re_zhangjiao: "界张角",
- re_zhangjiao_prefix: "界",
- re_sunce: "界孙策",
- re_sunce_prefix: "界",
- ol_yuanshao: "界袁绍",
- ol_yuanshao_prefix: "界",
- ol_liushan: "界刘禅",
- ol_liushan_prefix: "界",
-
- olfangquan: "放权",
- olfangquan_info:
- "出牌阶段开始前,你可以跳过此阶段。若如此做,弃牌阶段开始时,你可以弃置一张手牌,令一名其他角色进行一个额外回合。",
- olruoyu: "若愚",
- olruoyu_info:
- "主公技,觉醒技,准备阶段,若你的体力值为全场最少,则你加1点体力上限,将体力回复至3点,然后获得技能〖思蜀〗和〖激将〗。",
- sishu: "思蜀",
- sishu_info: "出牌阶段开始时,你可以选择一名角色。该角色本局游戏内【乐不思蜀】的判定效果反转。",
- olluanji: "乱击",
- olluanji_info:
- "你可以将两张花色相同的手牌当做【万箭齐发】使用。当你使用【万箭齐发】选择目标后,你可以为此牌减少一个目标。",
- olluanji_remove: "乱击",
- olxueyi: "血裔",
- olxueyi_info:
- "主公技,锁定技。①游戏开始时,你获得2X个“裔”标记(X为场上群势力角色的数目)。②出牌阶段开始时,你可以移去一个“裔”标记,然后摸一张牌。③你的手牌上限+Y(Y为“裔”标记数)。",
- olxueyi_draw: "血裔",
- olhunzi: "魂姿",
- olhunzi_info:
- "觉醒技,准备阶段,若你的体力值为1,你减1点体力上限并获得技能〖英姿〗和〖英魂〗;本回合的结束阶段,你摸两张牌或回复1点体力。",
- olzhiba: "制霸",
- olzhiba_info:
- "主公技,其他吴势力的角色的出牌阶段限一次,其可以与你拼点(你可拒绝此拼点)。若其没赢,你可以获得两张拼点牌。你的出牌阶段限一次,你可以和一名吴势力角色拼点,若你赢,你获得两张拼点牌。",
- olzhiba2: "制霸",
- xinleiji: "雷击",
- xinleiji_misa: "雷击",
- xinguidao: "鬼道",
- xinleiji_info:
- "①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名角色造成2点雷电伤害;梅花:你回复1点体力并可对一名角色造成1点雷电伤害。",
- xinleiji_append:
- '不能触发〖雷击〗的判定:〖暴虐〗、〖助祭〗、
〖弘仪〗、〖孤影〗。',
- xinleiji_faq: "不能触发〖雷击〗的判定",
- xinleiji_faq_info:
- "
董卓/界董卓〖暴虐〗
黄巾雷使〖助祭〗
羊徽瑜〖弘仪〗
鸣濑白羽〖孤影〗",
- xinguidao_info:
- "一名角色的判定牌生效前,你可以打出一张黑色牌作为判定牌并获得原判定牌。若你以此法打出的牌为黑桃2-9,则你摸一张牌。",
- xinhuangtian: "黄天",
- xinhuangtian2: "黄天",
- xinhuangtian_info:
- "主公技。其他群势力角色的出牌阶段限一次,该角色可以交给你一张【闪】或黑桃手牌。",
- reqiangxi: "强袭",
- reqiangxi_info:
- "出牌阶段对每名其他角色限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张武器牌并对你攻击范围内的一名其他角色造成1点伤害。",
- rehuoji: "火计",
- rehuoji_info: "你可一张红色牌当作【火攻】使用。",
- rekanpo: "看破",
- rekanpo_info: "你可以将一张黑色牌当作【无懈可击】使用。",
- reshuangxiong: "双雄",
- reshuangxiong1: "双雄",
- reshuangxiong2: "双雄",
- reshuangxiong_info:
- "摸牌阶段,你可以放弃摸牌。若如此做,你亮出牌堆顶的两张牌并选择获得其中的一张。然后,你本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用。当你受到【决斗】造成的伤害时,你可以获得对方于此决斗中打出的所有【杀】。",
-
- reguanxing: "观星",
- reguanxing_info:
- "准备阶段,你可以观看牌堆顶的五张牌(存活角色小于4时改为三张),并将其以任意顺序置于牌堆项或牌堆底,若你将〖观星〗的牌都放在了牌堆底,则你可以在结束阶段再次发动〖观星〗。",
- reluoshen: "洛神",
- reluoshen_info:
- "准备阶段,你可以进行判定,若结果为黑色则获得此判定牌,且可重复此流程直到出现红色的判定结果。你通过〖洛神〗得到的牌不计入当前回合的手牌上限。",
- reluoshen_info_guozhan:
- "准备阶段,你可以进行判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过〖洛神〗得到的牌不计入当前回合的手牌上限(结果为黑色的判定牌于此过程中不会进入弃牌堆)。",
- rejieyin: "结姻",
- rejieyin_info:
- "出牌阶段限一次,你可以选择一名男性角色并弃置一张手牌或将装备区内的一张装备牌置于其装备区,你与其体力较高的角色摸一张牌,体力值较低的角色回复1点体力。",
- rebiyue: "闭月",
- rebiyue_info: "结束阶段,你可以摸一张牌,若你没有手牌,则改为摸两张牌。",
- rejizhi: "集智",
- rejizhi_info:
- "当你使用锦囊牌时,你可以摸一张牌。若此牌为基本牌,则你可以弃置之,然后令本回合手牌上限+1。",
- reqicai: "奇才",
- reqicai_info: "锁定技,你使用锦囊牌无距离限制,你装备区内的防具牌和宝物牌不能被其他角色弃置。",
- rezhiheng: "制衡",
- rezhiheng_info:
- "出牌阶段限一次,你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。",
- rejiuyuan: "救援",
- rejiuyuan_info:
- "主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,则其可以选择令你回复1点体力,然后其摸一张牌。",
-
- new_yajiao: "涯角",
- new_yajiao_info:
- "每当你于回合外使用或打出牌时,你可以亮出牌堆顶的一张牌,并将其交给一名角色。若此牌与你此次使用或打出的牌类别不同,则你弃置一张牌。",
- new_liyu: "利驭",
- new_liyu_info:
- "当你使用【杀】对一名其他角色造成伤害后,你可以获得其区域内的一张牌。若此牌不为装备牌,则其摸一张牌。若此牌为装备牌,则视为你对其选择的另一名角色使用一张【决斗】。",
- new_retuxi: "突袭",
- new_retuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。",
- new_retuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。",
- reyiji_tag: "已分配",
- new_reyiji: "遗计",
- new_reyiji_info: "当你受到1点伤害后,你可以摸两张牌,然后可以将至多两张手牌交给其他角色。",
- new_rejianxiong: "奸雄",
- new_rejianxiong_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。",
- new_reluoyi: "裸衣",
- new_reluoyi_info:
- "摸牌阶段开始时,你亮出牌堆顶的三张牌。然后,你可以放弃摸牌。若如此做,你获得其中的基本牌、武器牌和【决斗】,且直到你的下回合开始,你使用的【杀】或【决斗】造成伤害时,此伤害+1。否则,你将这些牌置入弃牌堆。",
- new_rewusheng: "武圣",
- new_rewusheng_info: "你可以将一张红色牌当做【杀】使用或打出。你使用的方片杀没有距离限制。",
- new_yijue: "义绝",
- new_yijue_info:
- "出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复1点体力。",
- new_yijue2: "义绝",
- new_yijue2_info: "",
- new_repaoxiao: "咆哮",
- new_repaoxiao_info:
- "锁定技,出牌阶段,你使用【杀】没有数量限制。若你于此出牌阶段内使用过【杀】,则你本回合内使用【杀】没有距离限制。",
- new_tishen: "替身",
- new_tishen_info:
- "出牌阶段结束时,你可以弃置你所有的锦囊牌与坐骑牌。若如此做,直到你的下个回合开始,当一张【杀】结算结束后,若你是此牌目标且你未受到此牌伤害,你获得此牌对应的所有实体牌。",
- new_tishen2: "替身",
- new_tishen2_info: "",
- new_qingjian: "清俭",
- new_qingjian_info:
- "当你于摸牌阶段外得到牌后,你可以展示任意张牌并交给一名其他角色。然后,当前回合角色本回合的手牌上限+X(X为你给出的牌中包含的类别数)。每回合限一次。",
- qingjian_add: "清俭",
- qingjian_add_info: "",
- new_reqingnang: "青囊",
- new_reqingnang_info:
- "出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复1点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。",
- new_reyaowu: "耀武",
- new_reyaowu_info:
- "锁定技,当一名角色使用【杀】对你造成伤害时,若此杀为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。",
- reyaowu: "耀武",
- reyaowu_info:
- "锁定技,当你受到牌造成的伤害时,若此牌为红色,则伤害来源摸一张牌;否则你摸一张牌。",
- reqingguo: "倾国",
- reqingguo_info: "你可以将一张黑色牌当做【闪】使用或打出。",
-
- qinxue: "勤学",
- retuxi: "突袭",
- reluoyi: "裸衣",
- reluoyi2: "裸衣",
- reganglie: "刚烈",
- qingjian: "清俭",
- reyingzi: "英姿",
- refanjian: "反间",
- refanjian_card: "弃牌",
- refanjian_hp: "失去体力",
- reqianxun: "谦逊",
- reqianxun2: "谦逊",
- relianying: "连营",
- retishen: "替身",
- retishen2: "替身",
- reyajiao: "涯角",
- rejianxiong: "奸雄",
- rejianxiong_mopai: "摸牌",
- rejianxiong_napai: "拿牌",
- reyiji: "遗计",
- reyiji2: "遗计",
- yijue: "义绝",
- yijue2: "义绝",
- retieji: "铁骑",
- refankui: "反馈",
- reyicong: "义从",
- qiaomeng: "趫猛",
- rekurou: "苦肉",
- zhaxiang: "诈降",
- zhaxiang2: "诈降",
- zhuhai: "诛害",
- qianxin: "潜心",
- jianyan: "荐言",
- reguicai: "鬼才",
- xunxun: "恂恂",
- wangxi: "忘隙",
- reguose: "国色",
- fenwei: "奋威",
- chulao: "除疠",
- liyu: "利驭",
- rerende: "仁德",
- rerende_info:
- "出牌阶段,你可以将至少一张手牌交给其他角色,然后你于此阶段内不能再以此法交给该角色牌;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。",
- liyu_info:
- "当你使用【杀】对一名其他角色造成伤害后,该角色可令你获得其一张牌,若如此做,则视为你对其选择的另一名角色使用一张【决斗】。",
- xunxun_info:
- "摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。",
- wangxi_info:
- "每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。",
- reguose_info:
- "出牌阶段限一次,你可以选择一项:将一张方片花色牌当做【乐不思蜀】使用;或弃置一张方片花色牌并弃置场上的一张【乐不思蜀】。选择完成后,你摸一张牌。",
- fenwei_info:
- "限定技,当一名角色使用的锦囊牌指定了至少两名角色为目标时,你可以令此牌对其中任意名角色无效。",
- chulao_info:
- "出牌阶段限一次,若你有牌,你可以选择任意名势力各不相同的其他角色,你弃置你和这些角色的各一张牌。然后以此法弃置黑桃牌的角色各摸一张牌。",
- reguicai_info: "在任意角色的判定牌生效前,你可以打出一张牌代替之。",
- zhuhai_info: "一名其他角色的结束阶段开始时,若该角色本回合造成过伤害,你可以对其使用一张【杀】。",
- qianxin_info: "觉醒技,当你造成一次伤害后,若你已受伤,你须减1点体力上限,并获得技能“荐言”。",
- jianyan_info:
- "出牌阶段限一次,你可以声明一种牌的类别或颜色,并亮出牌库中第一张符合你声明的牌,然后你令一名男性角色获得此牌。",
- rekurou_info: "出牌阶段限一次,你可以弃置一张牌,然后失去1点体力。",
- zhaxiang_info:
- "锁定技。当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则你本回合获得此下效果:使用【杀】的次数上限+1,使用红色【杀】无距离限制且不能被【闪】响应。",
- qiaomeng_info:
- "当你使用黑色【杀】对一名角色造成伤害后,你可以弃置该角色装备区里的一张牌,若此牌是坐骑牌,你于此牌置入弃牌堆后获得之。",
- reyicong_info:
- "锁定技,你计算与其他角色的距离时-1。若你的体力值不大于2,则其他角色计算与你的距离时+1。",
- refankui_info: "每当你受到1点伤害后,你可以获得伤害来源的一张牌。",
- retieji_info:
- "当你使用【杀】指定一名角色为目标后,你可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。",
- yijue_info:
- "出牌阶段限一次,你可以与一名其他角色拼点,若你赢,则直到回合结束,该角色不能使用或打出手牌且其非锁定技失效,若你没赢,你可令该角色回复1点体力。",
- reyiji_info:
- "每当你受到1点伤害后,你可以摸两张牌。然后你可以在至多两名角色的武将牌旁边分别扣置至多两张手牌,这些角色的下个摸牌阶段开始时,该角色获得其武将牌旁的这些牌。",
- rejianxiong_info: "每当你受到伤害后,你可以获得对你造成伤害的牌,然后摸一张牌。",
- reyajiao_info:
- "每当你于回合外使用或打出一张手牌时,你可以亮出牌堆顶的一张牌,若此牌与你此次使用或打出的牌类别相同,你可以将之交给任意一名角色;若不同则你可以将之置入弃牌堆。",
- retishen_info:
- "限定技,准备阶段开始时,你可以将体力回复至等同于你上回合结束时的体力值,然后你每以此法回复1点体力,便摸一张牌。",
- reqianxun_info:
- "每当一张延时类锦囊牌或其他角色使用的普通锦囊牌生效时,若你是此牌的唯一目标,你可以将所有手牌置于你的武将牌上,若如此做,此回合结束时,你获得你武将牌上的所有牌。",
- relianying_info: "当你失去最后的手牌时,你可以令至多X名角色各摸一张牌(X为你此次失去的手牌数)。",
- reyingzi_info: "锁定技,摸牌阶段摸牌时,你额外摸一张牌;你的手牌上限为你的体力上限。",
- refanjian_info:
- "出牌阶段限一次,你可以展示一张手牌并将此牌交给一名其他角色。然后该角色选择一项:展示其手牌并弃置所有与此牌花色相同的牌,或失去1点体力。",
- qingjian_info:
- "每当你于摸牌阶段外得到牌时,你可以将其中任意牌以任意顺序交给其他角色,每回合最多发动四次。",
- qinxue_info:
- "觉醒技。准备阶段或结束阶段开始时,若你的手牌数减体力值大于1,则你减1点体力上限,回复1点体力或摸两张牌,获得技能〖攻心〗。",
- retuxi_info:
- "摸牌阶段摸牌时,你可以少摸任意张牌,然后选择等量的手牌数大于或等于你的其他角色,获得这些角色的各一张手牌。",
- reluoyi_info:
- "你可以跳过摸牌阶段,然后亮出牌堆顶的三张牌,获得其中的基本牌、武器牌和【决斗】,若如此做,直到你的下回合开始,你为伤害来源的【杀】或【决斗】造成的伤害+1。",
- reganglie_info:
- "当你受到1点伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害;黑色,你弃置伤害来源一张牌。",
- reganglie_info_guozhan:
- "当你受到伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害;黑色,你弃置伤害来源一张牌。",
- botu: "博图",
- botu_info: "回合结束时,若你本回合出牌阶段内使用的牌包含四种花色,则你可以进行一个额外回合。",
- rebotu: "博图",
- rebotu_info:
- "每轮限X次。回合结束时,若本回合内置入弃牌堆的牌中包含至少四种花色,则你可获得一个额外的回合。(X为存活角色数且至多为3)",
-
- xin_yuji: "界于吉",
- xin_yuji_prefix: "界",
- re_zuoci: "界左慈",
- re_zuoci_prefix: "界",
- reguhuo: "蛊惑",
- reguhuo_info:
- "每名角色的回合限一次,你可以扣置一张手牌当作一张基本牌或普通锦囊牌使用或打出。其他角色同时选择是否质疑。然后,你展示此牌。若有质疑的角色:若此牌为假,则此牌作废,且所有质疑者各摸一张牌;为真,则所有质疑角色于此牌结算完成后依次弃置一张牌或失去1点体力,并获得技能〖缠怨〗。",
- reguhuo_guess: "蛊惑",
- reguhuo_guess_info: "",
- rechanyuan: "缠怨",
- rechanyuan_info:
- "锁定技,你不能于〖蛊惑〗的结算流程中进行质疑。当你的体力值不大于1时,你的其他技能失效。",
- reguhuo_ally: "信任",
- reguhuo_betray: "质疑",
- reguhuo_ally_bg: "真",
- reguhuo_betray_bg: "假",
- rehuashen: "化身",
- rehuashen_info:
- "游戏开始时,你随机获得三张未加入游戏的武将牌,选一张置于你面前并声明该武将牌的一项技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换。回合开始时或回合结束时,你可以选择一项:①弃置至多两张未展示的化身牌并重新获得等量化身牌;②更换所展示的化身牌或技能。(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。",
- rexinsheng: "新生",
- rexinsheng_info: "当你受到1点伤害后,你可以获得一张新的化身牌。",
- re_menghuo: "界孟获",
- re_menghuo_prefix: "界",
- re_caopi: "界曹丕",
- re_caopi_prefix: "界",
- oljiuchi: "酒池",
- oljiuchi_info:
- "你可以将一张黑桃手牌当做【酒】使用。你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的〖崩坏〗失效直到回合结束。",
- repolu: "破虏",
- repolu_info:
- "当你杀死一名角色/死亡时,你可以令任意名角色摸X+1张牌。(X为你此前发动过〖破虏〗的次数)",
- rexingshang: "行殇",
- rexingshang_info: "当其他角色死亡后,你可以选择一项:回复1点体力,或获得其所有牌。",
- refangzhu: "放逐",
- refangzhu_info:
- "当你受到伤害后,你可以令一名其他角色选择一项:摸X张牌并将武将牌翻面,或弃置X张牌并失去1点体力。(X为你已损失的体力值)",
- rezaiqi: "再起",
- rezaiqi_info:
- "结束阶段开始时,你可以令至多X名角色选择一项:1.摸一张牌,2.令你回复1点体力(X为本回合进入弃牌堆的红色牌数)。",
- ol_caiwenji: "界蔡琰",
- ol_caiwenji_prefix: "界",
- retuntian: "屯田",
- rebeige: "悲歌",
- retuntian_info:
- "①当你于回合外失去牌后,你可以判定。若判定结果为♥,你获得此判定牌。否则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。",
- rebeige_info:
- "当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复X点体力(X为伤害点数);♦︎该角色摸三张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。",
- rehunzi: "魂姿",
- rehunzi_info:
- "觉醒技,准备阶段,若你的体力值不大于2,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。",
- rezhijian: "直谏",
- rezhijian_info:
- "出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。当你使用装备牌时,你可以摸一张牌。",
- refangquan: "放权",
- refangquan_info:
- "你可跳过你的出牌阶段,若如此做,你本回合的手牌上限为你的体力上限,且回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。",
- xin_gaoshun: "界高顺",
- xin_gaoshun_prefix: "界",
- repojun: "破军",
- repojun2: "破军",
- repojun3: "破军",
- repojun_info:
- "当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值),然后其于当前回合结束时获得这些牌。当你使用【杀】对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,则此伤害+1。",
- rexianzhen: "陷阵",
- rexianzhen_info:
- "出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本回合内对其使用牌没有次数和距离限制且无视其防具。若你没赢,你本回合内不能使用【杀】。若你以此法失去的拼点牌为【杀】,则你的【杀】不计入本回合的手牌上限。",
- rejinjiu: "禁酒",
- rejinjiu_info:
- "锁定技,你的【酒】均视为【杀】。其他角色不能于你的回合内使用【酒】。当你受到酒【杀】的伤害时,你令此伤害-X(X为影响过此【杀】的伤害值的【酒】的数量)。",
- rejinjiu2: "禁酒",
- rejinjiu3: "禁酒",
- ol_xiahouyuan: "界夏侯渊",
- ol_xiahouyuan_prefix: "界",
- shebian: "设变",
- shebian_info: "当你的武将牌翻面后,你可以移动场上的一张装备牌。",
- cangzhuo: "藏拙",
- cangzhuo_info: "弃牌阶段开始时,若你本回合内没有使用过锦囊牌,则你的锦囊牌不计入手牌上限。",
- re_zhangyi: "界张嶷",
- re_zhangyi_prefix: "界",
- rewurong: "怃戎",
- rewurong_info:
- "出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你获得其一张牌。",
- ol_pangtong: "界庞统",
- ol_pangtong_prefix: "界",
- olniepan: "涅槃",
- olniepan_info:
- "限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。然后你选择获得以下技能中的一个:〖八阵〗/〖火计〗/〖看破〗。",
- ol_weiyan: "界魏延",
- ol_weiyan_prefix: "界",
- reqimou: "奇谋",
- reqimou_info:
- "限定技,出牌阶段,你可以失去任意点体力并摸等量的牌,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。",
- ol_xiaoqiao: "界小乔",
- ol_xiaoqiao_prefix: "界",
- rehongyan: "红颜",
- rehongyan_info:
- "锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。当你于回合外正面朝上失去红桃牌后,若你的手牌数小于体力值,你摸一张牌。",
- reluoying: "落英",
- reluoying_discard: "落英",
- reluoying_judge: "落英",
- reluoying_info: "当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。",
- rejiushi: "酒诗",
- rejiushi_info:
- "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面并获得牌堆中的一张随机锦囊。",
- rejiushi1: "酒诗",
- rejiushi3: "酒诗",
- rejiushi_mark: "酒诗·改",
- rejiushi_mark_info:
- "当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。",
- chengzhang: "成章",
- chengzhang_info:
- "觉醒技,准备阶段开始时,若你造成伤害与受到伤害值之和累计7点或以上,则你回复1点体力并摸一张牌,然后改写〖酒诗〗。",
- re_wuyi: "界吴懿",
- re_wuyi_prefix: "界",
- re_zhuran: "界朱然",
- re_zhuran_prefix: "界",
- re_quancong: "界全琮",
- re_quancong_prefix: "界",
- re_liaohua: "界廖化",
- re_liaohua_prefix: "界",
- re_guohuai: "界郭淮",
- re_guohuai_prefix: "界",
- re_chengpu: "界程普",
- re_chengpu_prefix: "界",
- rechunlao: "醇醪",
- rechunlao2: "醇醪",
- rechunlao_info:
- "出牌阶段结束时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】,然后若此“醇”的属性为:火,你回复1点体力、雷,你摸两张牌。",
- re_caozhang: "界曹彰",
- re_caozhang_prefix: "界",
- yujin_yujin: "界于禁",
- yujin_yujin_prefix: "界",
- rexuanfeng: "旋风",
- rexuanfeng_info:
- "当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌,或将一名其他角色装备区内的一张牌移动到另一名其他角色的装备区内。",
- olpaoxiao: "咆哮",
- olpaoxiao2: "咆哮",
- olpaoxiao_info:
- "①锁定技,你使用【杀】无次数限制。②锁定技,当你使用的【杀】被【闪】抵消时,你获得一枚“咆”(→)当你因【杀】造成伤害时,你弃置所有“咆”并令伤害值+X(X为“咆”数)。回合结束后,你弃置所有“咆”。",
- oltishen: "替身",
- oltishen_info: "限定技,准备阶段,你可以将体力回复至上限,然后摸X张牌(X为你回复的体力值)。",
- ollongdan: "龙胆",
- ollongdan_info:
- "你可以将一张【杀】当做【闪】、【闪】当做【杀】、【酒】当做【桃】、【桃】当做【酒】使用或打出。",
- olyajiao: "涯角",
- olyajiao_info:
- "当你于回合外因使用或打出而失去手牌后,你可以亮出牌堆顶的一张牌。若这两张牌的类别相同,你可以将展示的牌交给一名角色;若类别不同,你可弃置攻击范围内包含你的角色区域里的一张牌。",
- regongji: "弓骑",
- regongji_info:
- "出牌阶段限一次,你可以弃置一张非基本牌,然后弃置一名其他角色的一张牌。锁定技,当你的装备区内有坐骑牌时,你的攻击范围无限。",
- ol_sunjian: "界孙坚",
- ol_sunjian_prefix: "界",
- wulie: "武烈",
- wulie2: "武烈",
- wulie_info:
- "限定技,结束阶段,你可以失去任意点体力并指定等量的其他角色。这些角色各获得一枚「烈」。有「烈」的角色受到伤害时,其移去一枚「烈」,然后防止此伤害。",
- re_sunluban: "界孙鲁班",
- re_sunluban_prefix: "界",
- re_masu: "界马谡",
- re_masu_prefix: "界",
- ol_pangde: "界庞德",
- ol_pangde_prefix: "界",
- rejianchu: "鞬出",
- rejianchu_info:
- "当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌不为基本牌,此【杀】不可被【闪】响应且你本回合使用【杀】的次数上限+1,为基本牌,该角色获得此【杀】。",
- re_taishici: "界太史慈",
- re_taishici_prefix: "界",
- hanzhan: "酣战",
- hanzhan_gain: "酣战",
- hanzhan_info:
- "①当你发起拼点时,或成为拼点的目标时,你可以令对方选择拼点牌的方式改为随机选择一张手牌。②当你拼点结束后,你可以获得本次拼点的拼点牌中点数最大的【杀】。",
- re_jianyong: "界简雍",
- re_jianyong_prefix: "界",
- xin_xusheng: "界徐盛",
- xin_xusheng_prefix: "界",
- decadepojun: "破军",
- decadepojun2: "破军",
- decadepojun_info:
- "当你使用【杀】指定目标后,你可以将其的至多X张牌置于其武将牌上(X为其体力值)。若这些牌中:有装备牌,你将这些装备牌中的一张置于弃牌堆;有锦囊牌,你摸一张牌。其于回合结束时获得其武将牌上的这些牌。",
- re_wangyi: "界王异",
- re_wangyi_prefix: "界",
- guanzhang: "关兴张苞",
- rezishou: "自守",
- rezishou2: "自守",
- rezishou_info:
- "摸牌阶段,你可以多摸X张牌(X为存活势力数)。若如此做,本回合你对其他角色造成伤害时,防止此伤害。",
- rezongshi: "宗室",
- rezongshi_info:
- "锁定技,你的手牌上限+X(X为存活势力数)。准备阶段,若你的手牌数大于体力值,则你本回合内使用【杀】无次数限制。",
- ol_dongzhuo: "界董卓",
- ol_dongzhuo_prefix: "界",
- olbaonue: "暴虐",
- olbaonue_info:
- "主公技,其他群雄角色造成1点伤害后,你可进行判定,若为♠,你回复1点体力并获得判定牌。",
- re_panzhangmazhong: "界潘璋马忠",
- re_panzhangmazhong_prefix: "界",
- re_hanhaoshihuan: "界韩浩史涣",
- re_hanhaoshihuan_prefix: "界",
- xinyicong: "义从",
- xinyicong_info:
- "锁定技,你计算与其他角色的距离时-X,其他角色计算与你的距离时+Y。(X为你的体力值-1,Y为你的已损失体力值-1)",
- oltianxiang: "天香",
- oltianxiang_info:
- "当你受到伤害时,你可以弃置一张红桃牌,防止此伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。",
- olhongyan: "红颜",
- olhongyan_info:
- "锁定技,你的黑桃牌的花色视为红桃。若你的装备区内有红桃牌,则你的手牌上限基数视为体力上限。",
- piaoling: "飘零",
- piaoling_info:
- "结束阶段,你可以进行判定。若判定结果为红桃,则你选择一项:1.将此牌交给一名角色。若你交给了自己,则你弃置一张牌。2.将此牌置于牌堆顶。",
- decadelihuo: "疠火",
- decadelihuo2: "疠火",
- decadelihuo3: "疠火",
- decadelihuo_info:
- "当你声明使用普【杀】后,你可以将此【杀】改为火【杀】。当你使用火【杀】选择目标时,可以选择一个额外目标。你使用的火【杀】结算完成后,若此【杀】的目标数大于1且你因此【杀】造成过伤害,则你失去1点体力。",
- decadechunlao: "醇醪",
- decadechunlao2: "醇醪",
- decadechunlao_info:
- "你可以对其他角色使用【酒(使用方法②)】。当你需要使用【酒】时,若你的武将牌未横置,则你可以将武将牌横置,然后视为使用【酒】。当你受到或造成伤害后,若伤害值大于1且你的武将牌横置,则你可以重置武将牌。",
- rejuece: "绝策",
- rejuece_info: "结束阶段,你可以对一名本回合内失去过牌的角色造成1点伤害。",
- remieji: "灭计",
- remieji_info:
- "出牌阶段限一次,你可以将一张黑色锦囊牌置于牌堆顶,然后令一名有牌的其他角色选择一项:交给你一张锦囊牌,或依次弃置两张非锦囊牌。",
- re_manchong: "界满宠",
- re_manchong_prefix: "界",
- rejunxing: "峻刑",
- rejunxing_info:
- "出牌阶段限一次,你可以弃置任意张手牌并选择一名其他角色。该角色选择一项:1.弃置X张牌并失去1点体力。2.翻面并摸X张牌。(X为你弃置的牌数)",
- re_gongsunzan: "界公孙瓒",
- re_gongsunzan_prefix: "界",
- reqiaomeng: "趫猛",
- reqiaomeng_info:
- "当你使用【杀】对一名角色造成伤害后,你可以弃置该角色区域内的一张牌。若此牌为坐骑牌,则你于此弃置事件结算结束后获得此牌。",
- ol_dengai: "界邓艾",
- ol_dengai_prefix: "界",
- oltuntian: "屯田",
- olzaoxian: "凿险",
- oltuntian_info:
- "①当你于回合外失去牌后,或于回合内因弃置而失去【杀】后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。",
- olzaoxian_info:
- "觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。你于当前回合结束后进行一个额外的回合。",
- re_sunxiu: "界孙休",
- re_sunxiu_prefix: "界",
- re_caoxiu: "界曹休",
- re_caoxiu_prefix: "界",
- xin_lingtong: "界凌统",
- xin_lingtong_prefix: "界",
- decadexuanfeng: "旋风",
- decadexuanfeng_info:
- "当你于弃牌阶段弃置过至少两张牌,或当你失去装备区里的牌后,若场上没有处于濒死状态的角色,则你可以弃置至多两名其他角色的共计两张牌。若此时处于你的回合内,你可以对其中一名目标角色造成1点伤害。",
- yongjin: "勇进",
- yongjin_info: "限定技,出牌阶段,你可以依次移动场上的至多三张不同的装备牌。",
- xin_liubiao: "界刘表",
- xin_liubiao_prefix: "界",
- decadezishou: "自守",
- decadezishou_zhiheng: "自守",
- decadezishou_info:
- "摸牌阶段,你可以多摸X张牌(X为存活势力数);然后本回合你对其他角色造成伤害时,防止此伤害。结束阶段,若你本回合没有使用牌指定其他角色为目标,你可以弃置任意张花色不同的手牌,然后摸等量的牌。",
- decadezongshi: "宗室",
- decadezongshi_info:
- "锁定技,你的手牌上限+X(X为存活势力数)。你的回合外,若你的手牌数大于等于手牌上限,则当你成为延时类锦囊牌或无颜色的牌的目标后,你令此牌对你无效。",
- re_fazheng: "界法正",
- re_fazheng_prefix: "界",
- reenyuan: "恩怨",
- reenyuan1: "恩怨",
- reenyuan2: "恩怨",
- reenyuan_info:
- "当你获得一名其他角色的至少两张牌后,你可以令其摸一张牌。当你受到1点伤害后,你可令伤害来源选择一项:①失去1点体力。②交给你一张手牌。若此牌不为♥,则你摸一张牌。",
- rexuanhuo: "眩惑",
- rexuanhuo_info:
- "摸牌阶段结束时,你可以交给一名其他角色两张手牌,然后该角色选择一项:1. 视为对你选择的另一名角色使用任意一种【杀】或【决斗】,2. 交给你所有手牌。",
- re_fuhuanghou: "界伏寿",
- re_fuhuanghou_prefix: "界",
- reqiuyuan: "求援",
- reqiuyuan_info:
- "当你成为【杀】的目标时,你可选择另一名其他角色。除非该角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标且该角色不能响应此【杀】。",
- rezhuikong: "惴恐",
- rezhuikong_info:
- "其他角色的回合开始时,若你已受伤,你可与其拼点:若你赢,本回合该角色只能对自己使用牌;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。",
- re_gongsunyuan: "界公孙渊",
- re_gongsunyuan_prefix: "界",
- rehuaiyi: "怀异",
- rehuaiyi_info:
- "出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色:全部相同,你摸一张牌,并将此技能于本阶段内改为“限两次”,然后终止此技能的结算流程;不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。",
- re_caozhen: "界曹真",
- re_caozhen_prefix: "界",
- residi: "司敌",
- residi_push: "司敌",
- residi2: "司敌",
- residi3: "司敌",
- residi_info:
- "结束阶段,你可以将一张非基本牌置于武将牌上,称为“司”。其他角色的出牌阶段开始时,你可以移去一张“司”。若如此做,其本阶段内不能使用或打出与“司”颜色相同的牌。此阶段结束时,若其于此阶段内未使用过:【杀】,你视为对其使用一张【杀】。锦囊牌,你摸两张牌。",
- gz_re_xushu: "徐庶",
- re_zhangchunhua: "界张春华",
- re_zhangchunhua_prefix: "界",
- xin_handang: "界韩当",
- xin_handang_prefix: "界",
- xingongji: "弓骑",
- xingongji2: "弓骑",
- xingongji_info:
- "出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限且使用与此牌花色相同的【杀】无次数限制直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。",
- xinjiefan: "解烦",
- xinjiefan_info:
- "限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。然后若游戏轮数为1,则你于此回合结束时恢复此技能。",
- gzquanji: "权计",
- gzquanji_info:
- "每回合每项各限一次。当你受到伤害后或造成伤害后,你可以摸一张牌,然后你将一张牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。",
- gzpaiyi: "排异",
- gzpaiyi_backup: "排异",
- gzpaiyi_info:
- "出牌阶段限一次。你可以移去一张“权”并选择一名角色。令其摸X张牌(X为你的“权”数且至多为7)。然后若其手牌数大于你,则你对其造成1点伤害。",
- ol_zhurong: "界祝融",
- ol_zhurong_prefix: "界",
- changbiao: "长标",
- changbiao_info:
- "出牌阶段限一次,你可以将任意张手牌当做【杀】使用(无距离限制)。若你因此【杀】对目标角色造成过伤害,则你于出牌阶段结束时摸X张牌(X为此【杀】对应的实体牌数量)。",
- re_zhoucang: "界周仓",
- re_zhoucang_prefix: "界",
- rezhongyong: "忠勇",
- rezhongyong_info:
- "当你使用【杀】后,你可以将此【杀】以及目标角色使用的【闪】交给一名其他角色,若其获得的牌中有红色,则其可以对你攻击范围内的角色使用一张【杀】。若其获得的牌中有黑色,其摸一张牌。",
- ollihuo: "疠火",
- ollihuo2: "疠火",
- ollihuo3: "疠火",
- ollihuo4: "疠火",
- ollihuo_info:
- "你使用普通的【杀】可以改为火【杀】,若此【杀】造成过伤害,你失去1点体力;你使用火【杀】可以多选择一个目标。你每回合使用的第一张牌如果是【杀】,则此【杀】结算完毕后可置于你的武将牌上。",
- xinjiangchi: "将驰",
- xinjiangchi_info:
- "出牌阶段开始时,你可选择:①摸一张牌。②摸两张牌,然后本回合内不能使用或打出【杀】。③弃置一张牌,然后本回合内可以多使用一张【杀】,且使用【杀】无距离限制。",
- redingpin: "定品",
- redingpin_info:
- "出牌阶段,你可以弃置一张本回合未使用过/弃置过的类型的牌并选择一名角色。其进行判定,若结果为:黑色,其摸X张牌(X为其体力值且至多为3)且本回合内不能再成为〖定品〗的目标;红桃,你令此次弃置的牌不计入〖定品〗弃置牌合法性的检测;方片,你将武将牌翻面。",
- refaen: "法恩",
- refaen_info: "一名角色翻面或横置后,你可令其摸一张牌。",
- dcfaen: "法恩",
- dcfaen_info: "一名角色翻至正面或横置后,你可令其摸一张牌。",
- reshizhi: "矢志",
- reshizhi_info:
- "锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通杀造成伤害后,你回复1点体力。",
- re_guotufengji: "界郭图逢纪",
- re_guotufengji_prefix: "界",
- rejigong: "急攻",
- rejigong2: "急攻",
- rejigong_info:
- "出牌阶段开始时,你可以摸至多三张牌。若如此做,你本回合的手牌上限基数改为X,且弃牌阶段结束时,若X不小于Y,则你回复1点体力。(X为你本回合内造成的伤害值之和,Y为你本回合内因〖急攻〗摸牌而得到的牌的数量总和)",
- ol_jiangwei: "界姜维",
- ol_jiangwei_prefix: "界",
- oltiaoxin: "挑衅",
- oltiaoxin_info:
- "出牌阶段限一次,你可以选择一名攻击范围内包含你的角色。然后除非该角色对你使用一张【杀】且此【杀】对你造成伤害,否则你弃置其一张牌,然后将此技能于此出牌阶段内修改为出牌阶段限两次。",
- olzhiji: "志继",
- olzhiji_info:
- "觉醒技,准备阶段或结束阶段,若你没有手牌,你回复1点体力或摸两张牌,然后减1点体力上限,获得〖观星〗。",
- decadezhenjun: "镇军",
- decadezhenjun_info:
- "准备阶段或结束阶段,你可以弃置一名角色X张牌(X为其手牌数减体力值且至少为1),若其中没有装备牌,你选择一项:1.你弃一张牌;2.该角色摸等量的牌。",
- decadejingce: "精策",
- decadejingce_info:
- "结束阶段,若你本回合使用过的牌数不小于你的体力值,则你可执行一个摸牌阶段或出牌阶段;若这些牌包含的花色数也不小于你的体力值,则你将“或”改为“并”。",
- re_guanping: "界关平",
- re_guanping_prefix: "界",
- relongyin: "龙吟",
- relongyin_info:
- "当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数。若此【杀】为红色,则你摸一张牌;若你以此法弃置的牌与此【杀】点数相同,则你重置“竭忠”。",
- jiezhong: "竭忠",
- jiezhong_info: "限定技,出牌阶段开始时,你可以将手牌补至体力上限(至多摸五张)。",
- re_caifuren: "界蔡夫人",
- re_caifuren_prefix: "界",
- reqieting: "窃听",
- reqieting_info:
- "其他角色的回合结束时,若其本回合内未造成过伤害,则你可将其装备区内的一张牌置于你的装备区内;若其本回合内未对其他角色使用过牌,则你可摸一张牌。",
- rexianzhou: "献州",
- rexianzhou_info:
- "限定技。出牌阶段,你可将装备区内的所有牌交给一名其他角色。你回复X点体力,然后对其攻击范围内的至多X名角色各造成1点伤害(X为你以此法给出的牌数)。",
- xin_zhonghui: "界钟会",
- xin_zhonghui_prefix: "界",
- xinquanji: "权计",
- xinquanji_info:
- "①当你受到1点伤害后,或其他角色不因你的赠予或交给而得到你的牌后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”。②你的手牌上限+X(X为“权”的数量)。",
- xinzili: "自立",
- xinzili_info:
- "觉醒技。准备阶段,若你的“权”数大于2,则你回复1点体力并摸两张牌,减1点体力上限并获得〖排异〗。",
- xinpaiyi: "排异",
- xinpaiyi_backup: "排异",
- xinpaiyi_info:
- "出牌阶段每项各限一次,你可移去一张“权”并选择一项:①令一名角色摸X张牌。②对至多X名角色各造成1点伤害。(X为“权”数)",
- re_guyong: "界顾雍",
- re_guyong_prefix: "界",
- reshenxing: "慎行",
- reshenxing_info:
- "出牌阶段,你可以弃置X张牌(X为你本阶段内发动过〖慎行〗的次数且至少为0,至多为2),然后摸一张牌。",
- rebingyi: "秉壹",
- rebingyi_info:
- "结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);点数均相同,则你摸一张牌。",
- re_jiaxu: "界贾诩",
- re_jiaxu_prefix: "界",
- rewansha: "完杀",
- rewansha_info:
- "锁定技。①你的回合内,不处于濒死状态的其他角色不能使用【桃】。②当有角色于你的回合内进入濒死状态时,你令其以外的所有其他角色的非锁定技失效直到此濒死状态结算结束。",
- reluanwu: "乱武",
- reluanwu_info:
- "限定技,出牌阶段,你可令所有其他角色依次选择一项:①对距离最近(或之一)的角色使用一张【杀】;②失去1点体力。结算完成后,你可视为使用一张【杀】(无距离限制)。",
- reweimu: "帷幕",
- reweimu_info:
- "锁定技。①你不能成为黑色锦囊牌的目标。②当你于回合内受到伤害时,你防止此伤害并摸2X张牌(X为伤害值)。",
- ol_lusu: "界鲁肃",
- ol_lusu_prefix: "界",
- olhaoshi: "好施",
- olhaoshi_info:
- "摸牌阶段开始时,你可以多摸两张牌。然后摸牌阶段结束时,若你的手牌数大于5,则你将手牌数的一半(向下取整)交给一名手牌最少其他角色并获得如下效果直到你下回合开始:当你成为【杀】或普通锦囊牌的目标后,其可以交给你一张手牌。",
- oldimeng: "缔盟",
- oldimeng_info:
- "出牌阶段限一次,你可令两名满足X≤Y的其他角色交换手牌并获得如下效果:出牌阶段结束时,你弃置X张牌(X为这两名角色手牌数之差的绝对值;Y为你的牌数)。",
-
- rejijiang: "激将",
- rejijiang1: "激将",
- rejijiang2: "激将",
- rejijiang_info:
- "主公技。①当你需要使用或打出【杀】时,你可以令其他蜀势力角色依次选择是否打出一张【杀】。若有角色响应,则你视为使用或打出了此【杀】。②每回合限一次。当有蜀势力角色于回合外使用或打出【杀】时,其可以令你摸一张牌。",
- xin_yufan: "界虞翻",
- xin_yufan_prefix: "界",
- xinzongxuan: "纵玄",
- xinzongxuan_info:
- "当你的牌因弃置而进入弃牌堆后,你可将其中的任意张牌置于牌堆顶。若剩余的牌中有锦囊牌,则你可以令一名其他角色获得其中的一张。",
- xinzhiyan: "直言",
- xinzhiyan_info:
- "结束阶段开始时,你可令一名角色摸一张牌(正面朝上移动)。若此牌为基本牌,则你摸一张牌。若此牌为装备牌,则其回复1点体力并使用此装备牌。",
- re_xiahoushi: "界夏侯氏",
- re_xiahoushi_prefix: "界",
- reqiaoshi: "樵拾",
- reqiaoshi_info:
- "其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。若这两张牌花色相同,则你可以重复此步骤。",
- reyanyu: "燕语",
- reyanyu2: "燕语",
- reyanyu_info:
- "①出牌阶段,你可以重铸【杀】。②出牌阶段结束时,你可以令一名其他男性角色摸X张牌(X为你本阶段内发动过〖燕语①〗的次数且至多为3)。",
- rehujia: "护驾",
- rehujia_info:
- "主公技。①当你需要使用或打出一张【闪】时,你可以令其他魏势力角色选择是否打出一张【闪】。若有角色响应,则你视为使用或打出了一张【闪】。②每回合限一次。当有魏势力角色于回合外使用或打出【闪】时,其可以令你摸一张牌。",
- ol_xuhuang: "界徐晃",
- ol_xuhuang_prefix: "界",
- olduanliang: "断粮",
- olduanliang_info:
- "你可以将一张黑色非锦囊牌当做【兵粮寸断】使用。若你于当前回合内未造成过伤害,则你使用【兵粮寸断】无距离限制。",
- oljiezi: "截辎",
- oljiezi_info:
- "①当有角色跳过摸牌阶段后,你可选择一名角色。若该角色:手牌数为全场最少且没有“辎”,则其获得一枚“辎”。否则其摸一张牌。②一名角色的摸牌阶段结束时,若其有“辎”,则你移去其“辎”,然后令其获得一个额外的摸牌阶段。",
- re_madai: "界马岱",
- re_madai_prefix: "界",
- reqianxi: "潜袭",
- reqianxi_info:
- "准备阶段开始时,你可摸一张牌,然后弃置一张牌并选择一名距离为1的其他角色。该角色于本回合内:{不能使用或打出与此牌颜色相同的牌,且其装备区内与此牌颜色相同的防具牌无效,且当其回复体力时,你摸两张牌。}",
- re_guohuanghou: "界郭皇后",
- re_guohuanghou_prefix: "界",
- rejiaozhao: "矫诏",
- rejiaozhao_info:
- "出牌阶段限一次。你可以展示一张手牌,并令一名距离你最近的角色选择一种基本牌或普通锦囊牌的牌名。你可将此牌当做其声明的牌使用直到此阶段结束(你不是此牌的合法目标)。",
- rejiaozhao_lv2: "矫诏·升级 Lv.1",
- rejiaozhao_lv2_info:
- "出牌阶段限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用(你不是此牌的合法目标)。",
- rejiaozhao_lv3: "矫诏·升级 Lv.2",
- rejiaozhao_lv3_info: "出牌阶段每种类型各限一次。你可以将一张手牌当做一张基本牌或普通锦囊牌使用。",
- redanxin: "殚心",
- redanxin_info: "当你受到伤害后,你可以摸一张牌并升级〖矫诏〗。",
- xin_wuguotai: "界吴国太",
- xin_wuguotai_prefix: "界",
- xinganlu: "甘露",
- xinganlu_info:
- "出牌阶段限一次。你可以令两名角色交换装备区内的牌,然后若这两名角色装备区内牌数差的绝对值大于你已损失的体力值,则你弃置两张手牌。",
- xinbuyi: "补益",
- xinbuyi_info:
- "一名角色进入濒死状态时,你可展示其一张手牌。若此牌不为基本牌,则其弃置此牌并回复1点体力。若其以此法弃置的牌移动前为其的唯一一张手牌,则其摸一张牌。",
- decadexianzhen: "陷阵",
- decadexianzhen2: "陷阵",
- decadexianzhen_info:
- "每回合限一次。出牌阶段,你可以和一名其他角色拼点。若你赢:本回合你无视该角色的防具,且对其使用牌没有次数和距离限制,且本回合对其使用牌造成伤害时,此伤害+1(每种牌名每回合限一次);若你没赢:你本回合内不能使用【杀】,且【杀】不计入手牌上限。",
- decadejinjiu: "禁酒",
- decadejinjiu_info:
- "锁定技。你的【酒】的牌名均视为【杀】且点数视为K;你的回合内,其他角色不能使用【酒】。",
- dc_xushu: "新杀徐庶",
- dc_xushu_prefix: "新杀",
- rezhuhai: "诛害",
- rezhuhai_info:
- "其他角色的回合结束时,若其本回合内造成过伤害,则你可以选择一项:⒈将一张手牌当做【杀】对其使用。⒉视为对其使用一张【过河拆桥】。",
- xsqianxin: "潜心",
- xsqianxin_info: "觉醒技。当你造成伤害后,若你已受伤,则你减1点体力上限并获得〖荐言〗。",
- rejianyan: "荐言",
- rejianyan_info:
- "出牌阶段每项各限一次。你可选择一种颜色或一种牌的类别,然后系统从牌堆中检索出一张满足该条件的牌并展示之。然后你将此牌交给一名男性角色或Key势力角色。",
- re_zhanghe: "界张郃",
- re_zhanghe_prefix: "界",
- reqiaobian: "巧变",
- reqiaobian_info:
- "①游戏开始时,你获得两枚“变”。②判定阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。③摸牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后可以获得至多两名其他角色的各一张手牌。④出牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段,然后你可以移动场上的一张牌。⑤弃牌阶段开始时,你可弃置一张牌或一枚“变”并跳过此阶段。⑥结束阶段,若你的〖巧变⑥〗记录中不包含你的手牌数,则你获得一枚“变”并记录你的手牌数。",
- olbeige: "悲歌",
- olbeige_info:
- "当有角色受到渠道为【杀】的伤害后,若你有牌,你可令其进行判定。然后你可弃置一张牌,根据判定结果执行以下的一个选项:♥,其回复1点体力;♦,其摸两张牌;♣,伤害来源弃置两张牌️;♠,伤害来源将武将牌翻面。若你弃置的牌与判定结果:点数相同,则你获得你弃置的牌;花色相同,则你获得判定牌。",
- dc_bulianshi: "界步练师",
- dc_bulianshi_prefix: "界",
- dcanxu: "安恤",
- dcanxu_info:
- "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌;若这两名角色手牌数相等,则你回复1点体力。",
- dczhuiyi: "追忆",
- dczhuiyi_info:
- "当你死亡时,你可以令一名不为击杀者的其他角色摸X张牌(X为存活角色数),然后其回复1点体力。",
- re_jushou: "界沮授",
- re_jushou_prefix: "界",
- dcshibei: "矢北",
- dcshibei_info:
- "锁定技,当你于一回合内第一次受到伤害后,你回复1点体力;当你于一回合内第二次受到伤害后,你失去1点体力。",
- dcjianying: "渐营",
- dcjianying_info: "当你使用与你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。",
- re_duji: "界杜畿",
- re_duji_prefix: "界",
- reandong: "安东",
- reandong_info:
- "当你受到其他角色造成的伤害时,你可以令伤害来源选择一项:⒈防止此伤害。然后其♥牌不计入本回合的手牌上限;⒉你观看其手牌并获得其中的所有♥牌,若其没有手牌,则你下次发动〖安东〗时改为自行选择。",
- reyingshi: "应势",
- reyingshi_info:
- "出牌阶段开始时,你可以展示一张手牌,选择一名角色A和一名其他角色B。A可以对B使用一张【杀】,然后获得你展示的牌。若A因此【杀】造成过伤害,则A获得牌堆中与展示牌花色点数相同的其他牌。",
- dcqiaomeng: "趫猛",
- dcqiaomeng_info:
- "当你使用黑色牌指定第一个目标后,你可以弃置目标角色中一名其他角色的一张牌。若你以此法弃置的牌为:装备牌,你获得此牌;锦囊牌,你令此牌不可被响应。",
- dc_gongsunzan: "新杀公孙瓒",
- dc_gongsunzan_prefix: "新杀",
- re_liuchen: "界刘谌",
- re_liuchen_prefix: "界",
- rezhanjue: "战绝",
- rezhanjue_effect: "战绝",
- rezhanjue_info:
- "出牌阶段,若你本阶段内因〖战绝〗得到过的牌数小于3,则你可以将所有不具有“勤王”标记的手牌当做【决斗】使用。此【决斗】使用结算结束后,你摸一张牌。然后所有因此【决斗】受到过伤害的角色也各摸一张牌。",
- reqinwang: "勤王",
- reqinwang_info:
- "主公技。出牌阶段限一次,你可以令所有其他蜀势力角色依次选择是否交给你一张【杀】,然后你可以令选择是的角色摸一张牌。",
- shizhan: "势斩",
- shizhan_info: "出牌阶段限两次,你可以选择一名其他角色。该角色视为对你使用一张【决斗】。",
- ol_xunyu: "界荀彧",
- ol_xunyu_prefix: "界",
- oljieming: "节命",
- oljieming_info:
- "当你受到1点伤害后或死亡时,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。",
- re_liufeng: "界刘封",
- re_liufeng_prefix: "界",
- rexiansi: "陷嗣",
- rexiansi2: "陷嗣",
- rexiansi_info:
- "①准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”。②当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用一张【杀】。③若你的“逆”数大于体力值,则你可以移去一张“逆”并视为使用一张【杀】。",
- re_sp_taishici: "界SP太史慈",
- re_sp_taishici_prefix: "界SP",
- rejixu: "击虚",
- rejixu_info:
- "出牌阶段限一次。若你有手牌,则你可以选择至多X名角色,令这些角色猜测你的手牌区中是否有【杀】。若你:有【杀】,则你本阶段使用【杀】的次数上限+Y,且当你于本阶段内使用【杀】指定目标后,你可以令这Y名角色也成为此【杀】的目标;没有【杀】,则你弃置这Y名角色的各一张牌。然后你摸Y张牌(X为你的体力值,Y为这些角色中猜错的角色数)。",
- ol_dianwei: "界典韦",
- ol_dianwei_prefix: "界",
- olqiangxi: "强袭",
- olqiangxi_info:
- "出牌阶段限两次。你可以弃置一张武器牌或受到1点无来源伤害,然后对一名本回合内未成为过〖强袭〗目标的其他角色造成1点伤害。",
- olningwu: "狞恶",
- olningwu_info:
- "锁定技。当一名角色A于一回合内第二次受到伤害后,若A或伤害来源为你,则你摸一张牌,然后弃置其装备区或判定区内的一张牌。",
- re_zhuhuan: "界朱桓",
- re_zhuhuan_prefix: "界",
- refenli: "奋励",
- refenli_info:
- "若你的手牌数为全场最多,你可以跳过判定阶段和摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。",
- //破界石不值钱了 就逮着免费突破硬削是吧
- repingkou: "平寇",
- repingkou_info:
- "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌。",
- dc_liru: "界李儒",
- dc_liru_prefix: "界",
- dcmieji: "灭计",
- dcmieji_info:
- "出牌阶段限一次,你可以展示一张武器牌或黑色锦囊牌。你将此牌置于牌堆顶,然后令一名有手牌的其他角色选择一项:⒈弃置一张锦囊牌;⒉依次弃置两张非锦囊牌。",
- dcfencheng: "焚城",
- dcfencheng_info:
- "限定技。出牌阶段,你可以指定一名其他角色,令从其开始的其他角色依次选择一项:⒈弃置至少X张牌(X为上一名角色弃置的牌数+1)。⒉你对其造成2点火焰伤害。",
- oljiang: "激昂",
- oljiang_info:
- "①当你使用【决斗】或红色【杀】指定第一个目标后,或成为【决斗】或红色【杀】的目标后,你可以摸一张牌。②当有【决斗】或红色【杀】于每回合内首次因弃置而进入弃牌堆后,你可以失去1点体力并获得这些牌。",
- re_xunyou: "界荀攸",
- re_xunyou_prefix: "界",
- reqice: "奇策",
- reqice_info: "出牌阶段限X次(X为你的“奇策”数+1),你可以将所有手牌当做任意一张普通锦囊牌使用。",
- rezhiyu: "智愚",
- rezhiyu_info:
- "当你受到伤害后,你可以摸一张牌,然后展示所有手牌,令伤害来源弃置一张手牌。若你展示的牌颜色均相同,你获得1枚“奇策”直到下回合结束且获得来源弃置的牌。",
- re_caiyong: "界蔡邕",
- re_caiyong_prefix: "界",
- rebizhuan: "辟撰",
- rebizhuan_bg: "书",
- rebizhuan_info:
- "①当你使用♠牌时,或成为其他角色使用♠牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”(你至多拥有四张“书”)。②你的手牌上限+X(X为“书”数)。",
- retongbo: "通博",
- retongbo_info:
- "摸牌阶段结束时,你可以用任意手牌交换等量“书”。然后若“书”数至少为4,你可以将四张“书”任意交给其他角色。若你交出的牌花色各不相同,你回复1点体力且“书”的上限+1(至多增加等同存活角色数的上限)。",
- re_chengong: "界陈宫",
- re_chengong_prefix: "界",
- remingce: "明策",
- remingce_info:
- "出牌阶段限一次。你可以将一张【杀】或装备牌交给一名其他角色,其选择一项:1.视为对你选择的另一名角色使用一张【杀】,且若此牌造成伤害,则执行选项2;2.你与其各摸一张牌。",
- re_sundeng: "界孙登",
- re_sundeng_prefix: "界",
- rekuangbi: "匡弼",
- rekuangbi_info:
- "出牌阶段开始时,你可以令一名其他角色将至多三张牌置于你的武将牌上直到此阶段结束。然后当你使用牌时,若你:有与此牌花色相同的“匡弼”牌,你移去其中一张并与其各摸一张牌;没有与此牌花色相同的“匡弼”牌,你随机移去一张“匡弼”牌并摸一张牌。",
- dc_chenqun: "界陈群",
- dc_chenqun_prefix: "界",
- repindi: "品第",
- repindi_info:
- "出牌阶段每名角色限一次。你可以弃置一张本阶段未以此法弃置过的类型的牌并选择一名角色,你选择一项:1.其摸X张牌;2.其弃置X张牌(X为你本回合发动〖品第〗的次数)。然后若其已受伤,你横置或重置。",
- re_mazhong: "界马忠",
- re_mazhong_prefix: "界",
- refuman: "抚蛮",
- refuman_info:
- "出牌阶段每名角色限一次。你可以弃置一张牌,令一名其他角色从弃牌堆中获得一张【杀】。然后其于其下个回合结束前使用或打出此牌时,你与其各摸一张牌。",
- re_guanzhang: "界关兴张苞",
- re_guanzhang_prefix: "界",
- retongxin: "同心",
- retongxin_info: "锁定技。你的攻击范围+2。",
- re_wenpin: "界文聘",
- re_wenpin_prefix: "界",
- rezhenwei: "镇卫",
- rezhenwei_info:
- "当一名其他角色成为【杀】或黑色锦囊牌的目标时,若该角色的体力值不大于你且此牌的目标角色数为1,你可以弃置一张牌并选择一项:1.摸一张牌,然后将此【杀】或黑色锦囊牌的目标转移给你;2.令此【杀】或黑色锦囊牌无效且将此【杀】或黑色锦囊牌置于使用者的武将牌上,然后当前回合结束后,使用者获得这些牌。",
- ol_huangzhong: "界黄忠",
- ol_huangzhong_prefix: "界",
- remoshi: "没矢",
- remoshi_info:
- "锁定技。①当你使用【杀】对目标角色造成伤害后,若其装备区里有防具牌或坐骑牌,你将此【杀】对应的实体牌置于其武将牌上。②当有“没矢”牌的角色失去防具牌或坐骑牌后,你获得其“没矢”牌。",
- dc_caozhi: "界曹植",
- dc_caozhi_prefix: "界",
- dcjiushi: "酒诗",
- dcjiushi_info:
- "①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌于受到伤害时背面向上,你可以翻面。③当你使用【酒】后,你使用【杀】的次数上限+1直到你的下个回合结束。",
- olhuoji: "火计",
- olhuoji_info:
- "①你可以将一张红色牌当【火攻】使用。②你使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。",
- olkanpo: "看破",
- olkanpo_info: "①你可以将一张黑色牌当【无懈可击】使用。②你使用的【无懈可击】不可被响应。",
- xinwangxi: "忘隙",
- xinwangxi_info:
- "当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可以摸两张牌,然后交给其一张牌。",
- ol_yanwen: "界颜良文丑",
- ol_yanwen_prefix: "界",
- olshuangxiong: "双雄",
- olshuangxiong_info:
- "①摸牌阶段结束时,你可以弃置一张牌。若如此做,你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用。②结束阶段,你从弃牌堆中获得本回合内对你造成伤害的所有牌。",
- re_zhuzhi: "界朱治",
- re_zhuzhi_prefix: "界",
- reanguo: "安国",
- reanguo_info:
- "出牌阶段限一次。你可以选择一名其他角色,若其:手牌数为全场最少,其摸一张牌;体力值为全场最低,其回复1点体力;装备区内牌数为全场最少,其随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。若你与其执行了全部分支,你可以重铸任意张牌。",
- dcyicong: "义从",
- dcyicong_info:
- "锁定技。①你至其他角色的距离-1。②若你已损失的体力值不小于2,则其他角色至你的距离+1。",
- re_zhangsong: "界张松",
- re_zhangsong_prefix: "界",
- rexiantu: "献图",
- rexiantu_info:
- "其他角色的出牌阶段开始时,你可以摸两张牌,然后将两张牌交给该角色。然后此阶段结束时,若其于此阶段没有造成过伤害,你失去1点体力。",
- re_jsp_huangyueying: "界SP黄月英",
- re_jsp_huangyueying_prefix: "界SP",
- rejiqiao: "机巧",
- rejiqiao_info:
- "出牌阶段开始时,你可以弃置任意张牌,然后亮出牌堆顶X张牌(X为你以此法弃置的牌数与其中装备牌数之和),你获得其中所有非装备牌。",
- relinglong: "玲珑",
- relinglong_info:
- "锁定技。若你的装备区:有空置的防具栏,你视为拥有〖八卦阵〗;有空置的两种坐骑栏,你的手牌上限+2;有空置的宝物栏,你视为拥有〖奇才〗;以上均满足:你使用的【杀】或普通锦囊牌不可被响应。",
- ol_zhangzhang: "界张昭张纮",
- ol_zhangzhang_prefix: "界",
- olzhijian: "直谏",
- olzhijian_info:
- "出牌阶段,你可以将一张装备牌置于其他角色的装备区(可替换原装备),然后摸一张牌。",
- olguzheng: "固政",
- olguzheng_info:
- "每阶段限一次。当其他角色的至少两张牌因弃置而进入弃牌堆后,你可以令其获得其中一张牌,然后你可以获得剩余的牌。",
- re_caochong: "界曹冲",
- re_caochong_prefix: "界",
- rechengxiang: "称象",
- rechengxiang_info:
- "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。若你得到的牌点数之和为13,你复原武将牌。",
- re_caorui: "界曹叡",
- re_caorui_prefix: "界",
- remingjian: "明鉴",
- remingjian_info:
- "出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合获得如下效果:1.手牌上限与使用【杀】的次数上限+1;2.当该角色首次造成伤害后,其可以令你发动一次〖恢拓〗。",
- rexingshuai: "兴衰",
- rexingshuai_info:
- "主公技,限定技。当你进入濒死状态时,你可令其他魏势力角色依次选择是否令你回复1点体力。然后这些角色依次受到1点伤害。有〖明鉴〗效果的角色于其回合内杀死角色后,你重置〖兴衰〗。",
- xin_zhangliang: "界张梁",
- xin_zhangliang_prefix: "界",
- rejijun: "集军",
- rejijun_info:
- "当你使用目标角色含有自己的牌结算完毕后,你可以进行一次判定并将判定牌置于武将牌上,称为“方”。",
- refangtong: "方统",
- refangtong_info:
- "结束阶段,你可以将一张手牌置于武将牌上,称为“方”。若如此做,你可以移去任意张“方”并对一名其他角色造成1点雷属性伤害(若你移去的“方”的点数和大于36,则改为造成3点雷属性伤害)。",
- re_simalang: "界司马朗",
- re_simalang_prefix: "界",
- requji: "去疾",
- requji_info:
- "出牌阶段限一次,你可以弃置至多X张牌并令等量名角色回复1点体力,然后仍处于受伤状态的目标角色摸一张牌,若你以此法弃置了黑色牌,你失去1点体力(X为你已损失的体力值)。",
- rejunbing: "郡兵",
- rejunbing_info:
- "一名角色的结束阶段,若其手牌数小于其体力值,其可以摸一张牌并将所有手牌交给你,然后你可以交给其等量的牌。",
- re_zhugedan: "界诸葛诞",
- re_zhugedan_prefix: "界",
- regongao: "功獒",
- regongao_info: "锁定技。一名其他角色首次进入濒死状态时,你增加1点体力上限,然后回复1点体力。",
- rejuyi: "举义",
- rejuyi_info:
- "觉醒技。准备阶段,若你已受伤,且你的体力上限大于场上的存活角色数,你将手牌数摸至体力上限,然后获得技能〖崩坏〗和〖威重〗。",
- reweizhong: "威重",
- reweizhong_info: "锁定技。当你的体力上限增加或减少时,你摸两张牌。",
- re_zhongyao: "界钟繇",
- re_zhongyao_prefix: "界",
- rehuomo: "活墨",
- rehuomo_info:
- "每种牌名每回合限一次。当你需要使用一张基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。",
- zhoutai: "界周泰",
- zhoutai_prefix: "界",
- caoren: "界曹仁",
- caoren_prefix: "界",
- ollianhuan: "连环",
- ollianhuan_info:
- "你可以将一张♣牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。",
- re_lidian: "界李典",
- gz_re_lidian: "李典",
- re_lidian_prefix: "界",
- re_xushu: "界徐庶",
- re_xushu_prefix: "界",
- rejianxiong_old: "奸雄",
- rejianxiong_old_info: "当你受到伤害后,你可以摸一张牌或获得对你造成伤害的牌。",
-
- refresh_standard: "界限突破·标",
- refresh_feng: "界限突破·风",
- refresh_huo: "界限突破·火",
- refresh_lin: "界限突破·林",
- refresh_shan: "界限突破·山",
- refresh_yijiang1: "界限突破·将1",
- refresh_yijiang2: "界限突破·将2",
- refresh_yijiang3: "界限突破·将3",
- refresh_yijiang4: "界限突破·将4",
- refresh_yijiang5: "界限突破·将5",
- refresh_yijiang6: "界限突破·原6",
- refresh_xinghuo: "界限突破·星火",
- },
- };
-});
diff --git a/character/refresh/characterFilter.js b/character/refresh/characterFilter.js
index 9edfe5e6b..5f02124c1 100644
--- a/character/refresh/characterFilter.js
+++ b/character/refresh/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
re_zuoci(mode) {
return mode != "guozhan";
diff --git a/character/sb/characterFilter.js b/character/sb/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/sb/characterFilter.js
+++ b/character/sb/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/shenhua/characterFilter.js b/character/shenhua/characterFilter.js
index 555c3cb74..333f5807a 100644
--- a/character/shenhua/characterFilter.js
+++ b/character/shenhua/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
zuoci(mode) {
return mode != "guozhan";
diff --git a/character/shiji/characterFilter.js b/character/shiji/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/shiji/characterFilter.js
+++ b/character/shiji/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/sp2/characterFilter.js b/character/sp2/characterFilter.js
index e96476582..80afe9fe9 100644
--- a/character/sp2/characterFilter.js
+++ b/character/sp2/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
chunyuqiong(mode) {
return mode != "identity" && mode != "guozhan";
diff --git a/character/standard/characterFilter.js b/character/standard/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/standard/characterFilter.js
+++ b/character/standard/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/tw/characterFilter.js b/character/tw/characterFilter.js
index 798cf01a1..b6da798cd 100644
--- a/character/tw/characterFilter.js
+++ b/character/tw/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
nashime(mode) {
return mode != "guozhan";
diff --git a/character/xianding.js b/character/xianding.js
deleted file mode 100644
index 69f1bdcbb..000000000
--- a/character/xianding.js
+++ /dev/null
@@ -1,17675 +0,0 @@
-import { lib, game, ui, get, ai, _status } from "../noname.js";
-game.import("character", function () {
- return {
- name: "xianding",
- connect: true,
- character: {
- guanyue: ["male", "shu", 4, ["dcshouzhi", "dcfenhui"]],
- sp_zhenji: ["female", "qun", 3, ["dcjijie", "dchuiji"]],
- wu_guanyu: ["male", "shu", 5, ["dcjuewu", "dcwuyou", "dcyixian"]],
- caofang: ["male", "wei", 4, ["dczhimin", "dcjujian"], ["zhu"]],
- dc_sb_simayi: ["male", "wei", 3, ["dcsbquanmou", "dcsbpingliao"]],
- chendong: ["male", "wu", 4, ["dcduanxie", "fenming"]],
- lvfan: ["male", "wu", 3, ["diaodu", "diancai"]],
- cuimao: ["male", "wei", 3, ["zhengbi", "fengying"]],
- huzun: ["male", "wei", 4, ["dczhantao", "dcanjing"]],
- zhugemengxue: ["female", "wei", 3, ["dcjichun", "dchanying"]],
- bailingyun: ["female", "wei", 3, ["dclinghui", "dcxiace", "dcyuxin"]],
- dc_qinghegongzhu: ["female", "wei", 3, ["dczhangji", "dczengou"]],
- caoxian: ["female", "wei", 3, ["dclingxi", "dczhifou"]],
- dc_sb_zhouyu: ["male", "wu", 4, ["dcsbronghuo", "dcsbyingmou"]],
- dc_sb_lusu: ["male", "wu", 3, ["dcsbmingshi", "dcsbmengmou"]],
- zhangjian: ["male", "qun", 105, ["dc_zj_a", "dc_zj_b"], ["unseen"]],
- zhugeruoxue: ["female", "wei", 3, ["dcqiongying", "dcnuanhui"]],
- caoyi: ["female", "wei", 4, ["dcmiyi", "dcyinjun"]],
- malingli: ["female", "shu", 3, ["dclima", "dcxiaoyin", "dchuahuo"]],
- wu_luxun: ["male", "wu", 3, ["dcxiongmu", "dczhangcai", "dcruxian"]],
- dc_xujing: ["male", "shu", 3, ["dcshangyu", "dccaixia"]],
- dc_zhaoxiang: ["female", "shu", 4, ["refanghun", "refuhan"]],
- dc_guansuo: ["male", "shu", 4, ["xinzhengnan", "xiefang"]],
- xin_baosanniang: ["female", "shu", 3, ["decadewuniang", "decadexushen"]],
- dc_shixie: ["male", "qun", 3, ["rebiluan", "ollixia"]],
- dc_sp_machao: ["male", "qun", 4, ["zhuiji", "dc_olshichou"]],
- old_huangfusong: ["male", "qun", 4, ["xinfenyue"]],
- dc_xiahouba: ["male", "shu", 4, ["rebaobian"]],
- dc_daxiaoqiao: ["female", "wu", 3, ["dcxingwu", "dcluoyan"], ["tempname:daxiaoqiao"]],
- tianshangyi: ["female", "wei", 3, ["dcposuo", "dcxiaoren"]],
- sunlingluan: ["female", "wu", 3, ["dclingyue", "dcpandi"]],
- dc_wangjun: ["male", "qun", 4, ["dctongye", "dcchangqu"]],
- zhoubuyi: ["male", "wei", 3, ["dcshiji", "dcsilun"]],
- dc_duyu: ["male", "wei", 4, ["dcjianguo", "dcdyqingshi"]],
- ganfurenmifuren: ["female", "shu", 3, ["dcchanjuan", "dcxunbie"]],
- dc_ganfuren: ["female", "shu", 3, ["dcshushen", "dcshenzhi"]],
- dc_mifuren: ["female", "shu", 3, ["dcguixiu", "dccunsi"]],
- wanglang: ["male", "wei", 3, ["regushe", "rejici"]],
- ruanji: ["male", "wei", 3, ["dczhaowen", "dcjiudun"]],
- wu_zhugeliang: ["male", "shu", "4/7", ["dcjincui", "dcqingshi", "dczhizhe"]],
- duanqiaoxiao: ["female", "wei", 3, ["dccaizhuang", "dchuayi"]],
- zhangjinyun: ["female", "shu", 3, ["dchuizhi", "dcjijiao"]],
- huanfan: ["male", "wei", 3, ["dcjianzheng", "dcfumou"]],
- chentai: ["male", "wei", 4, ["dcctjiuxian", "dcchenyong"]],
- sunyu: ["male", "wu", 3, ["dcquanshou", "dcshexue"]],
- xizheng: ["male", "shu", 3, ["dcdanyi", "dcwencan"]],
- dc_ruiji: ["female", "wu", 4, ["dcwangyuan", "dclingyin", "dcliying"]],
- zerong: ["male", "qun", 4, ["dccansi", "dcfozong"]],
- xielingyu: ["female", "wu", 3, ["dcyuandi", "dcxinyou"]],
- dc_yangbiao: ["male", "qun", 3, ["dczhaohan", "dcjinjie", "dcjue"]],
- dc_tengfanglan: ["female", "wu", 3, ["dcluochong", "dcaichen"]],
- yanghong: ["male", "qun", 3, ["dcjianji", "dcyuanmo"]],
- xuelingyun: ["female", "wei", 3, ["dcxialei", "dcanzhi"]],
- dc_wangyun: ["male", "qun", 4, ["dclianji", "dcmoucheng"], ["clan:太原王氏"]],
- dc_zhouxuān: ["male", "wei", 3, ["dcwumei", "dczhanmeng"]],
- chengbing: ["male", "wu", 3, ["dcjingzao", "dcenyu"]],
- dongguiren: ["female", "qun", 3, ["dclianzhi", "dclingfang", "dcfengying"]],
- yuanji: ["female", "wu", 3, ["dcfangdu", "dcjiexing"]],
- zhujianping: ["male", "qun", 3, ["dcxiangmian", "dctianji"]],
- zhaozhi: ["male", "shu", 3, ["dctongguan", "dcmengjie"]],
- dc_liuye: ["male", "wei", 3, ["dcpoyuan", "dchuace"]],
- luyi: ["female", "qun", 3, ["dcyaoyi", "dcfuxue"]],
- dingshangwan: ["female", "wei", 3, ["dcfengyan", "dcfudao"]],
- quanhuijie: ["female", "wu", 3, ["dchuishu", "dcyishu", "dcligong"]],
- dukui: ["male", "wei", 3, ["dcfanyin", "dcpeiqi"]],
- zhangfen: ["male", "wu", 4, ["dcwanglu", "dcxianzhu", "dcchaixie"]],
- liuhui: ["male", "qun", 4, ["dcgeyuan", "dcjieshu", "dcgusuan"]],
- dc_wangchang: ["male", "wei", 3, ["dckaiji", "dcpingxi"], ["clan:太原王氏"]],
- zhaoang: ["male", "wei", "3/4", ["dczhongjie", "dcsushou"]],
- caohua: ["female", "wei", 3, ["caiyi", "guili"]],
- dc_liuyu: ["male", "qun", 3, ["dcsuifu", "dcpijing"]],
- dc_huangzu: ["male", "qun", 4, ["dcjinggong", "dcxiaojuan"]],
- laiyinger: ["female", "qun", 3, ["xiaowu", "huaping"]],
- caomao: ["male", "wei", "3/4", ["qianlong", "fensi", "juetao", "zhushi"], ["zhu"]],
- dc_luotong: ["male", "wu", 3, ["renzheng", "jinjian"]],
- re_fengfangnv: ["female", "qun", 3, ["tiqi", "baoshu"]],
- wufan: ["male", "wu", 4, ["tianyun", "wfyuyan"]],
- re_zhangbao: ["male", "qun", 3, ["xinzhoufu", "xinyingbing"]],
- re_sunyi: ["male", "wu", 5, ["syjiqiao", "syxiongyi"]],
- caojinyu: ["female", "wei", 3, ["yuqi", "shanshen", "xianjing"]],
- zhouyi: ["female", "wu", 3, ["zhukou", "mengqing"]],
- re_panshu: ["female", "wu", 3, ["zhiren", "yaner"]],
- yangwan: ["female", "shu", 3, ["youyan", "zhuihuan"]],
- ruanyu: ["male", "wei", 3, ["xingzuo", "miaoxian"]],
- fanyufeng: ["female", "qun", 3, ["bazhan", "jiaoying"]],
- guozhao: ["female", "wei", 3, ["pianchong", "zunwei"]],
- re_xinxianying: ["female", "wei", 3, ["rezhongjian", "recaishi"]],
- liubian: ["male", "qun", 3, ["shiyuan", "dushi", "yuwei"], ["zhu"]],
- re_liuzan: ["male", "wu", 4, ["refenyin", "liji"]],
- wenyang: ["male", "wei", 5, ["xinlvli", "choujue"]],
- wangshuang: ["male", "wei", 8, ["spzhuilie"]],
- huaman: ["female", "shu", 3, ["manyi", "mansi", "souying", "zhanyuan"]],
- puyuan: ["male", "shu", 4, ["pytianjiang", "pyzhuren"]],
- guanlu: ["male", "wei", 3, ["tuiyan", "busuan", "mingjie"]],
- gexuan: ["male", "wu", 3, ["gxlianhua", "zhafu"]],
- leitong: ["male", "shu", 4, ["kuiji"]],
- wulan: ["male", "shu", 4, ["wlcuorui"]],
- },
- characterSort: {
- xianding: {
- sp2_huben: ["chendong", "wangshuang", "wenyang", "re_liuzan", "dc_huangzu", "wulan", "leitong", "chentai", "dc_duyu", "dc_wangjun", "dc_xiahouba", "old_huangfusong", "huzun"],
- sp2_shengun: ["puyuan", "guanlu", "gexuan", "wufan", "re_zhangbao", "dukui", "zhaozhi", "zhujianping", "dc_zhouxuān", "zerong"],
- sp2_bizhe: ["dc_luotong", "dc_wangchang", "chengbing", "dc_yangbiao", "ruanji", "cuimao"],
- sp2_huangjia: ["caomao", "liubian", "dc_liuyu", "quanhuijie", "dingshangwan", "yuanji", "xielingyu", "sunyu", "ganfurenmifuren", "dc_ganfuren", "dc_mifuren", "dc_shixie", "caofang"],
- sp2_zhangtai: ["guozhao", "fanyufeng", "ruanyu", "yangwan", "re_panshu"],
- sp2_jinse: ["caojinyu", "re_sunyi", "re_fengfangnv", "caohua", "laiyinger", "zhangfen", "zhugeruoxue", "caoxian", "dc_qinghegongzhu", "zhugemengxue"],
- sp2_yinyu: ["zhouyi", "luyi", "sunlingluan", "caoyi"],
- sp2_wangzhe: ["dc_daxiaoqiao", "dc_sp_machao", "sp_zhenji"],
- sp2_doukou: ["re_xinxianying", "huaman", "xuelingyun", "dc_ruiji", "duanqiaoxiao", "tianshangyi", "malingli", "bailingyun"],
- sp2_jichu: ["zhaoang", "dc_liuye", "dc_wangyun", "yanghong", "huanfan", "xizheng", "lvfan"],
- sp2_yuxiu: ["dongguiren", "dc_tengfanglan", "zhangjinyun", "zhoubuyi", "dc_xujing", "guanyue"],
- sp2_qifu: ["dc_guansuo", "xin_baosanniang", "dc_zhaoxiang"],
- sp2_gaoshan: ["wanglang", "liuhui", "zhangjian"],
- sp2_wumiao: ["wu_zhugeliang", "wu_luxun", "wu_guanyu"],
- sp2_mouding: ["dc_sb_lusu", "dc_sb_zhouyu", "dc_sb_simayi"],
- },
- },
- characterSubstitute: {
- dc_sb_simayi: [],
- dc_sb_zhouyu: [],
- //dc_sb_lusu: [],
- },
- skill: {
- //关樾
- dcshouzhi: {
- audio: 2,
- trigger: {
- global: "phaseEnd",
- },
- filter(event, player) {
- let delt = 0;
- player.checkHistory("lose", evt => {
- delt -= evt.hs.length;
- });
- player.checkHistory("gain", evt => {
- delt += evt.cards.length;
- });
- return delt < 0 || (delt > 0 && player.countCards("h"));
- },
- locked(skill, player) {
- return player && player.storage.dcshouzhi_modified;
- },
- derivation: ["dcshouzhi_modified"],
- onremove: ["dcshouzhi_modified"],
- async cost(event, trigger, player) {
- let delt = 0;
- player.checkHistory("lose", evt => {
- delt -= evt.hs.length;
- });
- player.checkHistory("gain", evt => {
- delt += evt.cards.length;
- });
- const forced = !player.storage.dcshouzhi_modified;
- if (delt < 0) {
- const bool = forced ? true : await player.chooseBool(get.prompt("dcshouzhi"), "你可以摸两张牌。").forResultBool();
- event.result = { bool };
- } else {
- const next = player.chooseCard("守执:请弃置一张手牌").set("filterCard", (card, player) => {
- return lib.filter.cardDiscardable(card, player, "dcshouzhi");
- });
- next.set("forced", forced);
- if (!forced) {
- next.set("prompt", get.prompt("dcshouzhi"))
- .set("prompt2", "你可以弃置一张手牌。")
- .set("ai", card => {
- const player = get.player();
- if (player.hasSkill("dcxingmen") && get.recoverEffect(player, player) > 0) return 6 - get.value(card);
- return 0;
- });
- }
- event.result = await next.forResult();
- }
- },
- async content(event, trigger, player) {
- const { cards } = event;
- if (cards && cards.length) await player.discard(cards);
- else await player.draw(2);
- await game.asyncDelayx();
- },
- },
- dcfenhui: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- filterTarget(card, player, target) {
- const list = get.event("dcfenhui_enabled");
- if (!list || !list.length) return false;
- return list.includes(target);
- },
- onChooseToUse(event) {
- if (game.online) return;
- const player = event.player;
- const evts = player.getAllHistory("useCard", evt => {
- return get.color(evt.card, player) === "black" && evt.targets && evt.targets.length;
- });
- event.set(
- "dcfenhui_enabled",
- game.filterPlayer(current => {
- return evts.filter(evt => evt.targets.includes(current)).length;
- })
- );
- },
- skillAnimation: true,
- animationColor: "fire",
- derivation: ["dcxingmen"],
- async content(event, trigger, player) {
- player.awakenSkill("dcfenhui");
- const target = event.target;
- const count = player.getAllHistory("useCard", evt => {
- return get.color(evt.card, player) === "black" && evt.targets && evt.targets.includes(target);
- }).length;
- target.addMark("dcfenhui_mark", Math.min(5, count));
- player.addSkill("dcfenhui_effect");
- },
- subSkill: {
- effect: {
- audio: "dcfenhui",
- trigger: {
- source: "damageBegin1",
- global: "die",
- },
- filter(event, player) {
- return event.player.hasMark("dcfenhui_mark");
- },
- logTarget: "player",
- forced: true,
- charlotte: true,
- async content(event, trigger, player) {
- if (trigger.name === "damage") {
- trigger.player.removeMark("dcfenhui_mark", 1);
- trigger.num++;
- } else {
- await player.loseMaxHp();
- player.storage.dcshouzhi_modified = true;
- await player.addSkills("dcxingmen");
- }
- },
- },
- mark: {
- marktext: "恨",
- intro: {
- name: "恨(奋恚)",
- name2: "恨",
- content: "mark",
- },
- },
- },
- ai: {
- order: 6,
- result: {
- target(player, target) {
- if (
- !player.hasCard(card => {
- return get.tag(card, "damage") && player.canUse(card, target, true, true) && get.effect(target, card, player, player) > 0;
- }, "hs")
- )
- return 0;
- const count = Math.min(
- 5,
- player.getAllHistory("useCard", evt => {
- return get.color(evt.card, player) === "black" && evt.targets && evt.targets.includes(target);
- }).length
- );
- let value = Math.max(player.getHp(true), 3) - count;
- if (
- (count - 1) *
- (target.hasSkillTag("filterDamage", null, {
- player: player,
- })
- ? 1
- : 2) >=
- target.getHp(true) +
- target.countCards("hs", card => {
- return target.canSaveCard(card, target);
- })
- )
- value -= 2;
- return Math.min(0, value);
- },
- },
- },
- },
- dcxingmen: {
- audio: 2,
- trigger: {
- player: "loseAfter",
- },
- filter(event, player) {
- return event.getParent(2).name === "dcshouzhi" && player.isDamaged();
- },
- frequent: true,
- prompt2: "你可以回复1点体力。",
- group: ["dcxingmen_norespond"],
- check(event, player) {
- return get.recoverEffect(player, player) > 0;
- },
- async content(event, trigger, player) {
- await player.recover();
- },
- subSkill: {
- norespond: {
- audio: "dcxingmen",
- trigger: {
- player: "gainAfter",
- },
- filter(event, player) {
- return event.getParent().name === "draw" && event.cards.length >= 2 && event.cards.every(card => get.color(card) === "red");
- },
- forced: true,
- locked: false,
- popup: false,
- async content(event, trigger, player) {
- player.addGaintag(trigger.cards, "dcxingmen");
- player.addSkill("dcxingmen_directHit");
- },
- },
- directHit: {
- audio: "dcxingmen",
- trigger: { player: "useCard" },
- forced: true,
- charlotte: true,
- filter(event, player) {
- return player.hasHistory("lose", evt => {
- if (evt.getParent() !== event) return false;
- return Object.values(evt.gaintag_map).some(tags => tags.includes("dcxingmen"));
- });
- },
- async content(event, trigger, player) {
- trigger.directHit.addArray(game.filterPlayer());
- game.log(trigger.card, "不可被响应");
- },
- },
- },
- },
- //武关羽
- dcjuewu: {
- audio: 2,
- enable: "chooseToUse",
- filter(event, player) {
- if (
- !player.hasCard(card => {
- return _status.connectMode || get.number(card) === 2;
- }, "hes")
- )
- return false;
- for (const name of ["shuiyanqijuny"].concat(lib.inpile)) {
- if (player.getStorage("dcjuewu_used").includes(name)) continue;
- const card = get.autoViewAs({ name }, "unsure");
- if (!get.tag(card, "damage")) continue;
- if (event.filterCard(card, player, event)) return true;
- if (name === "sha") {
- for (const nature of lib.inpile_nature) {
- card.nature = nature;
- if (event.filterCard(card, player, event)) return true;
- }
- }
- }
- return false;
- },
- hiddenCard(player, name) {
- if (!lib.inpile.includes(name)) return false;
- if (player.getStorage("dcjuewu_used").includes(name)) return false;
- if (
- !player.hasCard(card => {
- return _status.connectMode || get.number(card) === 2;
- }, "hes")
- )
- return false;
- return get.tag({ name }, "damage");
- },
- group: "dcjuewu_inTwo",
- chooseButton: {
- dialog(event, player) {
- let list = get.inpileVCardList(info => {
- return get.tag({ name: info[2] }, "damage");
- });
- if (!list.some(info => info[2] === "shuiyanqijuny")) list.add(["锦囊", "", "shuiyanqijuny"]);
- list = list.filter(info => {
- const name = info[2],
- nature = info[3];
- if (player.getStorage("dcjuewu_used").includes(name)) return false;
- const card = get.autoViewAs({ name, nature }, "unsure");
- return event.filterCard(card, player, event);
- });
- return ui.create.dialog("绝武", [list, "vcard"]);
- },
- check(button) {
- if (get.event().getParent().type != "phase") return 1;
- const player = get.player();
- return player.getUseValue({
- name: button.link[2],
- nature: button.link[3],
- });
- },
- backup(links, player) {
- return {
- audio: "dcjuewu",
- filterCard(card, player) {
- return get.number(card) === 2;
- },
- position: "hes",
- check(card) {
- return 8 - get.value(card);
- },
- popname: true,
- viewAs: {
- name: links[0][2],
- nature: links[0][3],
- },
- precontent() {
- if (!player.storage.dcjuewu_used) {
- player.when({ global: "phaseAfter" }).then(() => {
- delete player.storage.dcjuewu_used;
- });
- }
- player.markAuto("dcjuewu_used", event.result.card.name);
- },
- };
- },
- prompt(links, player) {
- return "将一张点数为2的牌当" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用";
- },
- },
- subSkill: {
- backup: {},
- inTwo: {
- audio: "dcjuewu",
- trigger: {
- player: "gainAfter",
- global: "loseAsyncAfter",
- },
- filter(event, player) {
- const cards = event.getg(player);
- if (!cards.length) return false;
- return game.hasPlayer(current => {
- if (current === player) return false;
- const evt = event.getl(current);
- return evt && evt.hs.length + evt.es.length + evt.js.length > 0;
- });
- },
- forced: true,
- locked: false,
- async content(event, trigger, player) {
- player.addGaintag(trigger.getg(player), "dcjuewu_two");
- player.addSkill("dcjuewu_two");
- },
- },
- two: {
- charlotte: true,
- mod: {
- cardnumber(card) {
- if (card.hasGaintag("dcjuewu_two")) return 2;
- },
- },
- },
- },
- ai: {
- fireAttack: true,
- respondSha: true,
- skillTagFilter(player) {
- if (
- !player.hasCard(card => {
- return _status.connectMode || get.number(card) === 2;
- }, "hes")
- )
- return false;
- },
- order: 1,
- result: {
- player(player) {
- if (get.event("dying")) return get.attitude(player, get.event("dying"));
- return 1;
- },
- },
- },
- },
- dcwuyou: {
- audio: 2,
- global: "dcwuyou_g",
- subSkill: {
- g: {
- audio: "dcwuyou",
- enable: "phaseUse",
- usable: 1,
- filter(event, player) {
- if (!player.countCards("h")) return false;
- return game.hasPlayer(current => {
- return current.hasSkill("dcwuyou");
- });
- },
- filterCard: true,
- filterTarget(card, player, target) {
- return target.hasSkill("dcwuyou");
- },
- selectTarget() {
- const count = game.countPlayer(current => {
- return current.hasSkill("dcwuyou");
- });
- return count > 1 ? 1 : -1;
- },
- check(card) {
- const player = get.player();
- const hasFriend = game.hasPlayer(current => {
- return current.hasSkill("dcwuyou") && get.attitude(player, current) > 0;
- });
- return (hasFriend ? 7 : 1) - get.value(card);
- },
- prompt() {
- const player = get.player(),
- list = game.filterPlayer(current => {
- return current.hasSkill("dcwuyou");
- }),
- list2 = list.filter(current => current !== player);
- const moreThanOne = list.length > 1,
- includesMe = list.includes(player);
- let str = "选择一张手牌,";
- if (includesMe) str += `点击“确定”,${moreThanOne ? "或" : ""}`;
- if (moreThanOne || !includesMe) str += `将此牌交给${get.translation(list2)}${list2.length > 1 ? "中的一人" : ""},`;
- str += "然后执行后续效果。";
- return str;
- },
- discard: false,
- lose: false,
- delay: false,
- async content(event, trigger, player) {
- const { target } = event;
- const isMe = target === player;
- let { cards } = event;
- if (!isMe) await player.give(cards, target);
- const names = lib.inpile
- .filter(name => {
- return get.type2(name) !== "equip";
- })
- .randomGets(5);
- if (names.includes("sha")) names.splice(names.indexOf("sha") + 1, 0, ...lib.inpile_nature.map(nature => ["sha", nature]));
- const vcard = names.map(namex => {
- let name = namex,
- nature;
- if (Array.isArray(namex)) [name, nature] = namex;
- const info = [get.type(name), "", name, nature];
- return info;
- });
- const links = await target
- .chooseButton(["武佑:选择一个牌名", [vcard, "vcard"]], true)
- .set("user", player)
- .set("ai", button => {
- const player = get.player(),
- user = get.event("user");
- return user.getUseValue({ name: button.link[2], nature: button.link[3] }) * get.attitude(player, user);
- })
- .forResultLinks();
- if (!links || !links.length) return;
- const viewAs = { name: links[0][2], nature: links[0][3] };
- if (!isMe) {
- cards = await target.chooseToGive(player).set('ai', card => {
- const player = get.event("player"), target = get.event().getParent().player;
- if (get.attitude(player, target) <= 0) return 0;
- return 6 - get.value(card);
- }).forResultCards();
- }
- if (!cards) return;
- const card = cards[0];
- if (player.getCards("h").includes(card)) {
- if (!player.storage.dcwuyou_transfer) player.storage.dcwuyou_transfer = {};
- player.storage.dcwuyou_transfer[card.cardid] = viewAs;
- player.addGaintag(cards, "dcwuyou_transfer");
- player.addSkill("dcwuyou_transfer");
- }
- },
- ai: {
- order: 10,
- result: {
- player(player, target) {
- if (get.attitude(player, target) > 0) return 1;
- return 0;
- },
- target: 0.5,
- },
- },
- },
- transfer: {
- trigger: { player: "useCard1" },
- forced: true,
- popup: false,
- charlotte: true,
- filter(event, player) {
- if (event.addCount === false) return false;
- return player.hasHistory("lose", evt => {
- if (evt.getParent() != event) return false;
- for (const i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("dcwuyou_transfer")) return true;
- }
- return false;
- });
- },
- async content(event, trigger, player) {
- trigger.addCount = false;
- const stat = player.getStat().card,
- name = trigger.card.name;
- if (typeof stat[name] === "number") stat[name]--;
- },
- mod: {
- cardname(card, player) {
- const map = player.storage.dcwuyou_transfer;
- if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("dcwuyou_transfer")) return map[card.cardid].name;
- },
- cardnature(card, player) {
- const map = player.storage.dcwuyou_transfer;
- if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("dcwuyou_transfer")) return map[card.cardid].nature || false;
- },
- cardUsable(card) {
- if (!card.cards) return;
- if (card.cards.some(card => card.hasGaintag("dcwuyou_transfer"))) return Infinity;
- },
- },
- },
- },
- },
- dcyixian: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- skillAnimation: true,
- animationColor: "metal",
- chooseButton: {
- dialog(event, player) {
- const dialog = ui.create.dialog("义贤:你可以选择一项", "hidden");
- dialog.add([
- [
- ["field", "获得场上的所有装备牌"],
- ["discardPile", "获得弃牌堆中的所有装备牌"],
- ],
- "textbutton",
- ]);
- return dialog;
- },
- check(button) {
- const player = get.player();
- if (button.link == "field")
- return game
- .filterPlayer()
- .map(current => {
- const cards = current.getCards("e"),
- att = get.sgnAttitude(player, current);
- return cards
- .map(card => {
- return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player)) - get.value(card, current) * att;
- })
- .reduce((p, c) => p + c, 0);
- })
- .reduce((p, c) => p + c, 0);
- if (button.link == "discardPile")
- return Array.from(ui.discardPile.childNodes)
- .filter(card => {
- return get.type(card) === "equip";
- })
- .map(card => {
- return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player));
- })
- .reduce((p, c) => p + c, 0);
- return 0.1;
- },
- backup(links) {
- return {
- audio: "dcyixian",
- filterCard: () => false,
- selectCard: -1,
- pos: links[0],
- filterTarget: () => false,
- selectTarget: -1,
- skillAnimation: true,
- animationColor: "metal",
- async content(event, trigger, player) {
- player.awakenSkill("dcyixian");
- const position = lib.skill.dcyixian_backup.pos;
- let cards = [];
- if (position === "field") {
- cards.addArray(
- game
- .filterPlayer()
- .map(current => current.getCards("e"))
- .flat()
- );
- } else {
- cards.addArray(
- Array.from(ui.discardPile.childNodes).filter(card => {
- return get.type(card) === "equip";
- })
- );
- }
- if (!cards.length) return;
- await player.gain(cards, position === "field" ? "give" : "gain2");
- const pairs = game.filterPlayer().map(current => {
- let lostNum = 0;
- current.checkHistory("lose", evt => {
- if (evt.getParent(2) === event) lostNum += evt.cards2.length;
- });
- return [current, lostNum];
- });
- for (const pair of pairs) {
- const [target, num] = pair;
- if (!num) continue;
- const bool = await player
- .chooseBool(`是否令${get.translation(target)}摸${get.cnNumber(num)}张牌并回复1点体力?`)
- .set("choice", get.effect(target, { name: "draw" }, player, player) + get.recoverEffect(target, player, player) / 5 > 0)
- .forResultBool();
- if (bool) {
- player.line(target, "green");
- await target.draw(num);
- await target.recover();
- }
- if (!event.isMine() && !event.isOnline()) await game.asyncDelayx();
- }
- },
- };
- },
- prompt(links) {
- return `点击“确定”,从${links[0] === "field" ? "场上" : "弃牌堆中"}获得所有装备牌`;
- },
- },
- subSkill: {
- backup: {},
- },
- ai: {
- order: 10,
- threaten: 2.9,
- result: {
- player(player) {
- const enemies = game.filterPlayer(current => {
- return get.rawAttitude(player, current) < 0 && get.attitude(player, current) >= 0;
- }),
- knownEnemies = game.filterPlayer(current => {
- return get.attitude(player, current) < 0;
- });
- if ((!knownEnemies.length && player.countCards("e") > 1) || (player.getHp() > 3 && enemies.length > 0 && knownEnemies.length < 2 && knownEnemies.length < enemies.length && !knownEnemies.some(enemy => get.attitude(player, enemy) <= -9))) return 0;
- const val1 = game
- .filterPlayer()
- .map(current => {
- const cards = current.getCards("e"),
- att = get.sgnAttitude(player, current);
- return cards
- .map(card => {
- return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player)) - get.value(card, current) * att;
- })
- .reduce((p, c) => p + c, 0);
- })
- .reduce((p, c) => p + c, 0);
- const val2 = Array.from(ui.discardPile.childNodes)
- .filter(card => {
- return get.type(card) === "equip";
- })
- .map(card => {
- return Math.max(player.hasSkill("dcjuewu") ? 5 : 0, get.value(card, player));
- })
- .reduce((p, c) => p + c, 0);
- return Math.max(val1, val2) > 20 ? 4 : 0;
- },
- },
- },
- },
- //SP甄宓
- dcjijie: {
- audio: 2,
- trigger: {
- global: ["gainAfter", "loseAsyncAfter", "recoverAfter"],
- },
- getIndex(event, player) {
- if (event.name !== "loseAsync") return [[event.player]];
- return [
- game
- .filterPlayer(current => {
- return current !== player && _status.currentPhase !== current && event.getg(current).length > 0;
- })
- .sortBySeat(),
- ];
- },
- filter(event, player, triggername, targets) {
- if (player.getStorage("dcjijie_used").includes(event.name == "recover" ? "recover" : "draw")) return false;
- if (event.name === "recover") return targets[0] !== player && _status.currentPhase !== targets[0] && player.isDamaged();
- return targets.some(current => {
- return current !== player && _status.currentPhase !== current && event.getg(current).length > 0;
- });
- },
- forced: true,
- logTarget(event, player, triggername, targets) {
- return targets;
- },
- async content(event, trigger, player) {
- player.addTempSkill("dcjijie_used");
- if (trigger.name === "recover") {
- player.markAuto("dcjijie_used", ["recover"]);
- await player.recover(trigger.num);
- } else {
- const count = game.countPlayer(current => {
- if (current === player || _status.currentPhase === current) return 0;
- return trigger.getg(current).length;
- });
- player.markAuto("dcjijie_used", ["draw"]);
- await player.draw(count);
- }
- },
- subSkill: {
- used: {
- charlotte: true,
- onremove: true,
- },
- },
- },
- dchuiji: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: true,
- chooseButton: {
- dialog(event, player) {
- const name = get.translation(event.result.targets[0]);
- const dialog = ui.create.dialog(
- `惠济:请选择要令${name}执行的选项`,
- [
- [
- ["draw", "令其摸两张牌"],
- ["equip", "令其随机使用牌堆中的一张装备牌"],
- ],
- "textbutton",
- ],
- "hidden"
- );
- return dialog;
- },
- filter(button, player) {
- const target = get.event().getParent().result.targets[0];
- const link = button.link;
- if (button.link === "equip" && target.isMin()) return false;
- return true;
- },
- check(button) {
- const player = get.player(),
- target = get.event().getParent().result.targets[0];
- const link = button.link;
- const att = get.attitude(player, target) / 5;
- const hs = target.countCards("h");
- if (link === "draw") {
- return (2 - (hs + 2 > game.countPlayer()) * hs) * att;
- }
- return (1.1 - (hs > game.countPlayer()) * hs) * att;
- },
- backup(links) {
- return {
- audio: "dchuiji",
- target: get.event().result.targets[0],
- link: links[0],
- filterTarget(card, player, target) {
- return target === lib.skill.dchuiji_backup.target;
- },
- selectTarget: -1,
- async content(event, trigger, player) {
- const link = lib.skill.dchuiji_backup.link;
- const { target } = event;
- if (link === "draw") await target.draw(2);
- else {
- const card = get.cardPile2(card => {
- if (get.type(card) !== "equip") return false;
- return target.canUse(card, target) && !get.cardtag(card, "gifts");
- });
- if (card) await target.chooseUseTarget(card, true).set("nopopup", true);
- else {
- game.log("但是牌堆里没有", target, "的装备!");
- await game.asyncDelayx();
- }
- }
- if (target.countCards("h") < game.countPlayer()) return;
- player
- .when({ global: "wuguRemained" })
- .filter(evt => {
- return evt.getParent(3) === event;
- })
- .vars({ originalOwner: target })
- .then(() => {
- const remained = trigger.remained.filterInD("d");
- if (!remained.length) return event.finish();
- player.line(originalOwner);
- originalOwner.gain(remained, "gain2");
- });
- await target.chooseUseTarget(
- {
- name: "wugu",
- storage: {
- fixedShownCards: target.getCards("h"),
- },
- },
- true
- );
- },
- };
- },
- prompt(links) {
- return "点击“确定”以执行效果";
- },
- },
- subSkill: {
- backup: {},
- },
- ai: {
- order(item, player) {
- if (!game.hasPlayer(current => current !== player && get.attitude(player, current) > 0) && game.hasPlayer(current => get.attitude(player, current) <= 0)) return 10;
- if (
- game.hasPlayer(current => {
- const del = player.countCards("h") - current.countCards("h"),
- toFind = [2, 4].find(num => Math.abs(del) === num);
- if (toFind === 4 && del < 0 && get.attitude(player, current) <= 0) {
- return true;
- }
- return false;
- })
- )
- return 10;
- return 1;
- },
- result: {
- target(player, target) {
- const del = player.countCards("h") - target.countCards("h"),
- toFind = [2, 4].find(num => Math.abs(del) === num);
- if (toFind) {
- return (-del * (get.attitude(player, target) * Math.min(3, target.countCards("h"))) * toFind) / 10;
- }
- return -1;
- },
- },
- },
- },
- //曹芳
- dczhimin: {
- audio: 2,
- trigger: { global: "roundStart" },
- filter(event, player) {
- return game.hasPlayer(current => current != player && current.countCards("h")) && player.getHp() > 0;
- },
- forced: true,
- group: ["dczhimin_mark", "dczhimin_draw"],
- async content(event, trigger, player) {
- const targets = await player
- .chooseTarget(
- `置民:请选择至多${get.cnNumber(player.getHp())}名其他角色`,
- "你获得这些角色各自手牌中的随机一张点数最小的牌",
- (card, player, target) => {
- return target !== player && target.countCards("h");
- },
- [1, player.getHp()],
- true
- )
- .set("ai", target => {
- const player = get.player();
- return get.effect(target, { name: "shunshou_copy", position: "h" }, player, player) + 0.1;
- })
- .forResultTargets();
- if (!targets || !targets.length) return;
- targets.sortBySeat(trigger.player);
- player.line(targets, "thunder");
- const toGain = [];
- for (const target of targets) {
- const cards = target.getCards("h"),
- minNumber = cards.map(card => get.number(card)).sort((a, b) => a - b)[0];
- const gainableCards = cards
- .filter(card => {
- return get.number(card) === minNumber && lib.filter.canBeGained(card, player, target);
- })
- .randomSort();
- toGain.push(gainableCards[0]);
- }
- if (toGain.length) await player.gain(toGain, "giveAuto");
- await game.asyncDelayx();
- },
- ai: {
- threaten: 5.8,
- },
- mod: {
- aiOrder(player, card, num) {
- if (
- num > 0 &&
- get.itemtype(card) === "card" &&
- card.hasGaintag("dczhimin_tag") &&
- player.countCards("h", cardx => {
- return cardx.hasGaintag("dczhimin_tag") && cardx !== card;
- }) < player.maxHp
- )
- return num / 10;
- },
- },
- subSkill: {
- mark: {
- audio: "dczhimin",
- trigger: {
- player: "gainAfter",
- global: "loseAsyncAfter",
- },
- forced: true,
- filter(event, player) {
- if (_status.currentPhase === player || !event.getg(player).some(card => get.position(card) === "h" && get.owner(card) === player)) return false;
- return true;
- },
- async content(event, trigger, player) {
- player.addGaintag(
- trigger.getg(player).filter(card => get.position(card) === "h" && get.owner(card) === player),
- "dczhimin_tag"
- );
- },
- },
- draw: {
- audio: "dczhimin",
- trigger: {
- player: "loseAfter",
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- forced: true,
- filter(event, player) {
- const evt = event.getl(player);
- if (!evt.hs.length) return false;
- return Object.values(evt.gaintag_map).flat().includes("dczhimin_tag");
- },
- async content(event, trigger, player) {
- const count = player.maxHp - player.countCards("h");
- if (count <= 0) return;
- await player.draw(count);
- },
- },
- },
- },
- dcjujian: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- zhuSkill: true,
- filter(event, player) {
- return game.hasPlayer(current => {
- return player.hasZhuSkill("dcjujian", current) && current.group === "wei" && current !== player;
- });
- },
- filterTarget(_, player, target) {
- return player.hasZhuSkill("dcjujian", target) && target.group === "wei" && target !== player;
- },
- async content(event, trigger, player) {
- const target = event.targets[0];
- await target.draw();
- target.addTempSkill("dcjujian_forbid", "roundStart");
- target.markAuto("dcjujian_forbid", player);
- },
- ai: {
- result: {
- target(player, target) {
- const num = target.countCards("hs", card => {
- return get.type(card) == "trick" && target.canUse(card, player) && get.effect(player, card, target, player) < -2;
- }),
- att = get.attitude(player, target);
- if (att < 0) return -0.74 * num;
- return 1.5;
- },
- },
- },
- subSkill: {
- forbid: {
- audio: "dcjujian",
- trigger: {
- player: "useCardToBefore",
- },
- filter(event, player) {
- if (get.type(event.card) !== "trick") return false;
- return player.getStorage("dcjujian_forbid").includes(event.target);
- },
- forced: true,
- charlotte: true,
- onremove: true,
- direct: true,
- async content(event, trigger, player) {
- await trigger.target.logSkill("dcjujian_forbid", player);
- trigger.cancel();
- },
- intro: {
- content: "使用普通锦囊牌对$无效",
- },
- ai: {
- effect: {
- player(card, player, target, current) {
- if (get.type(card) == "trick" && player.getStorage("dcjujian_forbid").includes(target)) return "zeroplayertarget";
- },
- },
- },
- },
- },
- },
- //谋司马懿
- dcsbquanmou: {
- audio: 2,
- audioname: ["dc_sb_simayi_shadow"],
- zhuanhuanji: true,
- marktext: "☯",
- enable: "phaseUse",
- filter(event, player) {
- const selected = player.getStorage("dcsbquanmou_selected");
- return game.hasPlayer(current => !selected.includes(current) && player.inRange(current) && current.countCards("he") > 0);
- },
- filterTarget(card, player, target) {
- if (player === target) return false;
- const selected = player.getStorage("dcsbquanmou_selected");
- return !selected.includes(target) && player.inRange(target) && target.countCards("he") > 0;
- },
- prompt() {
- const player = get.player();
- if (player.storage.dcsbquanmou) return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。";
- return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。";
- },
- async content(event, trigger, player) {
- const target = event.targets[0];
- player.changeZhuanhuanji("dcsbquanmou");
- player.changeSkin("dcsbquanmou", "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : ""));
- player.markAuto("dcsbquanmou_selected", [target]);
- const cards = await target.chooseCard("he", true, `选择交给${get.translation(player)}一张牌`).forResultCards();
- if (cards && cards.length) {
- await target.give(cards, player);
- const key = `dcsbquanmou_${Boolean(!player.storage.dcsbquanmou)}`;
- player.addTempSkill(key, { global: ["phaseUseBefore", "phaseChange"] });
- player.markAuto(key, [target]);
- target.addAdditionalSkill(`${key}_${player.playerid}`, `${key}_mark`);
- }
- },
- ai: {
- order: 9,
- result: {
- player: function (player, target) {
- if (player.storage.dcsbquanmou) return 1;
- return 1 + game.countPlayer(i => player !== i && target !== i && !i.hasSkill("false_mark") && get.attitude(player, i) < 0);
- },
- target: function (player, target) {
- let res = target.hasSkillTag("noh") ? 0 : -1;
- if (player.storage.dcsbquanmou) return res + 0.6;
- return res;
- },
- },
- },
- onremove: true,
- mark: true,
- intro: {
- content: storage => {
- if (storage) return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。";
- return "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。当你于本阶段内下次对其造成伤害时,取消之。";
- },
- },
- group: "dcsbquanmou_change",
- subSkill: {
- change: {
- audio: "dcsbquanmou",
- audioname: ["dc_sb_simayi_shadow"],
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- filter(event, player) {
- return event.name != "phase" || game.phaseNumber == 0;
- },
- prompt2(event, player) {
- //无名杀先阳后阴,不要问为什么
- return "切换【权谋】为状态" + (player.storage.dcsbquanmou ? "阳" : "阴");
- },
- check: () => Math.random() > 0.5,
- content() {
- player.changeZhuanhuanji("dcsbquanmou");
- player.changeSkin("dcsbquanmou", "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : ""));
- },
- },
- true: {
- charlotte: true,
- audio: "dcsbquanmou",
- audioname: ["dc_sb_simayi_shadow"],
- trigger: { source: "damageSource" },
- forced: true,
- popup: false,
- filter(event, player) {
- return player.getStorage("dcsbquanmou_true").includes(event.player);
- },
- async content(event, trigger, player) {
- const target = trigger.player;
- player.getStorage("dcsbquanmou_true").remove(target);
- target.removeAdditionalSkill(`dcsbquanmou_true_${player.playerid}`);
- if (game.hasPlayer(current => current != player && current != target)) {
- const result = await player
- .chooseTarget([1, 3], `权谋:是否对${get.translation(target)}之外的至多三名其他角色各造成1点伤害?`, (card, player, target) => {
- return target != player && target != get.event().getTrigger().player;
- })
- .set("ai", target => {
- const player = get.player();
- return get.damageEffect(target, player, player);
- })
- .forResult();
- if (result.bool) {
- await player.logSkill("dcsbquanmou", result.targets);
- for (let i of result.targets) {
- if (i.isIn()) await i.damage();
- }
- }
- }
- },
- onremove(player, skill) {
- game.filterPlayer(current => {
- current.removeAdditionalSkill(`${skill}_${player.playerid}`);
- });
- delete player.storage[skill];
- delete player.storage.dcsbquanmou_selected;
- },
- },
- true_mark: {
- charlotte: true,
- mark: true,
- marktext: "讨",
- intro: {
- name: "权谋 - 阳",
- content: () => {
- return `当你下次受到${get.translation(_status.currentPhase)}造成的伤害后,其可以对除你之外的至多三名其他角色各造成1点伤害。`;
- },
- },
- ai: {
- threaten: 2.5,
- effect: {
- target(card, player, target) {
- if (get.tag(card, "damage") && player && player.hasSkill("dcsbquanmou_true")) {
- let tars = game.countPlayer(i => player !== i && target !== i && get.attitude(player, target) < 0 && !target.hasSkill("dcsbquanmou_false_mark"));
- return [1, 0, 1, (6 * Math.min(3, tars)) / (3 + Math.pow(target.countCards("h"), 2))];
- }
- },
- },
- },
- },
- false: {
- charlotte: true,
- audio: "dcsbquanmou",
- audioname: ["dc_sb_simayi_shadow"],
- trigger: { source: "damageBegin2" },
- forced: true,
- filter(event, player) {
- return player.getStorage("dcsbquanmou_false").includes(event.player);
- },
- async content(event, trigger, player) {
- const target = trigger.player;
- player.getStorage("dcsbquanmou_false").remove(target);
- target.removeAdditionalSkill(`dcsbquanmou_false_${player.playerid}`);
- trigger.cancel();
- },
- onremove(player, skill) {
- game.filterPlayer(current => {
- current.removeAdditionalSkill(`${skill}_${player.playerid}`);
- });
- delete player.storage[skill];
- delete player.storage.dcsbquanmou_selected;
- },
- },
- false_mark: {
- charlotte: true,
- mark: true,
- marktext: "抚",
- intro: {
- name: "权谋 - 阴",
- content: () => {
- return `当你下次受到${get.translation(_status.currentPhase)}造成的伤害时,防止此伤害。`;
- },
- },
- ai: {
- nodamage: true,
- nofire: true,
- nothunder: true,
- skillTagFilter(player, tag, arg) {
- return arg && arg.player && arg.player.hasSkill("dcsbquanmou_false");
- },
- effect: {
- target(card, player, target) {
- if (get.tag(card, "damage") && player && player.hasSkill("dcsbquanmou_false")) return "zeroplayertarget";
- },
- },
- },
- },
- },
- },
- dcsbpingliao: {
- audio: 2,
- audioname: ["dc_sb_simayi_shadow"],
- trigger: { player: "useCard" },
- forced: true,
- filter(event, player) {
- return event.card.name == "sha";
- },
- logTarget(event, player) {
- return game.filterPlayer(current => player.inRange(current));
- },
- async content(event, trigger, player) {
- const unrespondedTargets = [];
- const respondedTargets = [];
- let nonnonTargetResponded = false;
- const targets = game.filterPlayer().sortBySeat();
- const prompt = `###是否打出红色基本牌响应${get.translation(player)}?###${get.translation(player)}使用了一张不公开目标的${get.translation(trigger.card)}。若你选择响应且你不是此牌的隐藏目标,则其摸两张牌;若你选择不响应且你是此牌的隐藏目标,则你本回合内不能使用或打出手牌。`;
- for (let target of targets) {
- if (target.isIn() && player.inRange(target)) {
- const result = await target
- .chooseToRespond(prompt, (card, player) => {
- if (get.type(card) !== "basic") return false;
- const color = get.color(card);
- return color == "red" || color == "unsure";
- })
- .set("ai", card => {
- const player = get.player(),
- event = get.event();
- const source = event.getParent().player;
- //是队友且没有其他疑似队友的选手响应 那响应一下
- if (get.attitude(player, source) > 0) {
- if (
- !event.respondedTargets.some(current => {
- return get.attitude(player, current) > 0 || get.attitude(source, current) >= 0;
- })
- )
- return get.order(card);
- return -1;
- }
- //如果自己没有其他的闪桃就不响应
- else {
- const needsTao = player.hp <= 1;
- const shanAndTao = player.getCards("hs", card => {
- const name = get.name(card);
- return name == "shan" || (needsTao && name == "shan");
- });
- shanAndTao.remove(card);
- if (card.cards) shanAndTao.removeArray(card.cards);
- if (!shanAndTao.length) return 0;
- }
- return event.getRand("dcsbpingliao") > 1 / Math.max(1, player.hp) ? 0 : get.order(card);
- })
- .set("respondedTargets", respondedTargets)
- .forResult();
- if (result.bool) {
- respondedTargets.push(target);
- if (!trigger.targets.includes(target)) nonnonTargetResponded = true;
- await game.asyncDelay();
- } else if (trigger.targets.includes(target)) unrespondedTargets.push(target);
- }
- }
- unrespondedTargets.forEach(current => {
- current.addTempSkill("dcsbpingliao_blocker");
- game.log(current, "本回合内无法使用或打出手牌");
- });
- if (nonnonTargetResponded) {
- player.draw(2);
- player.addTempSkill("dcsbpingliao_buff", { global: "phaseChange" });
- player.addMark("dcsbpingliao_buff", 1, false);
- }
- },
- ai: {
- ignoreLogAI: true,
- skillTagFilter: function (player, tag, args) {
- if (args) {
- return args.card && get.name(args.card) == "sha";
- }
- },
- },
- group: "dcsbpingliao_hide",
- subSkill: {
- hide: {
- trigger: { player: "useCard0" },
- forced: true,
- filter(event, player) {
- return event.card.name == "sha";
- },
- async content(event, trigger, player) {
- trigger.hideTargets = true;
- game.log(player, "隐藏了", trigger.card, "的目标");
- },
- },
- buff: {
- onremove: true,
- charlotte: true,
- mod: {
- cardUsable(card, player, num) {
- if (card.name == "sha") return num + player.countMark("dcsbpingliao_buff");
- },
- },
- mark: true,
- intro: {
- content: "本阶段内使用【杀】的次数上限+#",
- },
- },
- blocker: {
- charlotte: true,
- mod: {
- cardEnabled2(card, player) {
- if (player.getCards("h").includes(card)) return false;
- },
- },
- mark: true,
- marktext: "封",
- intro: {
- content: "本回合内不能使用或打出手牌",
- },
- },
- },
- },
- //陈武董袭
- dcduanxie: {
- audio: "duanxie",
- inherit: "duanxie",
- selectTarget: 1,
- },
- //吕范
- diaodu: {
- audio: 2,
- trigger: { player: ["phaseUseBegin", "logSkill"] },
- filter(event, player) {
- if (event.name == "logSkill" && event.skill != "diancai") return false;
- return game.hasPlayer(target => {
- return get.distance(player, target) <= 1 && target.countGainableCards(player, "e");
- });
- },
- direct: true,
- async content(event, trigger, player) {
- const {
- result: { bool, targets },
- } = await player
- .chooseTarget(get.prompt2("diaodu"), (card, player, target) => {
- return get.distance(player, target) <= 1 && target.countGainableCards(player, "e");
- })
- .set("ai", target => {
- const player = get.event("player"),
- att = get.attitude(player, target);
- let num = 0;
- if (target.hasSkill("gzxiaoji")) num += 2.5;
- if (target.isDamaged() && target.getEquip("baiyin")) num += 2.5;
- if (target.hasSkill("xuanlve")) num += 2;
- return get.sgn(att) * num + (target == player ? 1 : 0);
- });
- if (bool) {
- const aim = targets[0];
- player.logSkill("diaodu", aim);
- const {
- result: { bool, cards },
- } = await player.gainPlayerCard(aim, "e", true);
- if (bool && game.hasPlayer(target => target != aim)) {
- const card = cards[0];
- const {
- result: { bool, targets },
- } = await player
- .chooseTarget(
- "调度:将" + get.translation(card) + "交给另一名角色",
- (card, player, target) => {
- return target != get.event("aim");
- },
- true
- )
- .set("ai", target => {
- const player = get.event("player");
- return get.attitude(player, target);
- })
- .set("aim", aim);
- if (bool && get.owner(card) == player) {
- const target = targets[0];
- player.line(target, "green");
- if (target != player) await player.give([card], target);
- if (get.owner(card) == target) {
- const {
- result: { bool },
- } = await target.chooseUseTarget(card);
- if (bool) await player.draw();
- else await target.draw();
- }
- }
- }
- }
- },
- },
- diancai: {
- audio: 2,
- inherit: "mbdiancai",
- filter(event, player) {
- if (_status.currentPhase === player) return false;
- let num = player
- .getHistory("lose", evt => {
- return evt.cards2 && evt.cards2.length && evt.getParent("phaseUse") == event;
- })
- .reduce((sum, evt) => {
- return sum + evt.cards2.length;
- }, 0);
- return num >= Math.min(5, player.getHp());
- },
- },
- //崔琰毛玠
- zhengbi: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- filter(event, player) {
- return game.hasPlayer(target => target != player);
- },
- direct: true,
- async content(event, trigger, player) {
- const {
- result: { bool, targets },
- } = await player.chooseTarget(get.prompt2("zhengbi"), lib.filter.notMe).set("ai", target => {
- const player = get.event("player");
- return -get.attitude(player, target) * target.countCards("he");
- });
- if (bool) {
- const target = targets[0],
- str = get.translation(target);
- player.logSkill("zhengbi", target);
- let choiceList = ["此阶段结束时,若" + str + "本阶段获得过牌,则你获得其手牌区和装备区各一张牌"];
- if (player.countCards("h", { type: "basic" })) choiceList.push("交给" + str + "一张基本牌,然后其交给你一张非基本牌或两张基本牌");
- const {
- result: { index },
- } = await player
- .chooseControl()
- .set("choiceList", choiceList)
- .set("ai", () => get.event("controls").length - 1);
- if (index == 0) {
- player.line(target);
- player
- .when("phaseUseEnd")
- .filter(evt => evt == trigger)
- .then(() => {
- if (target.isIn() && target.getHistory("gain", evt => evt.getParent("phaseUse") == trigger).length) {
- player.line(target);
- let num = (target.countGainableCards(player, "h") > 0) + (target.countGainableCards(player, "e") > 0);
- if (num) {
- player.gainPlayerCard(target, num, "he", true).set("filterButton", button => {
- return !ui.selected.buttons.some(but => get.position(button.link) == get.position(but.link));
- });
- }
- }
- })
- .vars({ target: target });
- } else {
- const {
- result: { bool },
- } = await player.chooseToGive(target, { type: "basic" }, true).set("prompt", "征辟:交给" + str + "一张基本牌");
- if (bool) {
- let choices = [];
- if (target.countCards("he", { type: ["trick", "delay", "equip"] })) choices.push("一张非基本牌");
- if (target.countCards("h", { type: "basic" }) > 1) choices.push("两张基本牌");
- if (choices.length) {
- const {
- result: { control },
- } = await target
- .chooseControl(choices)
- .set("ai", function (event, player) {
- if (choices.length > 1) {
- if (
- player.countCards("he", { type: ["trick", "delay", "equip"] }, function (card) {
- return get.value(card) < 7;
- })
- )
- return 0;
- return 1;
- }
- return 0;
- })
- .set("prompt", "征辟:交给" + get.translation(player) + "…");
- const check = control == "一张非基本牌";
- await target.chooseToGive("he", check ? 1 : 2, { type: check ? ["trick", "delay", "equip"] : "basic" }, player, true).set("prompt", "征辟:交给" + get.translation(player) + control);
- } else if (target.countCards("h")) await target.give(target.getCards("h"), player);
- }
- }
- }
- },
- },
- fengying: {
- unique: true,
- limited: true,
- audio: 2,
- enable: "phaseUse",
- filter(event, player) {
- return player.countCards("h") && player.countCards("h") == player.countDiscardableCards(player, "h");
- },
- skillAnimation: true,
- animationColor: "thunder",
- async content(event, trigger, player) {
- player.awakenSkill("fengying");
- await player.discard(player.getCards("h"));
- const evt = player.insertPhase();
- player
- .when("phaseBegin")
- .filter(evtx => evtx == evt)
- .then(() => {
- if (player.isMinHp() && player.maxHp > 0 && player.countCards("h") < player.maxHp) {
- player.drawTo(player.maxHp);
- }
- });
- },
- ai: {
- order: 0.0001,
- result: {
- player(player) {
- return player.isMinHp() ? 1 : 0;
- },
- },
- },
- },
- //胡遵
- dczhantao: {
- audio: 2,
- trigger: { global: "damageEnd" },
- filter(event, player) {
- if (!event.player.isIn() || (event.player !== player && !player.inRange(event.player))) return false;
- return event.source && event.source != player;
- },
- check(event, player) {
- if (!event.source.isIn() || !event.card || typeof get.number(event.card) !== "number") return 0;
- return get.effect(event.source, { name: "sha" }, player, player) >= 0;
- },
- logTarget: "player",
- async content(event, trigger, player) {
- player
- .judge(card => {
- const evt = get.event().getParent(get.event("eventName")).getTrigger();
- if (!evt.source || !evt.source.isIn() || !evt.card || typeof get.number(evt.card) !== "number") return 0;
- if (get.number(card) > get.number(evt.card)) return 1.5;
- return 0;
- })
- .set("judge2", r => r.bool)
- .set("callback", () => {
- const evtx = event.getParent();
- const evt = event.getParent(evtx.eventName).getTrigger();
- if (!evt.source || !evt.source.isIn() || !evt.card || typeof get.number(evt.card) !== "number") return;
- if (event.judgeResult.number > get.number(evt.card)) {
- const sha = new lib.element.VCard({ name: "sha" }),
- target = evt.source;
- if (player.canUse(sha, target, false, false)) {
- player.useCard(sha, target, false);
- }
- }
- })
- .set("eventName", event.name);
- },
- },
- dcanjing: {
- audio: 2,
- trigger: { source: "damageSource" },
- filter(event, player) {
- return game.hasPlayer(current => current.isDamaged());
- },
- usable: 1,
- direct: true,
- async content(event, trigger, player) {
- const maxCount = player.getAllHistory("useSkill", evt => evt.skill === "dcanjing").length + 1;
- const result = await player
- .chooseTarget(get.prompt2("dcanjing"), (card, player, target) => target.isDamaged(), [1, maxCount])
- .set("ai", target => {
- return get.attitude(get.player(), target) > 0;
- })
- .forResult();
- if (!result.bool) return player.storage.counttrigger.dcanjing--;
- const targets = result.targets.slice();
- targets.sortBySeat(_status.currentPhase);
- player.logSkill("dcanjing", targets);
- for (const target of targets) await target.draw();
- const minHp = targets.map(i => i.getHp()).sort((a, b) => a - b)[0];
- await game.asyncDelayx();
- for (const target of targets) {
- if (!target.isIn()) continue;
- if (target.getHp() === minHp) await target.recover();
- }
- },
- },
- //诸葛梦雪
- dcjichun: {
- audio: 2,
- enable: "phaseUse",
- filter(event, player) {
- return player.countCards("he", card => lib.skill.dcjichun.filterCard(card, player));
- },
- filterCard(card, player) {
- if (!get.cardNameLength(card) || ui.selected.cards.length) return false;
- if (
- game.hasPlayer(target => {
- return target.countCards("h") < player.countCards("h");
- })
- )
- return true;
- if (
- lib.filter.cardDiscardable(card, player) &&
- game.hasPlayer(target => {
- return target.countCards("h") > player.countCards("h") && target.countDiscardableCards(player, "hej");
- })
- )
- return true;
- return false;
- },
- selectCard: [1, 2],
- filterTarget(cardx, player, target) {
- if (!ui.selected.cards.length) return false;
- const card = ui.selected.cards[0];
- if (target.countCards("h") < player.countCards("h")) return true;
- if (lib.filter.cardDiscardable(card, player) && target.countCards("h") > player.countCards("h") && target.countDiscardableCards(player, "hej")) return true;
- return false;
- },
- usable: 1,
- position: "he",
- check(card) {
- return get.cardNameLength(card);
- },
- complexCard: true,
- complexSelect: true,
- lose: false,
- discard: false,
- delay: false,
- targetprompt() {
- const target = ui.selected.targets[0],
- player = get.event("player");
- return target.countCards("h") < player.countCards("h") ? "给牌摸牌" : "双双弃牌";
- },
- async content(event, trigger, player) {
- const card = event.cards[0],
- target = event.target;
- const num = get.cardNameLength(card);
- await player.showCards([card], get.translation(player) + "发动了【寄春】");
- if (target.countCards("h") < player.countCards("h")) {
- await player.give(card, target);
- await player.draw(num);
- } else {
- await player.discard(card);
- await player.discardPlayerCard(target, "hej", [1, num]);
- }
- },
- ai: {
- order: 7,
- result: {
- target(player, target) {
- return target.countCards("h") < player.countCards("h") ? get.attitude(player, target) : -get.effect(target, { name: "guohe" }, player, player);
- },
- },
- },
- },
- dchanying: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- frequent: true,
- async content(event, trigger, player) {
- const card = get.cardPile(card => get.type(card) == "equip" && !get.cardtag(card, "gifts"));
- if (!card) {
- player.chat("无牌可得?!");
- game.log("但是牌堆已经没有装备牌了!");
- return;
- }
- await player.showCards([card], get.translation(player) + "发动了【寒英】");
- if (game.hasPlayer(target => target.countCards("h") == player.countCards("h") && target.hasUseTarget(card))) {
- const {
- result: { bool, targets },
- } = await player
- .chooseTarget(
- "请选择使用" + get.translation(card) + "的目标角色",
- (card, player, target) => {
- return target.countCards("h") == player.countCards("h") && target.hasUseTarget(get.event("card"));
- },
- true
- )
- .set("ai", target => get.effect(target, get.event("card"), target, get.event("player")))
- .set("card", card);
- if (bool) {
- const target = targets[0];
- player.line(target);
- target.chooseUseTarget(card, true, "nopopup");
- }
- } else {
- player.chat("无人可装?!");
- game.log("但是场上没有角色可以使用", card, "!");
- }
- },
- },
- //柏灵筠
- dclinghui: {
- audio: 2,
- trigger: { global: "phaseJieshuBegin" },
- filter(event, player) {
- if (_status.currentPhase === player) return true;
- return game.getGlobalHistory("everything", evt => evt.name == "dying").length;
- },
- frequent: true,
- async content(event, trigger, player) {
- let cards = get.cards(3);
- await game.cardsGotoOrdering(cards);
- const {
- result: { bool, links },
- } = await player
- .chooseButton(["灵慧:是否使用其中的一张牌并随机获得其中一张剩余牌?", cards])
- .set("filterButton", button => {
- return get.player().hasUseTarget(button.link);
- })
- .set("ai", button => {
- return get.event("player").getUseValue(button.link);
- });
- if (bool) {
- const card = links[0];
- cards.remove(card);
- player.$gain2(card, false);
- await game.asyncDelayx();
- await player.chooseUseTarget(true, card, false);
- cards = cards.filterInD();
- if (cards.length) {
- const cardx = cards.randomRemove();
- await player.gain(cardx, "gain2");
- }
- }
- if (cards.length) {
- cards.reverse();
- game.cardsGotoPile(cards.filterInD(), "insert");
- game.log(player, "将", get.cnNumber(cards.length), "张牌置于了牌堆顶");
- }
- },
- },
- dcxiace: {
- audio: 2,
- trigger: {
- player: "damageEnd",
- source: "damageSource",
- },
- filter(event, player) {
- const bool1 = event.player == player && !player.hasHistory("custom", evt => evt.dcxiace == "player") && game.hasPlayer(target => target != player && !target.hasSkill("fengyin"));
- const bool2 =
- event.source &&
- event.source == player &&
- !player.hasHistory("custom", evt => evt.dcxiace == "source") &&
- player.isDamaged() &&
- player.countCards("he", card => {
- if (_status.connectMode && get.position(card) == "h") return true;
- return lib.filter.cardDiscardable(card, player);
- });
- return bool1 || bool2;
- },
- direct: true,
- async content(event, trigger, player) {
- if (trigger.player == player && !player.hasHistory("custom", evt => evt.dcxiace == "player") && game.hasPlayer(target => target != player && !target.hasSkill("fengyin"))) {
- const {
- result: { bool, targets },
- } = await player
- .chooseTarget((card, player, target) => {
- return target != player && !target.hasSkill("fengyin");
- })
- .set("prompt", get.prompt("dcxiace"))
- .set("prompt2", "令一名其他角色的非锁定技于本回合失效")
- .set("ai", target => {
- const player = get.event("player");
- return (
- -get.sgn(get.attitude(player, target)) *
- (target.getSkills(null, false, false).filter(skill => {
- return !get.is.locked(skill);
- }).length +
- 1) *
- (target === _status.currentPhase ? 10 : 1)
- );
- });
- if (bool) {
- const target = targets[0];
- player.logSkill("dcxiace", target);
- player.getHistory("custom").push({ dcxiace: "player" });
- target.addTempSkill("fengyin");
- }
- }
- if (
- trigger.source &&
- trigger.source == player &&
- !player.hasHistory("custom", evt => evt.dcxiace == "source") &&
- player.isDamaged() &&
- player.countCards("he", card => {
- if (_status.connectMode && get.position(card) == "h") return true;
- return lib.filter.cardDiscardable(card, player);
- }) &&
- player.hasSkill("dcxiace")
- ) {
- const {
- result: { bool },
- } = await player
- .chooseToDiscard("he", get.prompt("dcxiace"), "弃置一张牌并回复1点体力")
- .set("ai", card => {
- const player = get.event("player");
- if (get.recoverEffect(player, player, player) <= 0) return 0;
- return 7 - get.value(card);
- })
- .set("logSkill", "dcxiace");
- if (bool) {
- player.getHistory("custom").push({ dcxiace: "source" });
- await player.recover();
- }
- }
- },
- },
- dcyuxin: {
- unique: true,
- limited: true,
- audio: 2,
- trigger: { global: "dying" },
- filter(event, player) {
- return event.player.hp < (event.player == player ? 1 : player.getHp());
- },
- prompt2(event, player) {
- return "令其将体力值回复至" + (event.player == player ? 1 : player.getHp()) + "点";
- },
- check(event, player) {
- if (get.recoverEffect(event.player, player, player) <= 0) return false;
- return lib.skill.luanfeng.check(event, player);
- },
- logTarget: "player",
- skillAnimation: true,
- animationColor: "thunder",
- async content(event, trigger, player) {
- player.awakenSkill("dcyuxin");
- trigger.player.recover((trigger.player == player ? 1 : player.getHp()) - trigger.player.hp);
- },
- },
- //清河公主
- dczhangji: {
- audio: 2,
- trigger: { global: "useCard" },
- filter: function (event, player) {
- return event.targets && event.targets.length > 1 && event.targets.includes(player);
- },
- forced: true,
- logTarget: "player",
- content: function* (event, map) {
- const player = map.player,
- trigger = map.trigger,
- target = trigger.player;
- let targets = trigger.targets.slice();
- targets.sortBySeat(_status.currentPhase || target);
- targets.remove(player);
- player
- .when({ global: "useCardToTargeted" })
- .filter(evt => targets.length && evt.getParent() == trigger && evt.targets.length == evt.getParent().triggeredTargets4.length)
- .then(() => {
- trigger.getParent().targets = [player].concat(targets);
- trigger.getParent().triggeredTargets4 = [player].concat(targets);
- })
- .vars({ targets: targets });
- player
- .when({ target: ["useCardToEnd", "useCardToExcluded"] })
- .filter(evt => targets.length && evt.getParent() == trigger)
- .then(() => {
- player.draw(targets.length);
- })
- .vars({ targets: targets });
- },
- },
- dczengou: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return player.maxHp > 0 && player.countCards("he") > 0;
- },
- filterCard: true,
- selectCard: () => [1, _status.event.player.maxHp],
- position: "he",
- filterTarget: lib.filter.notMe,
- discard: false,
- lose: false,
- delay: false,
- usable: 1,
- check: function (card) {
- if (card.name == "tao" || card.name == "jiu") return 0;
- return 1 / (get.value(card) || 0.5);
- },
- content: function* (event, map) {
- const player = map.player,
- cards = event.cards,
- target = event.target;
- yield player.give(cards, target).gaintag.add("dczengou_debuff");
- yield player.draw(cards.length);
- target.addSkill("dczengou_debuff");
- },
- ai: {
- order: 10,
- result: { target: -1 },
- },
- subSkill: {
- debuff: {
- charlotte: true,
- mark: true,
- intro: {
- content: "下次体力值增加或使用牌结算完毕后展示所有手牌,然后失去手牌中“谮构”牌数的体力值",
- },
- trigger: { player: ["changeHp", "useCardAfter"] },
- filter: function (event, player) {
- return event.name == "useCard" || event.num > 0;
- },
- forced: true,
- popup: false,
- content: function () {
- player.removeSkill("dczengou_debuff");
- const cards = player.getCards("h", card => card.hasGaintag("dczengou_debuff"));
- player.showHandcards();
- if (cards.length) player.loseHp(cards.length);
- },
- mod: {
- aiValue: function (player, card, num) {
- if (get.itemtype(card) == "card" && card.hasGaintag("dczengou_debuff")) return -1;
- },
- aiUseful: function () {
- return lib.skill.dczengou.subSkill.debuff.mod.aiValue.apply(this, arguments);
- },
- aiOrder: function (player, card, num) {
- if (get.itemtype(card) == "card" && card.hasGaintag("dczengou_debuff")) {
- const cards = player.getCards("h", card => card.hasGaintag("dczengou_debuff"));
- if (cards.length == 1) return num + 10;
- return 0;
- }
- },
- },
- },
- },
- },
- //曹宪
- dclingxi: {
- audio: 2,
- trigger: { player: ["phaseUseBegin", "phaseUseEnd"] },
- filter: function (event, player) {
- return player.countCards("he") && player.maxHp > 0;
- },
- direct: true,
- content: function* (event, map) {
- var player = map.player,
- num = player.maxHp;
- var result = yield player
- .chooseCard(get.prompt("dclingxi"), "将至多" + get.cnNumber(num) + "张牌称为“翼”置于武将牌上", "he", [1, num])
- .set("ai", card => {
- let player = _status.event.player,
- dis = player.needsToDiscard(0, (i, player) => {
- return !player.canIgnoreHandcard(i) && !ui.selected.cards.includes(i);
- }),
- cards = ui.selected.cards.concat(player.getExpansions("dclingxi")),
- suit = get.suit(card, false);
- if (_status.event.suits.length < 4) _status.event.suits.add(get.suit(ui.selected.cards.at(-1), false));
- if (_status.event.triggerName === "phaseUseEnd") {
- if (_status.event.suits.includes(suit)) return (dis ? 10 : 3) - get.useful(card);
- return (dis ? 6 : 1) - get.useful(card);
- }
- _status.event.hvt.remove(ui.selected.cards.at(-1));
- if (_status.event.hvt.length === 1 && card === _status.event.hvt[0]) return 0;
- let temp;
- if (
- !cards.some(i => {
- temp = get.suit(i, false);
- return cards.some(j => {
- return i !== j && suit === get.suit(j, false);
- });
- }) &&
- suit === temp
- )
- return 15 - get.value(card);
- if (!_status.event.hvt.length) {
- if (_status.event.suits.includes(suit)) return (dis ? 10 : 3) - get.useful(card);
- return (dis ? 6 : 1) - get.useful(card);
- }
- if (_status.event.hvt.includes(card)) {
- if (!_status.event.suits.includes(suit)) return 6 - get.value(card);
- if (card.name === "sha") return 3 - get.value(card);
- return 1 - get.value(card);
- }
- return 15 - get.value(card);
- })
- .set("complexCard", true)
- .set(
- "hvt",
- player.getCards("hs", card => {
- return card.name === "zhuge" || player.hasValueTarget(card, null, true);
- })
- )
- .set(
- "suits",
- (() => {
- let suits = [];
- player.getExpansions("dclingxi").forEach(i => {
- suits.add(get.suit(i, false));
- });
- return suits;
- })()
- )
- .set("triggerName", event.triggername);
- if (result.bool) {
- player.logSkill("dclingxi");
- player.addToExpansion(result.cards, player, "give").gaintag.add("dclingxi");
- }
- },
- marktext: "翼",
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- group: "dclingxi_effect",
- subSkill: {
- effect: {
- audio: "dclingxi",
- trigger: {
- player: "loseAfter",
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter"],
- },
- filter: function (event, player) {
- var num = 2 * player.getExpansions("dclingxi").reduce((list, card) => list.add(get.suit(card, false)), []).length;
- num -= player.countCards("h");
- if (!num) return false;
- if (event.name == "lose" && event.getlx !== false) {
- for (var i in event.gaintag_map) {
- if (event.gaintag_map[i].includes("dclingxi")) return true;
- }
- return false;
- }
- return game.getGlobalHistory("cardMove", function (evt) {
- if (evt.name != "lose" || event != evt.getParent()) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("dclingxi") && evt.player == player) return true;
- }
- return false;
- }).length;
- },
- forced: true,
- locked: false,
- content: function () {
- var num = 2 * player.getExpansions("dclingxi").reduce((list, card) => list.add(get.suit(card, false)), []).length;
- num -= player.countCards("h");
- if (num > 0) player.draw(num);
- else player.chooseToDiscard("h", -num, true);
- },
- },
- },
- ai: {
- combo: "dczhifou",
- },
- },
- dczhifou: {
- audio: 2,
- trigger: { player: "useCardAfter" },
- filter: function (event, player) {
- var num = player.getHistory("useSkill", evt => evt.skill == "dczhifou").length + 1;
- return player.getExpansions("dclingxi").length >= num;
- },
- direct: true,
- content: function* (event, map) {
- var player = map.player,
- cards = player.getExpansions("dclingxi");
- var num = player.getHistory("useSkill", evt => evt.skill == "dczhifou").length + 1;
- var result = yield player
- .chooseButton(["###" + get.prompt("dczhifou") + "###移去至少" + get.cnNumber(num) + "张武将牌上的“翼”", cards], [num, cards.length])
- .set("ai", button => {
- if (!_status.event.res.bool) return 0;
- if (_status.event.res.cards.includes(button.link)) return 1;
- return 0;
- })
- .set("num", num)
- .set(
- "res",
- (() => {
- if (
- player.isPhaseUsing() &&
- player.hasCard(i => {
- return player.hasValueTarget(i, null, true);
- }, "h")
- )
- return false;
- let suits = [],
- cs = player.getExpansions("dclingxi"),
- cards = [],
- temp = num;
- for (let i = 0; i < cs.length; i++) {
- if (!temp) break;
- let suit = get.suit(cs[i], false);
- if (suits.includes(suit)) {
- cards.push(cs.splice(i--, 1)[0]);
- temp--;
- } else suits.push(suit);
- }
- while (temp > 0) {
- cards.push(cs.pop());
- temp--;
- }
- temp = suits.length * 2 - player.countCards("h");
- if (temp > 0 || (!temp && num < Math.max(2, 5 - player.hp))) cs = true;
- else cs = false;
- return {
- bool: cs,
- cards: cards,
- };
- })()
- );
- if (result.bool) {
- player.logSkill("dczhifou");
- player.loseToDiscardpile(result.links);
- var list = [],
- choiceList = ["将一张牌称为“翼”置于你的武将牌上", "弃置两张牌", "失去1点体力"];
- if (!player.hasSkill("dczhifou_0") && game.hasPlayer(target => target.countCards("he"))) list.push("置入“翼”");
- else choiceList[0] = '' + choiceList[0] + "";
- if (
- !player.hasSkill("dczhifou_1") &&
- game.hasPlayer(target => {
- return target == player ? target.countDiscardableCards(target, "he") : target.countCards("he");
- })
- )
- list.push("弃置卡牌");
- else choiceList[1] = '' + choiceList[1] + "";
- if (!player.hasSkill("dczhifou_2")) list.push("失去体力");
- else choiceList[2] = '' + choiceList[2] + "";
- if (!list.length) return;
- var str = "";
- for (var i of list) {
- str += i;
- str += "、";
- }
- str = str.slice(0, -1);
- var result2 = yield player
- .chooseTarget(
- "知否:令一名角色执行以下一项",
- str,
- (card, player, target) => {
- if (!player.hasSkill("dczhifou_2")) return true;
- if (!player.hasSkill("dczhifou_0") && target.countCards("he")) return true;
- return target == player ? target.countDiscardableCards(target, "he") : target.countCards("he");
- },
- true
- )
- .set("ai", target => {
- var player = _status.event.player,
- list = [];
- if (!player.hasSkill("dczhifou_0")) list.push(get.effect(target, { name: "guohe_copy2" }, target, player) / 2);
- if (!player.hasSkill("dczhifou_1")) list.push(get.effect(target, { name: "guohe_copy2" }, target, player));
- if (!player.hasSkill("dczhifou_2")) list.push(get.effect(target, { name: "losehp" }, player, player));
- return list.sort((a, b) => b - a)[0];
- });
- if (result2.bool) {
- var target = result2.targets[0];
- player.line(target);
- list = list.filter(control => {
- if (control == "失去体力") return true;
- if (control == "置入“翼”" && target.countCards("he")) return true;
- return target.countDiscardableCards(target, "he");
- });
- var result3;
- if (!list.length) {
- game.log(target, "没有可执行项");
- return;
- } else if (list.length == 1) result3 = { control: list[0] };
- else
- result3 = yield player
- .chooseControl(list)
- .set("prompt", "知否:请选择一项")
- .set(
- "choiceList",
- choiceList.map(str => "令" + get.translation(target) + str)
- )
- .set("ai", () => {
- var player = _status.event.player;
- var target = _status.event.target;
- var getNum = function (control) {
- return [get.effect(target, { name: "guohe_copy2" }, target, player) / 2, get.effect(target, { name: "guohe_copy2" }, target, player), get.effect(target, { name: "losehp" }, target, player)][["置入“翼”", "弃置卡牌", "失去体力"].indexOf(control)];
- };
- var controls = _status.event.controls.slice();
- return controls.sort((a, b) => getNum(b) - getNum(a))[0];
- })
- .set("target", target);
- switch (result3.control) {
- case "置入“翼”":
- player.addTempSkill("dczhifou_0");
- var result4 = yield target.chooseCard("he", choiceList[0], true);
- if (result4.bool) player.addToExpansion(result4.cards, target, "give").gaintag.add("dclingxi");
- break;
- case "弃置卡牌":
- player.addTempSkill("dczhifou_1");
- target.chooseToDiscard("he", 2, true);
- break;
- case "失去体力":
- player.addTempSkill("dczhifou_2");
- target.loseHp();
- break;
- }
- }
- }
- },
- subSkill: {
- 0: { charlotte: true },
- 1: { charlotte: true },
- 2: { charlotte: true },
- },
- ai: {
- combo: "dclingxi",
- },
- },
- //周瑜
- //无 双 万 军 取 首
- dcsbronghuo: {
- audio: 2,
- audioname: ["dc_sb_zhouyu_shadow"],
- trigger: { player: "useCard1" },
- filter: function (event, player) {
- return (event.card.name == "sha" && game.hasNature(event.card, "fire")) || event.card.name == "huogong";
- },
- forced: true,
- content: function () {
- trigger.baseDamage = game.countGroup();
- },
- ai: { threaten: 3.5 },
- },
- dcsbyingmou: {
- mark: true,
- marktext: "☯",
- zhuanhuanji: true,
- intro: {
- content: function (storage) {
- if (!storage) return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】。";
- return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。";
- },
- },
- audio: 2,
- audioname: ["dc_sb_zhouyu_shadow"],
- trigger: { player: "useCardToPlayered" },
- filter: function (event, player) {
- return event.isFirstTarget && event.targets.some(target => target != player);
- },
- usable: 1,
- direct: true,
- content: function* (event, map) {
- var result,
- player = map.player,
- targets = map.trigger.targets;
- var storage = player.storage.dcsbyingmou;
- if (storage) {
- result = yield player
- .chooseCardTarget({
- prompt: get.prompt("dcsbyingmou"),
- prompt2: "选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)",
- filterTarget: function (card, player, target) {
- if (!ui.selected.targets.length) return _status.event.targets.includes(target);
- return target.isMaxHandcard();
- },
- selectTarget: 2,
- complexSelect: true,
- complexTarget: true,
- multitarget: true,
- targetprompt: ["目标角色", "使用角色"],
- filterCard: () => false,
- selectCard: -1,
- ai2: function (target) {
- var player = _status.event.player;
- var getNum = function (player, target, source) {
- return player
- .getCards("h", card => {
- if (get.name(card) != "sha" && (get.type(card) != "trick" || !get.tag(card, "damage"))) return false;
- return player.canUse(card, target, false);
- })
- .reduce((sum, card) => sum + get.effect(target, card, player, source), 0);
- };
- if (!ui.selected.targets.length) {
- var targets = game.filterPlayer(target => target.isMaxHandcard());
- targets.sort((a, b) => getNum(b, target, player) - getNum(a, target, player));
- return getNum(targets[0], target, player) + 1;
- }
- return getNum(target, ui.selected.targets[0], player) + 1;
- },
- })
- .set("targets", targets);
- } else
- result = yield player
- .chooseTarget(get.prompt("dcsbyingmou"), "选择一名目标角色,将手牌数摸至与其相同,然后视为对其使用一张【火攻】", (card, player, target) => _status.event.targets.includes(target))
- .set("ai", target => {
- var player = _status.event.player;
- return Math.max(0, Math.min(5, target.countCards("h") - player.countCards("h"))) * 2 + get.effect(target, { name: "huogong" }, player, player);
- })
- .set("targets", targets);
- if (result.bool) {
- var target = result.targets[0];
- if (storage) {
- yield player.logSkill("dcsbyingmou", result.targets, false);
- player.line2(result.targets);
- player.changeZhuanhuanji("dcsbyingmou");
- player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : ""));
- var source = result.targets[1],
- discard = true;
- while (true) {
- var cards = source.getCards("h", card => {
- if (get.name(card) != "sha" && (get.type(card) != "trick" || !get.tag(card, "damage"))) return false;
- return source.canUse(card, target, false);
- });
- if (cards.length) {
- if (discard) discard = false;
- yield source.useCard(cards.randomGet(), target, false);
- } else break;
- }
- if (discard && player.countCards("h") < source.countCards("h")) source.chooseToDiscard(source.countCards("h") - player.countCards("h"), "h", true);
- } else {
- yield player.logSkill("dcsbyingmou", target);
- player.changeZhuanhuanji("dcsbyingmou");
- player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : ""));
- if (player.countCards("h") < target.countCards("h")) player.draw(Math.min(5, target.countCards("h") - player.countCards("h")));
- if (player.canUse({ name: "huogong" }, target, false)) player.useCard({ name: "huogong" }, target, false);
- }
- } else player.storage.counttrigger.dcsbyingmou--;
- },
- group: "dcsbyingmou_change",
- subSkill: {
- change: {
- audio: "dcsbyingmou",
- audioname: ["dc_sb_zhouyu_shadow"],
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- filter(event, player) {
- return event.name != "phase" || game.phaseNumber == 0;
- },
- prompt2(event, player) {
- //无名杀先阳后阴,不要问为什么
- return "切换【英谋】为状态" + (player.storage.dcsbyingmou ? "阳" : "阴");
- },
- check: () => Math.random() > 0.5,
- content() {
- player.changeZhuanhuanji("dcsbyingmou");
- player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : ""));
- },
- },
- },
- },
- //鲁肃
- dcsbmingshi: {
- audio: 2,
- audioname: ["dc_sb_lusu_shadow"],
- trigger: { player: "phaseDrawBegin2" },
- filter: function (event, player) {
- return !event.numFixed;
- },
- frequent: true,
- content: function () {
- trigger.num += 2;
- player
- .when("phaseDrawEnd")
- .filter((evt, player) => evt == trigger && player.countCards("h"))
- .then(() => {
- var str = "明势:请展示三张牌并令一名其他角色选择获得其中的一张牌";
- if (player.countCards("h") <= 3) str = "明势:展示手牌并令一名其他角色选择获得其中的一张牌";
- player.chooseCardTarget({
- prompt: str,
- filterTarget: lib.filter.notMe,
- filterCard: true,
- selectCard: function () {
- var player = _status.event.player;
- if (player.countCards("h") <= 3) return -1;
- return 3;
- },
- position: "h",
- forced: true,
- ai1: function (card) {
- return -get.value(card);
- },
- ai2: function (target) {
- var player = _status.event.player;
- if (player.hasSkill("dcsbmengmou") && !get.is.blocked("dcsbmengmou", player) && player.storage.dcsbmengmou && get.attitude(player, target) < 0) return get.effect(target, { name: "losehp" }, player, player);
- return get.attitude(player, target);
- },
- });
- })
- .then(() => {
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- var cards = result.cards;
- player.showCards(cards, get.translation(player) + "发动了【明势】");
- target
- .chooseButton(["明势:请获得其中一张牌", cards], true)
- .set("filterButton", button => {
- return lib.filter.canBeGained(button.link, _status.event.source, _status.event.player);
- })
- .set("ai", button => get.value(button.link))
- .set("source", player);
- } else event.finish();
- })
- .then(() => {
- if (result.bool) {
- var card = result.links[0];
- if (lib.filter.canBeGained(card, player, target)) target.gain(card, player, "giveAuto");
- else game.log("但", card, "不能被", player, "获得!");
- }
- });
- },
- },
- dcsbmengmou: {
- mark: true,
- marktext: "☯",
- zhuanhuanji: true,
- intro: {
- content: function (storage) {
- if (!storage) return "每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力。(X为你的体力上限)";
- return "每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)";
- },
- },
- audio: 2,
- audioname: ["dc_sb_lusu_shadow"],
- trigger: { global: ["gainAfter", "loseAsyncAfter"] },
- filter: function (event, player) {
- if (typeof player.maxHp != "number" || player.maxHp <= 0) return false;
- if (event.name == "loseAsync" && event.type != "gain") return false;
- if (player.hasSkill("dcsbmengmou_true") && player.hasSkill("dcsbmengmou_false")) return false;
- var cards1 = event.getl(player).cards2,
- cards2 = event.getg(player);
- return (
- game.hasPlayer(function (current) {
- if (current == player) return false;
- var cardsx = event.getg(current);
- return cardsx.some(i => cards1.includes(i));
- }) ||
- game.hasPlayer(function (current) {
- if (current == player) return false;
- var cardsx = event.getl(current).cards2;
- return cards2.some(i => cardsx.includes(i));
- })
- );
- },
- direct: true,
- content: function* (event, map) {
- var player = map.player,
- trigger = map.trigger;
- var storage = player.storage.dcsbmengmou;
- player.addTempSkill("dcsbmengmou_effect", "dcsbmengmouAfter");
- var targets = [],
- num = player.maxHp;
- var cards1 = trigger.getl(player).cards2;
- var cards2 = trigger.getg(player);
- targets.addArray(
- game.filterPlayer(function (current) {
- if (current == player) return false;
- var cardsx = trigger.getg(current);
- return cardsx.some(i => cards1.includes(i));
- })
- );
- targets.addArray(
- game.filterPlayer(function (current) {
- if (current == player) return false;
- var cardsx = trigger.getl(current).cards2;
- return cards2.some(i => cardsx.includes(i));
- })
- );
- targets.sortBySeat();
- var check_true = function (player, target) {
- if (get.attitude(player, target) > 0) {
- if (
- target.countCards("hs", card => {
- if (get.name(card) != "sha") return false;
- return target.hasValueTarget(card);
- })
- )
- return 4;
- return 0.5;
- }
- if (get.attitude(player, target) < 0) {
- if (
- !target.countCards("hs", card => {
- if (get.name(card) != "sha") return false;
- return target.hasValueTarget(card);
- })
- ) {
- if (
- target.countCards("hs", card => {
- if (get.name(card) != "sha") return false;
- return target.hasUseTarget(card);
- })
- )
- return -3;
- return -1;
- }
- return 0;
- }
- return 0;
- };
- var check_false = function (player, target) {
- if (get.attitude(player, target) < 0) return get.effect(target, { name: "losehp" }, player, player);
- return 0;
- };
- var result, target;
- if (targets.length == 1) {
- target = targets[0];
- var str;
- if (storage) str = "令" + get.translation(target) + "打出至多" + get.cnNumber(num) + "张【杀】,然后其失去Y点体力。(Y为" + num + "-其打出【杀】数)";
- else str = "令" + get.translation(target) + "使用至多" + get.cnNumber(num) + "张【杀】,其每以此法造成1点伤害,其回复1点体力";
- result = yield player.chooseBool(get.prompt("dcsbmengmou", target), str).set("choice", (storage ? check_false(player, target) : check_true(player, target)) > 0);
- } else {
- result = yield player
- .chooseTarget(get.prompt("dcsbmengmou"), lib.skill.dcsbmengmou.intro.content(storage), (card, player, target) => _status.event.targets.includes(target))
- .set("ai", target => {
- return _status.event.check(_status.event.player, target);
- })
- .set("targets", targets)
- .set("check", storage ? check_false : check_true)
- .set("ainmate", false);
- }
- if (result.bool) {
- if (!target) target = result.targets[0];
- yield player.logSkill("dcsbmengmou", target);
- player.addTempSkill("dcsbmengmou_" + (storage || false));
- player.changeZhuanhuanji("dcsbmengmou");
- //鲁肃暂时没有另一张原画(悲
- //player.changeSkin("dcsbmengmou", "dc_sb_lusu" + (player.storage.dcsbmengmou ? "_shadow" : ""));
- while (num > 0) {
- num--;
- var result2;
- if (storage) {
- result2 = yield target
- .chooseToRespond((card, player) => {
- return get.name(card) == "sha";
- })
- .set("ai", card => {
- return 1 + Math.random();
- })
- .set("prompt", "盟谋:是否打出一张【杀】?")
- .set("prompt2", "当前进度:" + (3 - num) + "/3");
- } else
- result2 = yield target
- .chooseToUse(card => {
- if (!lib.filter.cardEnabled(card, _status.event.player, _status.event)) return false;
- return get.name(card) == "sha";
- })
- .set("prompt", "盟谋:是否使用一张【杀】?")
- .set("prompt2", "当前进度:" + (3 - num) + "/3");
- if (!result2.bool) {
- if (storage) {
- target.popup("杯具");
- target.loseHp(num + 1);
- }
- break;
- }
- }
- }
- },
- group: "dcsbmengmou_change",
- subSkill: {
- effect: {
- charlotte: true,
- trigger: { global: "damageSource" },
- filter: function (event, player) {
- if (!event.source || event.getParent().type != "card") return false;
- if (event.source.isHealthy() || event.card.name != "sha") return false;
- return event.getParent(4).name == "dcsbmengmou" && event.getParent(4).player == player;
- },
- forced: true,
- popup: false,
- firstDo: true,
- content: function () {
- trigger.source.recover(trigger.num);
- },
- },
- true: { charlotte: true },
- false: { charlotte: false },
- change: {
- audio: "dcsbmengmou",
- audioname: ["dc_sb_lusu_shadow"],
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- filter(event, player) {
- return event.name != "phase" || game.phaseNumber == 0;
- },
- prompt2(event, player) {
- //无名杀先阳后阴,不要问为什么
- return "切换【盟谋】为状态" + (player.storage.dcsbmengmou ? "阳" : "阴");
- },
- check: () => Math.random() > 0.5,
- content() {
- player.changeZhuanhuanji("dcsbmengmou");
- //鲁肃暂时没有另一张原画(悲
- //player.changeSkin("dcsbmengmou", "dc_sb_lusu" + (player.storage.dcsbmengmou ? "_shadow" : ""));
- },
- },
- },
- },
- //张臶
- dc_zj_a: {
- audio: 2,
- trigger: { player: "damageBegin2" },
- filter: function (event, player) {
- return event.getParent().type == "card";
- },
- forced: true,
- content: function () {
- var num = get.number(trigger.card);
- if (typeof num == "number" && num > 0) trigger.num = num;
- else trigger.cancel();
- },
- ai: {
- effect: {
- target: function (card, player, target, current) {
- if (get.tag(card, "damage") && typeof get.number(card) != "number") return "zeroplayertarget";
- },
- },
- },
- },
- dc_zj_b: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- filter: function (event, player) {
- return player.countDiscardableCards(player, "he");
- },
- direct: true,
- content: function* (event, map) {
- var player = map.player;
- var result = yield player.chooseTarget(get.prompt2("dc_zj_b"), lib.filter.notMe).set("ai", target => {
- var player = _status.event.player;
- if (!player.hasFriend()) return 0;
- return -game.countPlayer(current => current.inRange(target) && get.attitude(current, target) < 0 && get.damageEffect(target, current, current) > 0);
- });
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dc_zj_b", target);
- player.discard(player.getCards("he")).discarder = player;
- target.addSkill("dc_zj_a");
- target.addSkill("dc_zj_b_threaten");
- player
- .when("phaseBegin")
- .then(() => {
- if (target.isIn()) {
- target.removeSkill("dc_zj_a");
- target.removeSkill("dc_zj_b_threaten");
- }
- })
- .vars({ target: target });
- }
- },
- subSkill: {
- //定要将你赶尽杀绝
- threaten: {
- charlotte: true,
- mark: true,
- marktext: "噩",
- intro: { content: "已经开始汗流浃背了" },
- ai: { threaten: 114514 * 1919810 },
- },
- },
- },
- //诸葛若雪
- dcqiongying: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- direct: true,
- filter: function (event, player) {
- return player.canMoveCard();
- },
- content: function* (event, map) {
- const player = map.player;
- event.pushHandler("onNextMoveCard", (event, option) => {
- if (_status.connectMode && event.step == 1 && event._result.bool && option.state == "end") {
- game.broadcastAll(() => {
- delete _status.noclearcountdown;
- game.stopCountChoose();
- });
- }
- });
- let result = yield player
- .moveCard(false, `###琼英###移动场上的一张牌,然后弃置一张与此牌花色相同的手牌(若没有则展示手牌)。`)
- .set("logSkill", "dcqiongying")
- .set("custom", {
- add: {},
- replace: {
- window: () => {
- if (get.event().name == "chooseTarget") ui.click.cancel();
- },
- },
- });
- if (result.bool) {
- const card = result.card,
- suit = get.suit(card);
- if (!player.hasCard({ suit: suit })) player.showHandcards();
- else player.chooseToDiscard({ suit: suit }, true, `请弃置一张${get.translation(suit)}手牌`);
- } else {
- player.getStat("skill").dcqiongying--;
- }
- },
- ai: {
- expose: 0.2,
- order: function (item, player) {
- if (player.countCards("h") <= 4) return 0.5;
- return 9;
- },
- result: {
- player: function (player) {
- if (player.canMoveCard(true)) return 1;
- return 0;
- },
- },
- },
- },
- dcnuanhui: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- content: function* (event, map) {
- const player = map.player;
- let result = yield player
- .chooseTarget(get.prompt("dcnuanhui"), "选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数且至少为1)")
- .set("ai", target => {
- return get.event("aiTarget") == target ? 10 : 0;
- })
- .set(
- "aiTarget",
- (() => {
- const player = get.player();
- const list = get.inpileVCardList(info => {
- return info[0] == "basic";
- });
- if (!list.length) return null;
- const getUseValue = target => {
- if (get.attitude(player, target) <= 0) return -1;
- const toUse = [];
- const hp = target.hp;
- let eff = 0,
- count = Math.max(1, target.countCards("e"));
- while (count--) {
- target.hp = Math.min(target.maxHp, target.hp + toUse.filter(card => card.name == "tao").length);
- const listx = list
- .map(info => {
- const card = new lib.element.VCard({
- name: info[2],
- nature: info[3],
- isCard: true,
- });
- return [card, target.getUseValue(card)];
- })
- .sort((a, b) => {
- return b[1] - a[1];
- });
- const mostValuablePair = listx[0].slice();
- if (mostValuablePair[1] <= 0) mostValuablePair[1] = 0;
- eff += mostValuablePair[1];
- toUse.push(mostValuablePair[0]);
- target.hp = hp;
- }
- if (toUse.length > 1 && eff > 0) {
- eff -= target
- .getCards("e", card => {
- return lib.filter.cardDiscardable(card, target, "dcnuanhui");
- })
- .map(card => {
- return get.value(card, target);
- })
- .reduce((p, c) => {
- return p + c;
- }, 0);
- }
- return eff;
- };
- const playerList = game
- .filterPlayer()
- .map(current => [current, getUseValue(current)])
- .sort((a, b) => b[1] - a[1]);
- if (playerList[0][1] <= 0) return null;
- return playerList[0][0];
- })()
- );
- if (!result.bool) return event.finish();
- const target = result.targets[0];
- player.logSkill("dcnuanhui", target);
- if (!target.isUnderControl(true) && !target.isOnline()) game.delayx();
- const total = Math.max(1, target.countCards("e"));
- let count = 0,
- forced = false,
- used = [],
- discard = false;
- while (count < total) {
- const basicList = get.inpileVCardList(info => {
- return info[0] == "basic" && target.hasUseTarget({ name: info[2], nature: info[3], isCard: true });
- });
- if (!basicList.length) {
- game.log("但是", target, "无牌可出!");
- break;
- }
- const str = forced ? "视为使用一张基本牌" : "是否视为使用一张基本牌?";
- const result = yield target.chooseButton([str, [basicList, "vcard"]], forced).set("ai", button => {
- return get.player().getUseValue({
- name: button.link[2],
- nature: button.link[3],
- isCard: true,
- });
- });
- if (!result.bool) {
- game.log("但是", target, "不愿出牌!");
- break;
- }
- forced = true;
- const card = new lib.element.VCard({
- name: result.links[0][2],
- nature: result.links[0][3],
- isCard: true,
- });
- const result2 = yield target.chooseUseTarget(card, true, false);
- if (!discard && result2.bool) {
- if (used.includes(result.links[0][2])) discard = true;
- else used.add(result.links[0][2]);
- }
- count++;
- }
- if (discard) {
- const cards = target.getCards("e", card => {
- return lib.filter.cardDiscardable(card, target, "dcnuanhui");
- });
- if (cards.length) target.discard(cards).discarder = target;
- }
- },
- ai: {
- expose: 0.3,
- threaten: 3.7,
- },
- },
- //曹轶
- dcmiyi: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- direct: true,
- content: function* (event, map) {
- const player = map.player;
- if (_status.connectMode)
- game.broadcastAll(() => {
- _status.noclearcountdown = true;
- });
- let result = yield player
- .chooseControl(["回复体力", "受到伤害"], "cancel2")
- .set("choiceList", ["令你即将选择的角色各回复1点体力", "令你即将选择的角色各受到你造成的1点伤害"])
- .set("prompt", get.prompt("dcmiyi"))
- .set("ai", () => {
- return get.event("choice");
- })
- .set(
- "choice",
- (() => {
- let damage = 0;
- game.countPlayer(current => {
- let eff = get.damageEffect(current, player, player);
- if (!current.isDamaged()) {
- if (eff > 0) eff = -eff;
- } else if (current.hasSkillTag("maixie")) {
- if (get.attitude(player, current) <= 0) {
- if (current.getHp(true) >= 2) eff = 0;
- else eff /= 10;
- } else if (current.getHp(true) >= 2) {
- eff += 30;
- }
- } else eff /= 3;
- damage += eff;
- });
- if (damage < -20) return 0;
- if (damage > 5) return 1;
- if (lib.skill.mbhuiyao.getUnrealDamageTargets(player, [[player], game.filterPlayer()])) return 0;
- return "cancel2";
- })()
- );
- if (result.control == "cancel2") {
- if (_status.connectMode) {
- game.broadcastAll(() => {
- delete _status.noclearcountdown;
- game.stopCountChoose();
- });
- }
- return event.finish();
- }
- const func = ["recover", "damage"],
- ind = result.index;
- const fn = func[ind];
- result = yield player
- .chooseTarget(`蜜饴:令任意名角色${result.control.slice(0, 2)}1点${result.control.slice(2)}`, [1, Infinity])
- .set("ai", target => {
- const toDamage = get.event("toDamage");
- let eff = get.damageEffect(target, player, player);
- if (toDamage) {
- if (target.hasSkillTag("maixie")) {
- if (get.attitude(player, target) <= 0) {
- if (target.getHp(true) >= 2) eff = 0;
- else eff /= 10;
- } else if (target.getHp(true) >= 2) {
- eff += 30;
- }
- }
- return eff;
- }
- if (!target.isDamaged()) {
- eff *= -2;
- }
- if (target.getHp(true) >= 2) return -eff;
- return 0;
- })
- .set("toDamage", result.index == 1);
- if (_status.connectMode) {
- game.broadcastAll(() => {
- delete _status.noclearcountdown;
- game.stopCountChoose();
- });
- }
- if (!result.bool) return event.finish();
- const targets = result.targets.slice().sortBySeat();
- player.logSkill("dcmiyi", targets, fn == "damage" ? "fire" : "green");
- while (targets.length) {
- const target = targets.shift();
- if (!target.isIn()) continue;
- target[fn]();
- target
- .when({ global: "phaseJieshuBegin" })
- .vars({
- fn: func[ind ^ 1],
- source: player,
- })
- .then(() => {
- if (source.isIn()) {
- if (!trigger._dcmiyi_logged) {
- source.logSkill("dcmiyi");
- trigger._dcmiyi_logged = true;
- }
- source.line(player, fn == "damage" ? "fire" : "green");
- }
- player[fn](source);
- });
- }
- },
- },
- dcyinjun: {
- audio: 2,
- trigger: { player: "useCardAfter" },
- filter: function (event, player) {
- if (get.name(event.card, false) != "sha" && get.type2(event.card) != "trick") return false;
- if (event.targets.length != 1 || !event.targets[0].isIn()) return false;
- if (!player.canUse(new lib.element.VCard({ name: "sha" }), event.targets[0], false)) return false;
- return player.hasHistory("lose", evt => {
- if (evt.getParent() != event) return false;
- return event.cards.every(card => {
- return evt.hs.includes(card);
- });
- });
- },
- prompt2: function (event, player) {
- return `视为对${get.translation(event.targets)}使用一张无伤害来源的【杀】`;
- },
- check: function (event, player) {
- const sha = new lib.element.VCard({ name: "sha" });
- return Math.max(...[event.targets[0], player].map(source => get.effect(event.targets[0], sha, source, player))) > 0;
- },
- logTarget: "targets",
- content: function* (event, map) {
- const player = map.player,
- trigger = map.trigger,
- target = trigger.targets[0];
- yield (player.useCard(new lib.element.VCard({ name: "sha" }), target, false).oncard = () => {
- get.event().customArgs.default.customSource = {
- isDead: () => true,
- };
- });
- if (player.getHistory("useSkill", evt => evt.skill == "dcyinjun").length > player.getHp()) {
- player.tempBanSkill("dcyinjun");
- }
- },
- },
- //马伶俐
- dclima: {
- audio: 2,
- mod: {
- globalFrom: function (from, to, distance) {
- return (
- distance -
- Math.max(
- 1,
- game.countPlayer(current => {
- return current.countCards("e", card => {
- return get.is.attackingMount(card) || get.is.defendingMount(card);
- });
- })
- )
- );
- },
- },
- },
- dcxiaoyin: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- filter: function (event, player) {
- return game.hasPlayer(current => get.distance(player, current) <= 1);
- },
- group: "dcxiaoyin_damage",
- prompt2: function (event, player) {
- return `亮出牌堆顶的${get.cnNumber(game.countPlayer(current => get.distance(player, current) <= 1))}张牌,获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上。`;
- },
- frequent: true,
- check: () => true,
- content: function* (event, map) {
- var player = map.player;
- var count = game.countPlayer(current => get.distance(player, current) <= 1);
- var cards = game.cardsGotoOrdering(get.cards(count)).cards;
- yield player.showCards(cards, `${get.translation(player)}【硝引】亮出`);
- player.gain(
- cards.filter(i => get.color(i, false) == "red"),
- "gain2"
- );
- var blackOnes = cards.filter(i => get.color(i, false) == "black");
- if (!blackOnes.length) return event.finish();
- event.videoId = lib.status.videoId++;
- var func = (cards, id) => {
- var dialog = ui.create.dialog("硝引:剩余的黑色牌", `请选择至多${get.cnNumber(cards.length)}名座次连续的其他角色,然后将以下这些牌置于这些角色的武将牌上。
`, cards);
- dialog.videoId = id;
- return dialog;
- };
- if (player == game.me) func(blackOnes, event.videoId);
- else if (player.isOnline2()) {
- player.send(func, blackOnes, event.videoId);
- }
- var targets = game.filterPlayer(current => current != player);
- if (targets.length == 1) var result = { bool: true, targets: targets };
- else
- var result = yield player
- .chooseTarget([1, blackOnes.length], true, (card, player, target) => {
- if (player == target) return false;
- var selected = ui.selected.targets;
- if (!selected.length) return true;
- for (var i of selected) {
- if (i.getNext() == target || i.getPrevious() == target) return true;
- }
- return false;
- })
- .set("complexSelect", true)
- .set("complexTarget", true)
- .set("multitarget", true)
- .set("multiline", true)
- .set("ai", target => {
- if (get.event("aiTargets").includes(target)) return 10;
- return 0.1;
- })
- .set(
- "aiTargets",
- (() => {
- var targets = game.filterPlayer(i => i != player).sortBySeat(player);
- var maxEff = -Infinity,
- aiTargets = [];
- for (var i = 0; i < targets.length; i++) {
- for (var j = 0; j < blackOnes.length; j++) {
- if (targets.length < i + j) break;
- var targetsx = targets.slice(i, j);
- var tmpEff = targetsx
- .map(current => {
- return get.damageEffect(current, current, player, "fire");
- })
- .reduce((p, c) => {
- return p + c;
- }, 0);
- if (tmpEff > maxEff) {
- maxEff = tmpEff;
- aiTargets = targetsx;
- }
- }
- }
- return aiTargets;
- })()
- )
- .set("prompt", false);
- if (!result.bool) {
- event.finish();
- return;
- }
- var func = (num, id) => {
- var dialog = get.idDialog(id);
- if (dialog) dialog.content.childNodes[1].innerHTML = `将${get.cnNumber(num)}张黑色牌按照选择的角色的座次顺序置于这些角色武将牌上
`;
- };
- var targets = result.targets.slice().sortBySeat(player);
- var num = targets.length;
- if (player == game.me) func(num, event.videoId);
- else if (player.isOnline2()) player.send(func, num, event.videoId);
- if (blackOnes.length == 1) var result = { bool: true, links: blackOnes };
- else
- var result = yield player
- .chooseButton(true, num)
- .set("dialog", event.videoId)
- .set("ai", () => 1);
- game.broadcastAll("closeDialog", event.videoId);
- if (result.bool) {
- var cards = result.links;
- player.line(targets);
- targets.forEach((current, ind) => {
- current.addToExpansion(cards[ind], "gain2").gaintag.add("dcxiaoyin");
- game.log(current, "将", cards[ind], "当“硝引”置于了武将牌上");
- });
- }
- },
- marktext: "硝",
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- subSkill: {
- damage: {
- audio: "dcxiaoyin",
- trigger: { global: "damageBegin3" },
- filter: function (event, player) {
- if (!event.source || !event.source.isIn()) return false;
- return event.player.getExpansions("dcxiaoyin").length;
- },
- //direct:true,
- async cost(event, trigger, player) {
- const source = trigger.source,
- target = trigger.player;
- const cards = target.getExpansions("dcxiaoyin");
- if (trigger.hasNature("fire")) {
- const types = cards.map(i => get.type2(i, false));
- const str = get.translation(types).replace(/(.*)、/, "$1或");
- event.result = await source
- .chooseCard(`硝引:是否弃置一张${str}牌?`, `若如此做,将${get.translation(target)}的对应的“硝引”牌置入弃牌堆,令你对其造成的伤害+1`, "he", function (card, player) {
- if (!get.event("types").includes(get.type2(card))) return false;
- return lib.filter.cardDiscardable.apply(this, arguments);
- })
- .set("types", types)
- .set("ai", card => {
- if (get.event("goon")) return 7 - get.value(card);
- return 0;
- })
- .set("goon", get.damageEffect(target, player, player, "fire") > 0 && get.attitude(player, target) <= 0)
- .forResult();
- } else {
- event.result = await source
- .chooseBool(`###是否响应${get.translation(player)}的【硝引】?###获得${get.translation(target)}的一张“硝引”牌(${get.translation(cards)}),然后将你对其造成的此次伤害改为火焰伤害。`)
- .set(
- "choice",
- (() => {
- if (get.damageEffect(target, source, source, "fire") < get.damageEffect(target, source, source) - 5) return false;
- if (cards.map(i => get.value(i)).reduce((p, c) => p + c, 0) > 0) return true;
- return false;
- })()
- )
- .forResult();
- }
- },
- async content(event, trigger, player) {
- const source = trigger.source,
- target = trigger.player;
- if (trigger.hasNature("fire")) {
- source.line(target, "fire");
- const type = get.type2(event.cards[0]);
- await source.discard(event.cards).set("discarder", source);
- //await game.asyncDelayx();
- const cardsToDiscard = target.getExpansions("dcxiaoyin").filter(card => get.type2(card, false) === type);
- if (cardsToDiscard.length === 1) await target.loseToDiscardpile(cardsToDiscard);
- else if (cardsToDiscard.length > 1) {
- const result = await source.chooseButton([`请选择移去${get.translation(source)}的一张“硝引”牌`, cardsToDiscard], true).forResult();
- await target.loseToDiscardpile(result.links);
- }
- trigger.addNumber("num", 1);
- } else {
- source.line(target, "fire");
- const cards = target.getExpansions("dcxiaoyin");
- if (cards.length === 1) await source.gain(cards, target, "give");
- else if (cards.length > 1) {
- const result = await source.chooseButton([`请选择获得${get.translation(source)}的一张“硝引”牌`, cards], true).forResult();
- await source.gain(result.links, target, "give");
- }
- game.setNature(trigger, "fire");
- }
- },
- },
- },
- ai: {
- threaten: 4,
- },
- },
- dchuahuo: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- viewAs: {
- name: "sha",
- nature: "fire",
- storage: { dchuahuo: true },
- },
- filterCard: { color: "red" },
- position: "hs",
- filter: function (event, player) {
- return player.countCards("hs", { color: "red" });
- },
- check: function (card) {
- return 6 - get.value(card);
- },
- precontent: function () {
- event.getParent().addCount = false;
- player
- .when("useCardToPlayer")
- .filter(evt => evt.card.storage && evt.card.storage.dchuahuo)
- .then(() => {
- if (trigger.target.getExpansions("dcxiaoyin").length) {
- var targets = game.filterPlayer(current => {
- return current.getExpansions("dcxiaoyin").length;
- });
- player.chooseBool(`是否更改${get.translation(trigger.card)}的目标?`, `将此牌的目标改为所有有“硝引”的角色(${get.translation(targets)})。`).set("choice", targets.map(current => get.effect(current, trigger.card, player, player)).reduce((p, c) => p + c, 0) > get.effect(trigger.target, trigger.card, player, player));
- } else event.finish();
- })
- .then(() => {
- if (result.bool) {
- trigger.targets.length = 0;
- trigger.getParent().triggeredTargets1.length = 0;
- trigger.untrigger();
- var targets = game.filterPlayer(current => {
- return current.getExpansions("dcxiaoyin").length;
- });
- player.line(targets, "fire");
- trigger.targets.addArray(targets);
- game.log(targets, "成为了", trigger.card, "的新目标");
- game.delayx();
- }
- });
- },
- ai: {
- order: () => get.order({ name: "sha" }) + 0.2,
- result: { player: 1 },
- },
- },
- //武陆逊
- dcxiongmu: {
- audio: 2,
- trigger: { global: "roundStart" },
- // filter:function(event,player){
- // return player.countCards('h') {
- return 6 - get.value(card);
- });
- "step 2";
- if (result.bool) {
- var cards = result.cards;
- event.cards = cards;
- game.log(player, `将${get.cnNumber(cards.length)}张牌置入了牌堆`);
- player.loseToDiscardpile(cards, ui.cardPile, "blank").set("log", false).insert_index = function () {
- return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)];
- };
- } else event.finish();
- "step 3";
- var list = [],
- shown = [];
- var piles = ["cardPile", "discardPile"];
- for (var pile of piles) {
- for (var i = 0; i < ui[pile].childNodes.length; i++) {
- var card = ui[pile].childNodes[i];
- var number = get.number(card, false);
- if (!list.includes(card) && number == 8) {
- list.push(card);
- if (pile == "discardPile") shown.push(card);
- if (list.length >= cards.length) break;
- }
- }
- if (list.length >= cards.length) break;
- }
- if (list.length) {
- var next = player.gain(list);
- next.shown_cards = shown;
- next.set("animate", function (event) {
- var player = event.player,
- cards = event.cards,
- shown = event.shown_cards;
- if (shown.length < cards.length) {
- var num = cards.length - shown.length;
- player.$draw(num);
- game.log(player, "从牌堆获得了", get.cnNumber(num), "张点数为8的牌");
- }
- if (shown.length > 0) {
- player.$gain2(shown, false);
- game.log(player, "从弃牌堆获得了", shown);
- }
- return 500;
- });
- next.gaintag.add("dcxiongmu_tag");
- player.addTempSkill("dcxiongmu_tag", "roundStart");
- }
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (target.countCards("h") > target.getHp() || player.hasSkillTag("jueqing")) return;
- if (player._dcxiongmu_temp) return;
- if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return;
- if (get.tag(card, "damage")) {
- if (target.getHistory("damage").length > 0) {
- return [1, -2];
- } else {
- if (get.attitude(player, target) > 0 && target.hp > 1) {
- return 0;
- }
- if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) {
- if (card.name == "sha") return;
- var sha = false;
- player._dcxiongmu_temp = true;
- var num = player.countCards("h", function (card) {
- if (card.name == "sha") {
- if (sha) {
- return false;
- } else {
- sha = true;
- }
- }
- return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0;
- });
- delete player._dcxiongmu_temp;
- if (player.hasSkillTag("damage")) {
- num++;
- }
- if (num < 2) {
- var enemies = player.getEnemies();
- if (enemies.length == 1 && enemies[0] == target && player.needsToDiscard()) {
- return;
- }
- return 0;
- }
- }
- }
- }
- },
- },
- },
- subSkill: {
- minus: {
- audio: "dcxiongmu",
- trigger: { player: "damageBegin4" },
- filter: function (event, player) {
- return (
- player.countCards("h") <= player.getHp() &&
- game
- .getGlobalHistory(
- "everything",
- evt => {
- return evt.name == "damage" && evt.player == player;
- },
- event
- )
- .indexOf(event) == 0
- );
- },
- forced: true,
- locked: false,
- content: function () {
- trigger.num--;
- },
- },
- tag: {
- charlotte: true,
- onremove: function (player) {
- player.removeGaintag("dcxiongmu_tag");
- },
- mod: {
- ignoredHandcard: function (card, player) {
- if (card.hasGaintag("dcxiongmu_tag")) return true;
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && card.hasGaintag("dcxiongmu_tag")) return false;
- },
- },
- },
- },
- },
- dczhangcai: {
- audio: 2,
- 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"],
- },
- filter: function (event, player) {
- if (player.hasSkill("dczhangcai_all")) return true;
- return get.number(event.card) == 8;
- },
- prompt2: function (event, player) {
- const num = player.hasSkill("dczhangcai_all") ? get.number(event.card) : 8;
- let count = 1;
- if (typeof num == "number")
- count = Math.max(
- 1,
- player.countCards("h", card => get.number(card) == num)
- );
- return "你可以摸" + get.cnNumber(count) + "张牌。";
- },
- check: (event, player) => {
- const num = player.hasSkill("dczhangcai_all") ? get.number(event.card) : 8;
- let count = 1;
- if (typeof num == "number")
- count = Math.max(
- 1,
- player.countCards("h", card => get.number(card) == num)
- );
- return ui.cardPile.childNodes.length + ui.discardPile.childNodes.length >= count;
- },
- frequent: true,
- locked: false,
- content: function () {
- var num = player.hasSkill("dczhangcai_all") ? get.number(trigger.card) : 8;
- var count = 1;
- if (typeof num == "number")
- count = Math.max(
- 1,
- player.countCards("h", card => get.number(card) == num)
- );
- player.draw(count);
- },
- ai: {
- threaten: 4,
- },
- subSkill: {
- all: {
- charlotte: true,
- mark: true,
- intro: {
- content: "当你使用或打出牌时,你可以摸X张牌(X为你手牌中与此牌点数相同的牌数且至少为1)",
- },
- },
- },
- },
- dcruxian: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- skillAnimation: true,
- animationColor: "wood",
- content: function () {
- "step 0";
- player.awakenSkill("dcruxian");
- player.addTempSkill("dczhangcai_all", { player: "phaseBegin" });
- },
- ai: {
- combo: "dczhangcai",
- order: 15,
- result: {
- player: function (player) {
- if (!player.hasSkill("dczhangcai")) return 0;
- if (player.countCards("hs", card => get.number(card) != 8 && player.hasValueTarget(card)) > 3 || player.hp == 1) return 5;
- return 0;
- },
- },
- },
- },
- //新杀许靖
- dcshangyu: {
- audio: 2,
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- filter: function (event, player) {
- return event.name != "phase" || game.phaseNumber == 0;
- },
- forced: true,
- content: function () {
- "step 0";
- var card = get.cardPile(card => get.name(card, false) == "sha");
- if (card) {
- event.card = card;
- player.gain(card, "gain2").gaintag.add("dcshangyu_tag");
- player.markAuto("dcshangyu", card);
- } else {
- player.chat("不是,连杀都没有?");
- event.finish();
- }
- "step 1";
- if (get.owner(card) == player && get.position(card) == "h" && game.hasPlayer(current => current != player)) {
- let targets = game
- .filterPlayer(
- i => {
- return get.attitude(player, i) > 0;
- },
- null,
- true
- )
- .sortBySeat(
- get.zhu(player) ||
- game.findPlayer(i => {
- return i.getSeatNum() === 1;
- })
- );
- if (targets.includes(player)) targets = targets.slice(0, targets.indexOf(player));
- player
- .chooseTarget(`是否将${get.translation(card)}交给一名其他角色?`, lib.filter.notMe)
- .set("ai", target => {
- let idx = _status.event.targets.indexOf(target);
- if (idx < 0) return -1;
- return 1 / (idx + 1);
- })
- .set("targets", targets);
- } else event.finish();
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target);
- if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2);
- player.give(card, target).gaintag.add("dcshangyu_tag");
- }
- player.addSkill("dcshangyu_effect");
- },
- subSkill: {
- effect: {
- audio: "dcshangyu",
- trigger: {
- global: "damageSource",
- },
- filter: function (event, player) {
- return event.cards && event.cards.some(card => player.getStorage("dcshangyu").includes(card));
- },
- forced: true,
- charlotte: true,
- direct: true,
- group: ["dcshangyu_transfer", "dcshangyu_addTag"],
- content: function () {
- "step 0";
- var list = [player];
- if (trigger.source && trigger.source.isIn()) {
- player.logSkill("dcshangyu_effect", trigger.source);
- list.push(trigger.source);
- } else player.logSkill("dcshangyu_effect");
- list.sortBySeat();
- game.asyncDraw(list);
- },
- },
- transfer: {
- audio: "dcshangyu",
- trigger: {
- global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"],
- },
- forced: true,
- direct: true,
- filter: function (event, player) {
- if (
- !game.hasPlayer(current => {
- return !player.getStorage("dcshangyu_transfer").includes(current);
- })
- )
- return false;
- return event.getd().some(card => {
- return get.position(card) == "d" && player.getStorage("dcshangyu").includes(card);
- });
- },
- content: function () {
- "step 0";
- var cards = trigger.getd().filter(card => {
- return get.position(card) == "d" && player.getStorage("dcshangyu").includes(card);
- }),
- targets = game
- .filterPlayer(current => {
- return !player.getStorage("dcshangyu_transfer").includes(current);
- })
- .sortBySeat(_status.currentPhase);
- if (targets.length && targets[0] === _status.currentPhase && !_status.currentPhase.getCardUsable("sha")) targets.push(targets.shift());
- event.cards = cards;
- player
- .chooseTarget(
- `赏誉:将${get.translation(cards)}交给一名可选角色`,
- (card, player, target) => {
- return !player.getStorage("dcshangyu_transfer").includes(target);
- },
- true
- )
- .set("ai", target => {
- let att = get.sgnAttitude(_status.event.player, target),
- idx = 1 + _status.event.targets.indexOf(target);
- if (att < 0) return -idx;
- return att + 1 / idx;
- })
- .set("targets", targets);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcshangyu_transfer", target);
- if (!player.storage.dcshangyu_transfer) {
- player.when({ global: "phaseAfter" }).then(() => {
- player.unmarkSkill("dcshangyu_transfer");
- delete player.storage.dcshangyu_transfer;
- });
- }
- player.markAuto("dcshangyu_transfer", target);
- target.gain(cards, "gain2").set("giver", player).gaintag.add("dcshangyu_tag");
- }
- },
- intro: {
- content: "本回合已交给过$",
- },
- },
- addTag: {
- trigger: {
- global: ["gainAfter", "loseAsyncAfter"],
- },
- charlotte: true,
- popup: false,
- silent: true,
- lastDo: true,
- filter: function (event, player) {
- return game.hasPlayer(current => {
- var cards = event.getg(current);
- return cards.some(card => player.getStorage("dcshangyu").includes(card));
- });
- },
- content: function () {
- game.countPlayer(current => {
- var cards = trigger.getg(current);
- if (cards.length) {
- cards = cards.filter(card => player.getStorage("dcshangyu").includes(card));
- current.addGaintag(cards, "dcshangyu_tag");
- }
- });
- },
- },
- },
- },
- dccaixia: {
- audio: 2,
- trigger: {
- player: "damageEnd",
- source: "damageSource",
- },
- filter: function (event, player) {
- return !player.hasMark("dccaixia_clear");
- },
- direct: true,
- locked: false,
- content: function () {
- "step 0";
- var choices = Array.from({
- length: Math.min(5, game.players.length + game.dead.length),
- }).map((_, i) => get.cnNumber(i + 1, true));
- player
- .chooseControl(choices, "cancel2")
- .set("prompt", get.prompt("dccaixia"))
- .set("prompt2", "你可以摸至多" + get.cnNumber(choices.length) + "张牌,但是你此后需要再使用等量的牌才可再发动本技能。")
- .set("ai", () => {
- return _status.event.choice;
- })
- .set(
- "choice",
- (function () {
- var cards = player.getCards("hs", card => get.name(card, player) !== "sha" && player.hasValueTarget(card));
- var damage = Math.min(player.getCardUsable({ name: "sha" }), player.countCards("hs", "sha")) + cards.filter(i => get.tag(i, "damage")).length;
- if (player.isPhaseUsing() || player.hp + player.hujia + player.countCards("hs", i => get.tag(card, "recover")) > 2) {
- if (damage) return Math.min(choices.length - 1, cards.length - damage);
- return Math.min(choices.length - 1, cards.length - 1);
- }
- return choices.length - 1;
- })()
- );
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("dccaixia");
- var num = result.index + 1;
- player.draw(num);
- player.addMark("dccaixia_clear", num);
- player.addSkill("dccaixia_clear");
- }
- },
- mod: {
- aiOrder: function (player, card, num) {
- if (!get.tag(card, "damage")) return;
- if (player.countMark("dccaixia_clear") > 1) return num / 3;
- return num + 6;
- },
- },
- subSkill: {
- clear: {
- trigger: { player: "useCard1" },
- filter: function (event, player) {
- return player.hasMark("dccaixia_clear");
- },
- forced: true,
- popup: false,
- charlotte: true,
- content: function () {
- player.removeMark("dccaixia_clear", 1);
- },
- intro: {
- name: "才瑕",
- name2: "瑕",
- content: "距离刷新技能还需使用&张牌",
- },
- },
- },
- },
- //十周年二乔
- dcxingwu: {
- intro: {
- content: "expansion",
- markcount: "expansion",
- onunmark: function (storage, player) {
- player.removeAdditionalSkill("dcluoyan");
- },
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- audio: "xingwu",
- trigger: { player: "phaseDiscardBegin" },
- filter: function (event, player) {
- return player.countCards("h");
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseCard("h", get.prompt("dcxingwu"), "将一张手牌作为“舞”置于武将牌上")
- .set("ai", function (card) {
- var att = 1,
- list = [];
- for (var i of player.getExpansions("dcxingwu")) {
- if (!list.includes(get.suit(i))) list.push(get.suit(i));
- }
- if (!list.includes(get.suit(card))) att = 2;
- if (_status.event.goon) return (20 - get.value(card)) * att;
- return (7 - get.value(card)) * att;
- })
- .set("goon", player.needsToDiscard() || player.getExpansions("dcxingwu").length == 2);
- "step 1";
- if (result.bool) {
- player.logSkill("dcxingwu");
- var cards = result.cards;
- player.addToExpansion(cards, player, "give").gaintag.add("dcxingwu");
- }
- "step 2";
- game.delayx();
- if (player.getExpansions("dcxingwu").length > 2) {
- player.chooseButton(["是否移去三张“舞”并发射核弹?", player.getExpansions("dcxingwu")], 3).ai = button => {
- if (
- game.hasPlayer(function (current) {
- return get.attitude(player, current) < 0;
- })
- )
- return 1;
- return 0;
- };
- } else event.finish();
- "step 3";
- if (result.bool) {
- event.cards = result.links;
- var list = [],
- str = ["小型", "中型", "巨型"];
- for (var i of event.cards) {
- if (!list.includes(get.suit(i))) list.push(get.suit(i));
- }
- player.chooseTarget("请选择" + str[list.length - 1] + "核弹的投射的目标(伤害:" + list.length + "点)", lib.filter.notMe, true).ai = target => {
- var att = 1;
- if (target.sex == "male") att = 1.5;
- if ((target.hp == target.sex) == "male" ? 2 : 1) att *= 1.2;
- if (get.mode() == "identity" && player.identity == "fan" && target.isZhu) att *= 3;
- return -get.attitude(player, target) * att * Math.max(1, target.countCards("e"));
- };
- }
- "step 4";
- if (result.bool) {
- var list = [];
- for (var i of event.cards) {
- if (!list.includes(get.suit(i))) list.push(get.suit(i));
- }
- player.loseToDiscardpile(event.cards);
- player.logSkill("dcxingwu", result.targets[0]);
- player.discardPlayerCard(result.targets[0], "e", result.targets[0].countCards("e"), true);
- result.targets[0].damage(result.targets[0].sex == "female" ? 1 : list.length);
- }
- },
- },
- dcluoyan: {
- derivation: ["retianxiang", "liuli"],
- init: function (player) {
- if (player.getExpansions("dcxingwu").length) player.addAdditionalSkill("dcluoyan", ["retianxiang", "liuli"]);
- else player.removeAdditionalSkill("dcluoyan");
- },
- onremove: function (player) {
- player.removeAdditionalSkill("dcluoyan");
- },
- trigger: { player: ["loseAfter", "loseAsyncAfter", "addToExpansionAfter"] },
- filter: function (event, player) {
- var cards = player.getExpansions("dcxingwu"),
- skills = player.additionalSkills.dcluoyan;
- return !((cards.length && skills && skills.length) || (!cards.length && (!skills || !skills.length)));
- },
- forced: true,
- silent: true,
- content: function () {
- lib.skill.dcluoyan.init(player, "dcluoyan");
- },
- ai: {
- combo: "dcxingwu",
- },
- },
- retianxiang_daxiaoqiao: {
- audio: "tianxiang_daxiaoqiao",
- inherit: "retianxiang",
- },
- //田尚衣
- dcposuo: {
- onChooseToUse: function (event) {
- if (!game.online && !event.dcposuo_cards) {
- var player = event.player;
- var evtx = event.getParent("phaseUse");
- var suits = lib.suit.slice(0).reverse();
- suits = suits.filter(suit => !player.getStorage("dcposuo_suits").includes(suit) && player.countCards("hs", card => get.suit(card, player) == suit));
- if (
- !suits.length ||
- player.getHistory("sourceDamage", evt => {
- return evt.player != player && evt.getParent("phaseUse") == evtx;
- }).length
- )
- event.set("dcposuo_cards", undefined);
- else {
- var list = [],
- cards = Array.from(ui.cardPile.childNodes);
- cards.addArray(Array.from(ui.discardPile.childNodes));
- game.countPlayer(current => cards.addArray(current.getCards("hejxs")));
- for (var name of lib.inpile) {
- if (!get.tag({ name: name }, "damage") || get.type(new lib.element.VCard({ name: name })) === "delay") continue;
- let same = cards.filter(card => get.name(card, false) == name && !get.natureList(card, false).length);
- if (same.length) {
- for (var suit of suits) {
- if (same.some(card => get.suit(card, false) == suit)) {
- list.push([suit, "", name, undefined, suit]);
- }
- }
- }
- for (var nature of lib.inpile_nature) {
- same = cards.filter(card => get.name(card, false) == name && get.is.sameNature(get.natureList(card, false), nature));
- if (same.length) {
- for (var suit of suits) {
- if (same.some(card => get.suit(card, false) == suit)) {
- list.push([suit, "", name, nature, suit]);
- }
- }
- }
- }
- }
- event.set("dcposuo_cards", list);
- }
- }
- },
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return event.dcposuo_cards && event.dcposuo_cards.length;
- },
- chooseButton: {
- dialog: function (event, player) {
- return ui.create.dialog("婆娑", [event.dcposuo_cards, "vcard"], "hidden");
- },
- check: function (button) {
- var player = _status.event.player;
- return player.getUseValue({ name: button.link[2], nature: button.link[3] });
- },
- backup: function (links, player) {
- return {
- suit: links[0][4],
- filterCard: function (card, player) {
- return get.suit(card, player) == lib.skill.dcposuo_backup.suit;
- },
- viewAs: {
- name: links[0][2],
- nature: links[0][3],
- isCard: true,
- },
- check: function (card) {
- return 6.5 - get.value(card);
- },
- precontent: function () {
- player.logSkill("dcposuo");
- delete event.result.skill;
- player.addTempSkill("dcposuo_suits", "phaseUseAfter");
- player.markAuto("dcposuo_suits", [get.suit(event.result.cards[0])]);
- },
- };
- },
- prompt: function (links, player) {
- var suit = links[0][4];
- var name = links[0][2];
- var nature = links[0][3];
- return "将一张" + get.translation(suit) + "牌当作" + (get.translation(nature) || "") + get.translation(name) + "使用";
- },
- },
- ai: {
- order: 10,
- result: { player: 1 },
- },
- subSkill: {
- suits: {
- charlotte: true,
- onremove: true,
- },
- },
- },
- dcxiaoren: {
- audio: 2,
- trigger: {
- source: "damageSource",
- },
- usable: 1,
- check: (event, player) => {
- let rev = game.countPlayer(i => {
- return i.isDamaged() && get.attitude(_status.event.player, i) > 0;
- });
- if (!event.player.isIn() || game.countPlayer() < 2) return rev;
- if (get.damageEffect(event.player.getPrevious(), player, _status.event.player) > -rev) return true;
- return get.damageEffect(event.player.getNext(), player, _status.event.player) > -rev;
- },
- content: function () {
- "step 0";
- player.addTempSkill("dcxiaoren_dying");
- event.target = trigger.player;
- "step 1";
- player.judge();
- "step 2";
- if (result.color == "red")
- player.chooseTarget("绡刃:是否令一名角色回复1点体力(若回满则额外摸一张牌)?").set("ai", target => {
- let rec = get.recoverEffect(target, _status.event.player, _status.event.player);
- if (target.getDamagedHp() <= 1) return rec + get.effect(target, { name: "draw" }, target, _status.event.player);
- return rec;
- });
- else if (result.color != "black" || !trigger.player.isIn() || game.countPlayer() < 2) event.goto(9);
- else event.goto(5);
- "step 3";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.line(target);
- target.recover();
- } else event.goto(9);
- "step 4";
- if (event.target.isHealthy()) event.target.draw();
- event.goto(9);
- "step 5";
- var targets = [].addArray([target.getPrevious(), target.getNext()]);
- if (targets.length > 1)
- player
- .chooseTarget(
- "绡刃:对其中一名角色造成1点伤害",
- (card, player, target) => {
- return _status.event.targets.includes(target);
- },
- true
- )
- .set("ai", target => {
- let player = _status.event.player;
- return get.damageEffect(target, player, player);
- })
- .set("targets", targets);
- else if (targets.length) event._result = { bool: true, targets: targets };
- "step 6";
- if (result.bool) {
- let target = result.targets[0];
- event.target = target;
- player.line(target);
- target.damage("nocard");
- } else event.goto(9);
- "step 7";
- if (player.storage.dcxiaoren_dying || get.is.blocked(event.name, player)) event._result = { bool: false };
- else if (event.frequent) event._result = { bool: true };
- else
- player
- .chooseBool("绡刃:是否再次进行判定并执行对应效果直到未能执行此项或有角色进入濒死状态?")
- .set("ai", function () {
- return _status.event.bool;
- })
- .set("bool", lib.skill.dcxiaoren.check({ player: event.target }, player));
- "step 8";
- if (result.bool) {
- event.frequent = true;
- event.goto(1);
- }
- "step 9";
- player.removeSkill("dcxiaoren_dying");
- },
- subSkill: {
- dying: {
- init: player => {
- delete player.storage.dcxiaoren_dying;
- },
- onremove: player => {
- delete player.storage.dcxiaoren_dying;
- },
- trigger: { global: "dying" },
- forced: true,
- popup: false,
- charlotte: true,
- content: function () {
- player.storage.dcxiaoren_dying = true;
- },
- },
- },
- },
- //孙翎鸾
- dclingyue: {
- audio: 2,
- trigger: { global: "damageSource" },
- forced: true,
- filter: function (event, player) {
- if (!event.source || !event.source.isIn()) return false;
- var history = event.source.actionHistory;
- for (var i = history.length - 1; i >= 0; i--) {
- if (i == history.length - 1) {
- if (history[i].sourceDamage.indexOf(event) > 0) return false;
- } else if (history[i].sourceDamage.some(evt => evt != event)) return false;
- if (history[i].isRound) break;
- }
- return true;
- },
- content: function () {
- var num = 1,
- current = _status.currentPhase;
- if (current && trigger.source != current) {
- var num = 0,
- players = game.players.slice(0).concat(game.dead);
- for (var target of players) {
- target.getHistory("sourceDamage", function (evt) {
- num += evt.num;
- });
- }
- }
- player.draw(num);
- },
- },
- dcpandi: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- var players = event.dcpandi;
- if (!players || !players.length) return false;
- var source = player.storage.dcpandi_effect;
- return get.itemtype(source) != "player" || !source.isIn();
- },
- pandi_wrapKey: function () {
- var str = "";
- for (var arg of arguments) {
- if (arg === null || arg === undefined) {
- str += arg + "-";
- continue;
- }
- switch (get.itemtype(arg)) {
- case "player":
- str += "p:" + arg.playerid;
- break;
- case "card":
- if (arg.cardid) {
- str += "c:" + arg.cardid;
- } else {
- str += "c:" + arg.name;
- }
- break;
- default:
- str += "n:" + arg;
- break;
- }
- str += "-";
- }
- return str;
- },
- pandi_effect: function (target, card, player, viewer) {
- if (!_status.event) return get.effect(target, card, player, viewer);
- var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments);
- var effect = _status.event.getTempCache("effect", key);
- if (effect !== undefined) return effect;
- effect = get.effect(target, card, player, viewer);
- _status.event.putTempCache("effect", key, effect);
- return effect;
- },
- pandi_canUse: function (player, card, target, arg1, arg2) {
- if (!_status.event) return player.canUse(card, target, arg1, arg2);
- var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments);
- var effect = _status.event.getTempCache("canUse", key);
- if (effect !== undefined) return effect;
- effect = player.canUse(card, target, arg1, arg2);
- _status.event.putTempCache("canUse", key, effect);
- return effect;
- },
- pandi_effect_use: function (target, card, player, viewer) {
- if (!_status.event) return get.effect_use(target, card, player, viewer);
- var key = lib.skill.dcpandi.pandi_wrapKey.apply(null, arguments);
- var effect = _status.event.getTempCache("effect_use", key);
- if (effect !== undefined) return effect;
- effect = get.effect_use(target, card, player, viewer);
- _status.event.putTempCache("effect_use", key, effect);
- return effect;
- },
- onChooseToUse: function (event) {
- if (!game.online && event.type == "phase" && !event.dcpandi) {
- var players = game.filterPlayer(function (current) {
- return current != event.player && current.getHistory("sourceDamage").length == 0;
- });
- event.set("dcpandi", players);
- }
- },
- filterTarget: function (card, player, target) {
- var players = _status.event.dcpandi;
- if (!players || !players.length) return false;
- return players.includes(target);
- },
- content: function () {
- if (target.isIn()) {
- player.storage.dcpandi_effect = target;
- player.addTempSkill("dcpandi_effect", "phaseUseAfter");
- }
- },
- ai: {
- threaten: 4,
- order: 12,
- result: {
- player: function (player, target) {
- return player.getCards("hs").reduce(function (eff, card) {
- return Math.max(eff, lib.skill.dcpandi.getUseValue(card, target, player) - lib.skill.dcpandi.getUseValue(card, player, player));
- }, 0);
- },
- },
- },
- getUseValue: function (card, player, viewer) {
- if (typeof card == "string") {
- card = { name: card, isCard: true };
- }
- var key = lib.skill.dcpandi.pandi_wrapKey(card, player, viewer);
- if (_status.event) {
- var uv = _status.event.getTempCache("getUseValue", key);
- if (uv !== undefined) {
- return uv;
- }
- }
- var targets = game.filterPlayer();
- var value = [];
- var min = 0;
- var info = get.info(card);
- if (!info || info.notarget) {
- if (_status.event) {
- _status.event.putTempCache("getUseValue", key, 0);
- }
- return 0;
- }
- var range;
- var select = get.copy(info.selectTarget);
- if (select == undefined) {
- if (info.filterTarget == undefined) {
- if (_status.event) {
- _status.event.putTempCache("getUseValue", key, true);
- }
- return true;
- }
- range = [1, 1];
- } else if (typeof select == "number") range = [select, select];
- else if (get.itemtype(select) == "select") range = select;
- else if (typeof select == "function") range = select(card, player);
- if (info.singleCard) range = [1, 1];
- game.checkMod(card, player, range, "selectTarget", player);
- if (!range) {
- if (_status.event) {
- _status.event.putTempCache("getUseValue", key, 0);
- }
- return 0;
- }
- for (var i = 0; i < targets.length; i++) {
- if (lib.skill.dcpandi.pandi_canUse(player, card, targets[i], null, true)) {
- var eff = lib.skill.dcpandi.pandi_effect(targets[i], card, player, viewer);
- value.push(eff);
- }
- }
- value.sort(function (a, b) {
- return b - a;
- });
- for (var i = 0; i < value.length; i++) {
- if (i == range[1] || (range[1] != -1 && value[i] <= 0)) break;
- min += value[i];
- }
- if (_status.event) {
- _status.event.putTempCache("getUseValue", key, min);
- }
- return min;
- },
- subSkill: {
- effect: {
- audio: "dcpandi",
- charlotte: true,
- priority: Infinity,
- onremove: true,
- mark: "character",
- intro: {
- content: "下一张牌视为由$使用",
- },
- trigger: { player: "useCardBefore" },
- forced: true,
- filter: function (event, player) {
- var source = player.storage.dcpandi_effect;
- return get.itemtype(source) == "player" && source.isIn();
- },
- logTarget: (event, player) => player.storage.dcpandi_effect,
- content: function () {
- trigger.player = player.storage.dcpandi_effect;
- trigger.noai = true;
- player.removeSkill("dcpandi_effect");
- game.delay(0.5);
- },
- ai: {
- order: function (card, player, target, current) {
- if (typeof card != "object") return;
- var source = player.storage.dcpandi_effect;
- if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return;
- return [0, lib.skill.dcpandi.pandi_effect_use(target, card, source, player), 0, lib.skill.dcpandi.pandi_effect(target, card, source, target)];
- },
- },
- mod: {
- selectCard: function (card, player, range) {
- var source = player.storage.dcpandi_effect;
- if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return;
- var range,
- info = get.info(card);
- var select = get.copy(info.selectTarget);
- if (select == undefined) {
- if (info.filterTarget == undefined) return [0, 0];
- range = [1, 1];
- } else if (typeof select == "number") range = [select, select];
- else if (get.itemtype(select) == "select") range = select;
- else if (typeof select == "function") range = select(card, source);
- game.checkMod(card, source, range, "selectTarget", source);
- },
- cardEnabled2: function (card, player, event) {
- var source = player.storage.dcpandi_effect;
- if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return;
- var check = game.checkMod(card, source, event, "unchanged", "cardEnabled2", source);
- return check;
- },
- cardEnabled: function (card, player, event) {
- var source = player.storage.dcpandi_effect;
- if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return;
- if (event === "forceEnable") {
- var mod = game.checkMod(card, source, event, "unchanged", "cardEnabled", source);
- if (mod != "unchanged") return mod;
- return true;
- } else {
- var filter = get.info(card).enable;
- if (!filter) return;
- var mod = game.checkMod(card, player, source, "unchanged", "cardEnabled", source);
- if (mod != "unchanged") return mod;
- if (typeof filter == "boolean") return filter;
- if (typeof filter == "function") return filter(card, source, event);
- }
- },
- cardUsable: function (card, player, num) {
- var source = player.storage.dcpandi_effect;
- if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return;
- var event = _status.event;
- if (event.type == "chooseToUse_button") event = event.getParent();
- if (source != _status.event.player) return true;
- if (info.updateUsable == "phaseUse") {
- if (event.getParent().name != "phaseUse") return true;
- if (event.getParent().player != source) return true;
- }
- event.addCount_extra = true;
- var num = info.usable;
- if (typeof num == "function") num = num(card, source);
- num = game.checkMod(card, source, num, event, "cardUsable", source);
- if (typeof num != "number") return true;
- if (source.countUsed(card) < num) return true;
- if (
- game.hasPlayer(function (current) {
- return game.checkMod(card, source, current, false, "cardUsableTarget", source);
- })
- ) {
- return true;
- }
- return false;
- },
- playerEnabled: function (card, player, target) {
- var source = player.storage.dcpandi_effect;
- if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return;
- return lib.filter.targetEnabledx(card, source, target);
- },
- targetInRange: function (card, player, target) {
- var source = player.storage.dcpandi_effect;
- if (!source.isIn() || get.itemtype(source) != "player" || get.itemtype(source.storage.dcpandi_effect) == "player") return;
- return lib.filter.targetInRange(card, source, target);
- },
- },
- },
- },
- },
- //新服灭霸
- dctongye: {
- audio: 2,
- trigger: {
- global: ["phaseBefore", "dieAfter"],
- player: "enterGame",
- },
- forced: true,
- filter: function (event, player) {
- if (game.countGroup() > 4) return false;
- if (event.name == "die") return true;
- return event.name != "phase" || game.phaseNumber == 0;
- },
- content: function () {
- player.addSkill("dctongye_buff");
- var num = game.countGroup();
- if (num <= 4) {
- player.addMark("dctongye_handcard", 3, false);
- game.log(player, "手牌上限", "#y+3");
- }
- if (num <= 3) {
- player.addMark("dctongye_range", 3, false);
- game.log(player, "攻击范围", "#y+3");
- }
- if (num <= 2) {
- player.addMark("dctongye_sha", 3, false);
- game.log(player, "使用杀的次数上限", "#y+3");
- }
- if (num <= 1) {
- player.addMark("dctongye_draw", 3, false);
- game.log(player, "摸牌阶段额定摸牌数", "#y+3");
- }
- },
- subSkill: {
- buff: {
- audio: "dctongye",
- trigger: { player: "phaseDrawBegin2" },
- forced: true,
- filter: function (event, player) {
- if (!player.hasMark("dctongye_draw")) return false;
- return !event.numFixed;
- },
- content: function () {
- trigger.num += player.countMark("dctongye_draw");
- },
- charlotte: true,
- onremove: ["dctongye_handcard", "dctongye_range", "dctongye_sha", "dctongye_draw"],
- mark: true,
- marktext: "统",
- intro: {
- content: function (storage, player) {
- var str = "";
- var hand = player.countMark("dctongye_handcard"),
- range = player.countMark("dctongye_range"),
- sha = player.countMark("dctongye_sha"),
- draw = player.countMark("dctongye_draw");
- if (hand > 0) {
- str += "手牌上限+" + hand + ";";
- }
- if (range > 0) {
- str += "攻击范围+" + range + ";";
- }
- if (sha > 0) {
- str += "使用【杀】的次数上限+" + sha + ";";
- }
- if (draw > 0) {
- str += "摸牌阶段额定摸牌数+" + draw + "。";
- }
- str = str.slice(0, -1) + "。";
- return str;
- },
- },
- mod: {
- maxHandcard: function (player, num) {
- return num + player.countMark("dctongye_handcard");
- },
- attackRange: function (player, num) {
- return num + player.countMark("dctongye_range");
- },
- cardUsable: function (card, player, num) {
- if (card.name == "sha") {
- return num + player.countMark("dctongye_sha");
- }
- },
- },
- ai: {
- threaten: 2.6,
- },
- },
- },
- },
- dcmianyao: {
- audio: 2,
- trigger: {
- player: "phaseDrawEnd",
- },
- direct: true,
- filter: function (event, player) {
- return player.countCards("h") > 0;
- },
- content: function () {
- "step 0";
- player
- .chooseCard("h", get.prompt("dcmianyao"), "展示点数最小的一张牌并随机插入牌堆中,然后于回合结束时摸此牌点数张牌。", function (card, player) {
- var num = get.number(card, player);
- return !player.hasCard(card2 => {
- return card != card2 && get.number(card2, player) < num;
- });
- })
- .set("ai", card => {
- var player = _status.event.player;
- var value = player.getUseValue(card, null, true);
- if (value > 5 && get.number(card) <= 2) return 0;
- return 1 + 1 / Math.max(0.1, value);
- });
- "step 1";
- if (result.bool) {
- player.logSkill("dcmianyao");
- var card = result.cards[0];
- event.card = card;
- player.showCards([card], get.translation(player) + "发动了【免徭】");
- } else event.finish();
- "step 2";
- player.$throw(1, 1000);
- player.lose(card, ui.cardPile).insert_index = function () {
- return ui.cardPile.childNodes[get.rand(0, ui.cardPile.childNodes.length - 1)];
- };
- player.addTempSkill("dcmianyao_draw");
- var num = get.number(card);
- if (num > 0) player.addMark("dcmianyao_draw", num, false);
- },
- subSkill: {
- draw: {
- trigger: {
- player: "phaseEnd",
- },
- filter: function (event, player) {
- return player.hasMark("dcmianyao_draw");
- },
- forced: true,
- charlotte: true,
- onremove: true,
- content: function () {
- player.draw(player.countMark("dcmianyao_draw"));
- },
- },
- },
- },
- dcchangqu: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- selectTarget: function () {
- return [1, game.countPlayer() - 1];
- },
- complexSelect: true,
- complexTarget: true,
- multitarget: true,
- multiline: true,
- filterTarget: function (card, player, target) {
- if (player == target) return false;
- var next = player.getNext(),
- prev = player.getPrevious();
- var selected = ui.selected.targets;
- if (!selected.includes(next) && !selected.includes(prev)) return target == next || target == prev;
- for (var i of selected) {
- if (i.getNext() == target || i.getPrevious() == target) return true;
- }
- return false;
- },
- contentBefore: function () {
- event.getParent()._dcchangqu_targets = targets.slice();
- },
- content: function () {
- "step 0";
- event.targets = event.getParent()._dcchangqu_targets;
- var current = targets[0];
- current.addMark("dcchangqu_warship");
- current.addMark("dcchangqu_warshipx", 1, false);
- event.num = 0;
- game.delayx();
- "step 1";
- var target = targets.shift();
- event.target = target;
- var num = Math.max(1, event.num);
- var nextPlayer = targets.find(i => {
- return i.isIn();
- });
- if (target.hasMark("dcchangqu_warshipx")) {
- var prompt2 = "是否交给" + get.translation(player) + get.cnNumber(num) + "张手牌?" + (nextPlayer ? "若如此做,将“战舰”移动给" + get.translation(nextPlayer) + "," : ",") + "否则你下次受到的属性伤害值+" + num;
- target
- .chooseCard(get.translation(player) + "对你发动了【长驱】", prompt2, num)
- .set("ai", card => {
- if (_status.event.att > 0) return 15 - get.value(card);
- if (_status.event.take) return 0;
- return 8.2 - 0.8 * Math.min(5, _status.event.target.hp + _status.event.target.hujia) - get.value(card);
- })
- .set("att", get.attitude(target, player))
- .set("take", function () {
- var base = num;
- var getEffect = function (target, player, num) {
- var natures = ["fire", "thunder", "ice"];
- return (
- natures
- .map(nature => {
- return (get.damageEffect(target, target, player, nature) * Math.sqrt(num)) / Math.min(1.5, 1 + target.countCards("h"));
- })
- .reduce((sum, eff) => {
- return sum + eff;
- }, 0) / natures.length
- );
- };
- var eff = getEffect(player, player, base);
- return targets
- .some((current, ind) => {
- var num = base + ind + 1;
- var effx = getEffect(current, player, num);
- return effx < eff;
- })
- .set("target", target);
- });
- } else event.goto(4);
- "step 2";
- if (result.bool) {
- var cards = result.cards;
- target.give(cards, player);
- event.num++;
- } else {
- target.addSkill("dcchangqu_add");
- target.addMark("dcchangqu_add", Math.max(1, event.num), false);
- target.link(true);
- event.goto(4);
- }
- "step 3";
- var nextPlayer = targets.find(i => {
- return i.isIn();
- });
- if (nextPlayer) {
- target.line(nextPlayer);
- nextPlayer.addMark("dcchangqu_warship", target.countMark("dcchangqu_warship"));
- nextPlayer.addMark("dcchangqu_warshipx", target.countMark("dcchangqu_warshipx"), false);
- event.goto(1);
- game.delayx();
- }
- target.removeMark("dcchangqu_warship", target.countMark("dcchangqu_warship"));
- target.removeMark("dcchangqu_warshipx", target.countMark("dcchangqu_warshipx"), false);
- "step 4";
- var targets = game.players.slice().concat(game.dead);
- targets.forEach(i => {
- delete i.storage.dcchangqu_warshipx;
- });
- },
- ai: {
- order: 10,
- expose: 0.05,
- result: {
- target: function (player, target) {
- var att = get.attitude(player, target);
- var targets = game.filterPlayer(i => i != player);
- targets.sortBySeat(player);
- var targets2 = targets.reverse();
- var sum = 0;
- var maxSum = -Infinity,
- maxIndex = -1;
- var maxSum2 = -Infinity,
- maxIndex2 = -1;
- for (var i = 0; i < targets.length; i++) {
- var current = targets[i];
- var att = -get.attitude(player, current) - 0.1;
- var val = Math.sqrt(i + 1) * att;
- val /= 0.01 + Math.max(3, current.countCards("h") / 2);
- sum += val;
- if (sum > maxSum) {
- maxSum = sum;
- maxIndex = i;
- }
- }
- var sum = 0;
- for (var i = 0; i < targets2.length; i++) {
- var current = targets[i];
- var att = -get.attitude(player, current) - 0.1;
- var val = Math.sqrt(i + 1) * att;
- val /= 0.01 + Math.max(3, current.countCards("h") / 2);
- sum += val;
- if (sum > maxSum2) {
- maxSum2 = sum;
- maxIndex2 = i;
- }
- }
- if (maxSum < maxSum2) {
- targets = targets2;
- maxIndex = maxIndex2;
- }
- if (ui.selected.targets.length > maxIndex) return -100 * get.sgnAttitude(player, target);
- if (target == targets[ui.selected.targets.length]) return get.sgnAttitude(player, target);
- return 0;
- },
- },
- },
- subSkill: {
- warship: {
- marktext: "舰",
- intro: {
- name: "战舰",
- name2: "战舰",
- content: "这里停了&艘战舰!不过啥用没有。",
- },
- },
- add: {
- trigger: {
- player: "damageBegin3",
- },
- filter: function (event, player) {
- return event.hasNature() && player.hasMark("dcchangqu_add");
- },
- forced: true,
- onremove: true,
- charlotte: true,
- content: function () {
- "step 0";
- trigger.num += player.countMark("dcchangqu_add");
- player.removeSkill("dcchangqu_add");
- },
- marktext: "驱",
- intro: {
- content: "下次受到的属性伤害+#",
- },
- },
- },
- },
- //周不疑
- dcshiji: {
- audio: 2,
- trigger: {
- global: "phaseJieshuBegin",
- },
- filter: function (event, player) {
- return event.player.isIn() && !event.player.getHistory("sourceDamage").length;
- },
- direct: true,
- content: function () {
- "step 0";
- trigger.player.addTempSkill("dcshiji_forbidself");
- var list = [];
- for (var name of lib.inpile) {
- var type = get.type(name);
- if (type != "trick") continue;
- if (player.getStorage("dcshiji_used").includes(name)) continue;
- var card = {
- name: name,
- storage: { dcshiji: true },
- };
- if (trigger.player.hasUseTarget(card)) {
- list.push([type, "", name]);
- }
- }
- if (list.length) {
- player
- .chooseButton([get.prompt("dcshiji", trigger.player), [list, "vcard"]])
- .set("ai", button => {
- if (_status.event.tochoose) return _status.event.getTrigger().player.getUseValue({ name: button.link[2] });
- return 0;
- })
- .set(
- "tochoose",
- get.attitude(player, trigger.player) > 0 &&
- trigger.player.hasCard(card => {
- return get.value(card) < 7;
- }, "hes")
- );
- } else event.finish();
- "step 1";
- if (result.bool) {
- var card = {
- name: result.links[0][2],
- storage: { dcshiji: true },
- };
- var str = get.translation(card);
- player.logSkill("dcshiji", trigger.player);
- player.addTempSkill("dcshiji_used", "roundStart");
- player.markAuto("dcshiji_used", [card.name]);
- player.popup(str);
- game.log(player, "声明了", "#y" + str);
- game.broadcastAll(function (card) {
- lib.skill.dcshiji_backup.viewAs = card;
- lib.skill.dcshiji_backup.prompt = "十计:是否将一张牌当做" + get.translation(card) + "使用?";
- }, card);
- var next = trigger.player.chooseToUse();
- next.set("openskilldialog", "十计:是否将一张牌当做" + get.translation(card) + "使用?");
- next.set("norestore", true);
- next.set("addCount", false);
- next.set("_backupevent", "dcshiji_backup");
- next.set("custom", {
- add: {},
- replace: { window: function () {} },
- });
- next.backup("dcshiji_backup");
- }
- },
- subSkill: {
- backup: {
- filterCard: function (card) {
- return get.itemtype(card) == "card";
- },
- position: "hes",
- selectCard: 1,
- check: card => 7 - get.value(card),
- popname: true,
- },
- used: {
- charlotte: true,
- onremove: true,
- mark: true,
- marktext: "计",
- intro: {
- content: "本轮已声明过$",
- },
- },
- forbidself: {
- charlotte: true,
- mod: {
- targetEnabled: function (card, player, target) {
- if (player == target && card.storage && card.storage.dcshiji) return false;
- },
- },
- },
- },
- },
- dcsilun: {
- audio: 2,
- trigger: {
- player: ["phaseZhunbeiBegin", "damageEnd"],
- },
- frequent: true,
- content: function () {
- "step 0";
- player.draw(4);
- event.count = 0;
- event.equipCount = {};
- game.countPlayer(current => {
- event.equipCount[current.playerid] = current.countCards("e");
- }, true);
- "step 1";
- if (!player.countCards("he")) event.goto(5);
- else
- player.chooseCard("四论:选择一张牌(" + (event.count + 1) + "/" + "4)", "然后选择将此牌置于场上或牌堆的两端", true, "he").set("ai", card => {
- var player = _status.event.player;
- if (["equip", "delay"].includes(get.type(card)) && player.hasValueTarget(card)) return 50;
- return 50 - get.value(card);
- });
- "step 2";
- if (result.bool) {
- var card = result.cards[0];
- event.card = card;
- event.count++;
- var choices = ["牌堆顶", "牌堆底"];
- var type = get.type(card);
- if (
- (type == "equip" &&
- game.hasPlayer(current => {
- return current.canEquip(card);
- })) ||
- (type == "delay" &&
- game.hasPlayer(current => {
- return current.canAddJudge(card);
- }))
- )
- choices.unshift("场上");
- player
- .chooseControl(choices)
- .set("prompt", "请选择要将" + get.translation(card) + "置于的位置")
- .set("ai", () => {
- return _status.event.choice;
- })
- .set(
- "choice",
- (function () {
- if (["equip", "delay"].includes(get.type(card)) && player.hasValueTarget(card) && choices.includes("场上")) return "场上";
- var val = get.value(card);
- var next = _status.currentPhase;
- if (next) {
- if (trigger.name == "damage") next = next.getNext();
- if ((get.attitude(player, next) > 0 && val >= 6) || (get.attitude(player, next) < 0 && val <= 4.5)) return "牌堆顶";
- }
- return "牌堆底";
- })()
- );
- }
- "step 3";
- if (result.control == "场上") {
- var type = get.type(card);
- player
- .chooseTarget("将" + get.translation(card) + "置于一名角色的场上", true, (card, player, target) => {
- return _status.event.targets.includes(target);
- })
- .set(
- "targets",
- game.filterPlayer(current => {
- if (type == "equip") return current.canEquip(card);
- if (type == "delay") return current.canAddJudge(card);
- return false;
- })
- )
- .set("ai", target => {
- var player = _status.event.player;
- var card = _status.event.card;
- return (
- get.attitude(player, target) *
- (get.type(card) == "equip"
- ? get.value(card, target)
- : get.effect(
- target,
- {
- name: card.viewAs || card.name,
- cards: [card],
- },
- target,
- target
- ))
- );
- })
- .set("card", card);
- } else {
- player.$throw(card, 1000);
- var next = player.lose(card, ui.cardPile, "visible");
- if (result.control == "牌堆顶") next.insert_card = true;
- game.log(player, "将", card, "置于了", "#y" + result.control);
- }
- "step 4";
- if (result.bool && result.targets && result.targets.length) {
- var target = result.targets[0];
- player.line(target);
- player.$give(card, target, false);
- if (get.type(card) == "equip") {
- target.equip(card);
- } else {
- target.addJudge(card);
- }
- }
- "step 5";
- game.countPlayer(current => {
- var count = current.countCards("e");
- var prevCount = event.equipCount[current.playerid] || 0;
- if (count != prevCount) {
- current.link(false);
- current.turnOver(false);
- }
- event.equipCount[current.playerid] = count;
- });
- if (event.count < 4) event.goto(1);
- },
- },
- //杜预
- dcjianguo: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return !player.hasSkill("dcjianguo_0") || !player.hasSkill("dcjianguo_1");
- },
- chooseButton: {
- dialog: function (event, player) {
- var dialog = ui.create.dialog("谏国:请选择一项", "hidden");
- dialog.add([
- [
- ["discard", "令一名角色摸一张牌,然后弃置一半手牌"],
- ["draw", "令一名角色弃置一张牌,然后摸等同于手牌数一半的牌"],
- ],
- "textbutton",
- ]);
- return dialog;
- },
- filter: function (button, player) {
- if (button.link == "discard" && player.hasSkill("dcjianguo_0")) return false;
- if (button.link == "draw" && player.hasSkill("dcjianguo_1")) return false;
- return true;
- },
- check: function (button) {
- var player = _status.event.player;
- if (button.link == "discard") {
- var discard = Math.max.apply(
- Math,
- game
- .filterPlayer(current => {
- return lib.skill.dcjianguo_discard.filterTarget(null, player, current);
- })
- .map(current => {
- return get.effect(current, "dcjianguo_discard", player, player);
- })
- );
- return discard;
- }
- if (button.link == "draw") {
- var draw = Math.max.apply(
- Math,
- game
- .filterPlayer(current => {
- return lib.skill.dcjianguo_draw.filterTarget(null, player, current);
- })
- .map(current => {
- return get.effect(current, "dcjianguo_draw", player, player);
- })
- );
- return draw;
- }
- return 0;
- },
- backup: function (links) {
- return get.copy(lib.skill["dcjianguo_" + links[0]]);
- },
- prompt: function (links) {
- if (links[0] == "discard") return "令一名角色摸一张牌,然后弃置一半手牌";
- return "令一名角色弃置一张牌,然后摸等同于手牌数一半的牌";
- },
- },
- ai: {
- order: 10,
- threaten: 2.8,
- result: {
- //想让杜预两个技能自我联动写起来太累了,开摆
- player: 1,
- },
- },
- subSkill: {
- 0: { charlotte: true },
- 1: { charlotte: true },
- backup: { audio: "dcjianguo" },
- discard: {
- audio: "dcjianguo",
- filterTarget: () => true,
- filterCard: () => false,
- selectCard: -1,
- content: function () {
- "step 0";
- player.addTempSkill("dcjianguo_0", "phaseUseAfter");
- target.draw();
- game.delayex();
- "step 1";
- var num = Math.ceil(target.countCards("h") / 2);
- if (num > 0) target.chooseToDiscard(num, true, "谏国:请弃置" + get.cnNumber(num) + "张手牌");
- },
- ai: {
- result: {
- target: function (player, target) {
- return 1.1 - Math.floor(target.countCards("h") / 2);
- },
- },
- tag: {
- gain: 1,
- loseCard: 2,
- },
- },
- },
- draw: {
- audio: "dcjianguo",
- filterTarget: function (card, player, target) {
- return target.countCards("he");
- },
- filterCard: () => false,
- selectCard: -1,
- content: function () {
- "step 0";
- player.addTempSkill("dcjianguo_1", "phaseUseAfter");
- target.chooseToDiscard("he", true, "谏国:请弃置一张牌");
- "step 1";
- var num = Math.ceil(target.countCards("h") / 2);
- if (num > 0) target.draw(num);
- },
- ai: {
- result: {
- target: function (player, target) {
- var fix = 0;
- var num = target.countCards("h");
- if (player == target && num % 2 == 1 && num >= 5) fix += 1;
- return Math.ceil(num / 2 - 0.5) + fix;
- },
- },
- tag: {
- loseCard: 1,
- gain: 2,
- },
- },
- },
- },
- },
- dcdyqingshi: {
- audio: 2,
- trigger: {
- player: "useCardToPlayered",
- },
- filter: function (event, player) {
- if (player != _status.currentPhase) return false;
- if (!event.isFirstTarget) return false;
- if (event.card.name != "sha" && get.type(event.card, false) != "trick") return false;
- if (player.countCards("h") != player.getHistory("useCard").indexOf(event.getParent()) + 1) return false;
- return event.targets.some(target => {
- return target != player && target.isIn();
- });
- },
- direct: true,
- locked: false,
- content: function () {
- "step 0";
- var targets = trigger.targets.filter(target => {
- return target != player && target.isIn();
- });
- player
- .chooseTarget(get.prompt("dcdyqingshi"), "对一名不为你的目标角色造成1点伤害", (card, player, target) => {
- return _status.event.targets.includes(target);
- })
- .set("ai", target => {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- })
- .set("targets", targets);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcdyqingshi", target);
- target.damage();
- }
- },
- mod: {
- aiOrder: function (player, card, num) {
- if (_status.currentPhase != player) return;
- var cardsh = [];
- if (Array.isArray(card.cards)) {
- cardsh.addArray(
- card.cards.filter(card => {
- return get.position(card) == "h";
- })
- );
- }
- var del = player.countCards("h") - cardsh.length - player.getHistory("useCard").length - 1;
- if (del < 0) return;
- if (del > 0) {
- if (card.name == "sha" || get.type(card, false) != "trick") return num / 3;
- return num + 1;
- }
- return num + 15;
- },
- },
- },
- //甘糜
- dcchanjuan: {
- init: function (player) {
- if (!player.storage.dcchanjuan) {
- player.storage.dcchanjuan = {};
- }
- },
- audio: 2,
- trigger: { player: "useCardAfter" },
- filter: function (event, player) {
- if (
- event.targets.length != 1 ||
- !player.hasHistory("lose", evt => {
- if (evt.getParent() != event) return false;
- return event.cards.every(card => evt.hs.includes(card));
- })
- )
- return false;
- if (!["basic", "trick"].includes(get.type(event.card, false))) return false;
- if (event.getParent(2).name == "dcchanjuan") return false;
- return !player.storage.dcchanjuan[event.card.name] || player.storage.dcchanjuan[event.card.name] < 2;
- },
- direct: true,
- content: function () {
- "step 0";
- var card = {
- name: trigger.card.name,
- nature: trigger.card.nature,
- isCard: true,
- };
- player
- .chooseUseTarget(card, get.prompt("dcchanjuan"), false, false)
- .set("prompt2", "视为再使用一张" + get.translation(card))
- .set("logSkill", "dcchanjuan");
- "step 1";
- if (result.bool) {
- if (!player.storage.dcchanjuan[trigger.card.name]) player.storage.dcchanjuan[trigger.card.name] = 0;
- player.storage.dcchanjuan[trigger.card.name]++;
- var list1 = trigger.targets,
- list2 = result.targets;
- if (list1.slice().removeArray(list2).length == 0 && list2.slice().removeArray(list1).length == 0) player.draw();
- }
- },
- ai: { threaten: 2 },
- mark: true,
- intro: {
- markcount: storage => 0,
- content: function (storage) {
- var str = "已使用牌名:",
- names = Object.keys(storage);
- if (!names.length) str += "无";
- else
- names.forEach(name => {
- str += "
【";
- str += get.translation(name);
- str += "】:";
- str += storage[name] + "次";
- });
- return str;
- },
- },
- },
- dcxunbie: {
- audio: 2,
- trigger: {
- player: "dying",
- },
- filter: function (event, player) {
- if (player.hp > 0) return false;
- var characters = ["dc_ganfuren", "dc_mifuren"];
- game.countPlayer(current => {
- if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") {
- characters.remove("dc_ganfuren");
- }
- if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") {
- characters.remove("dc_mifuren");
- }
- });
- return characters.length;
- },
- check: () => true,
- skillAnimation: true,
- animationColor: "fire",
- limited: true,
- derivation: ["dcyongjue", "dcshushen", "dcshenzhi", "dcguixiu", "dccunsi"],
- content: function () {
- "step 0";
- player.awakenSkill("dcxunbie");
- if (player.name1 == "ganfurenmifuren" || player.name2 == "ganfurenmifuren") {
- var characters = ["dc_ganfuren", "dc_mifuren"];
- game.countPlayer(current => {
- if (current.name1 == "dc_ganfuren" || current.name2 == "dc_ganfuren") {
- characters.remove("dc_ganfuren");
- }
- if (current.name1 == "dc_mifuren" || current.name2 == "dc_mifuren") {
- characters.remove("dc_mifuren");
- }
- });
- if (characters.length == 1) event._result = { control: characters[0] };
- else {
- player
- .chooseControl(characters)
- .set("dialog", ["选择要替换成的武将", [characters, "character"]])
- .set("ai", () => [0, 1].randomGet());
- }
- } else event.goto(2);
- "step 1";
- var character = result.control;
- if (!_status.characterlist) {
- lib.skill.pingjian.initList();
- }
- player.reinitCharacter("ganfurenmifuren", character);
- "step 2";
- player.recover(1 - player.hp);
- player.addTempSkill("dcxunbie_muteki", { player: "phaseAfter" });
- },
- subSkill: {
- muteki: {
- trigger: {
- player: "damageBegin4",
- },
- charlotte: true,
- forced: true,
- content: function () {
- trigger.cancel();
- },
- mark: true,
- intro: { content: "防止受到的所有伤害直到我的回合结束" },
- ai: {
- nofire: true,
- nothunder: true,
- nodamage: true,
- effect: {
- target: function (card, player, target, current) {
- if (get.tag(card, "damage")) return "zeroplayertarget";
- },
- },
- },
- },
- },
- },
- //散装版糜夫人
- dcguixiu: {
- audio: "guixiu",
- trigger: {
- player: "phaseBegin",
- },
- forced: true,
- onremove: true,
- filter: function (event, player) {
- return !player.hasMark("dcguixiu");
- },
- group: "dcguixiu_rec",
- content: function () {
- player.addMark("dcguixiu", 1, false);
- player.draw(2);
- },
- subSkill: {
- rec: {
- audio: "guixiu",
- trigger: {
- player: "useSkillAfter",
- },
- forced: true,
- filter: function (event, player) {
- return event.skill == "dccunsi" && player.isDamaged();
- },
- content: function () {
- player.recover();
- },
- },
- },
- },
- dccunsi: {
- audio: "cunsi",
- enable: "phaseUse",
- limited: true,
- skillAnimation: true,
- animationColor: "orange",
- filterTarget: true,
- derivation: "dcyongjue",
- content: function () {
- "step 0";
- player.awakenSkill("dccunsi");
- target.addSkillLog("dcyongjue");
- if (target != player) player.draw(2);
- },
- ai: {
- order: 10,
- result: {
- target: 1,
- },
- },
- },
- dcyongjue: {
- audio: "yongjue",
- trigger: {
- player: "useCard",
- },
- filter: function (event, player) {
- var evtx = event.getParent("phaseUse");
- if (!evtx || evtx.player != player) return false;
- return (
- player
- .getHistory("useCard", evt => {
- return evt.card.name == "sha" && event.getParent("phaseUse") == evtx;
- })
- .indexOf(event) == 0
- );
- },
- direct: true,
- content: function () {
- "step 0";
- var choices = ["选项一"];
- var choiceList = ["令" + get.translation(trigger.card) + "不计入次数", "获得此牌"];
- if (trigger.cards.length) {
- choices.push("选项二");
- choiceList[1] = "获得" + get.translation(trigger.cards);
- } else choiceList[1] = '' + choiceList[1] + "";
- choices.push("cancel2");
- player
- .chooseControl(choices)
- .set("choiceList", choiceList)
- .set("ai", () => {
- return _status.event.choice;
- })
- .set(
- "choice",
- (function () {
- if (choices.length == 3 && trigger.addCount === false) return 1;
- if (player.getCardUsable({ name: "sha" }) < player.countCards("hs", "sha")) return 0;
- if (choices.length == 3) return 1;
- return 0;
- })()
- );
- "step 1";
- if (result.control == "cancel2") {
- event.finish();
- return;
- }
- player.logSkill("dcyongjue");
- game.log(player, "选择了", "#y" + result.control);
- if (result.control == "选项一") {
- if (trigger.addCount !== false) {
- trigger.addCount = false;
- trigger.player.getStat().card.sha--;
- }
- } else {
- var cards = trigger.cards.filterInD();
- if (cards.length) player.gain(cards, "gain2");
- }
- },
- },
- //散装版甘夫人
- dcshushen: {
- audio: "shushen",
- trigger: {
- player: "recoverEnd",
- },
- direct: true,
- content: function () {
- "step 0";
- event.num = trigger.num;
- "step 1";
- player.chooseTarget(get.prompt("dcshushen"), "选择一名其他角色,然后令其回复1点体力或令你与其各摸一张牌", lib.filter.notMe).set("ai", target => {
- var player = _status.event.player;
- return get.recoverEffect(target, player, player) / 2 + get.attitude(player, target);
- });
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("dcshushen", target);
- event.num--;
- var choices = ["选项二"];
- var choiceList = ["令" + get.translation(target) + "回复1点体力", "你与" + get.translation(target) + "各摸一张牌"];
- if (target.isDamaged()) choices.unshift("选项一");
- else choiceList[0] = '' + choiceList[0] + "";
- player
- .chooseControl(choices)
- .set("choiceList", choiceList)
- .set("prompt", "淑慎:请选择一项")
- .set("ai", () => {
- return _status.event.choice;
- })
- .set(
- "choice",
- (function () {
- if (target.hp <= 2 || get.recoverEffect(target, player, player) > 20) return 0;
- return "选项二";
- })()
- );
- } else event.finish();
- "step 3";
- if (result.control == "选项一") {
- target.recover();
- } else {
- var drawers = [player, target].sortBySeat(_status.currentPhase);
- game.asyncDraw(drawers);
- }
- "step 4";
- if (event.num > 0) event.goto(1);
- },
- },
- dcshenzhi: {
- audio: "shenzhi",
- trigger: {
- player: "phaseZhunbeiBegin",
- },
- filter: function (event, player) {
- return player.countCards("h") > player.hp;
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseToDiscard(get.prompt("dcshenzhi"), "弃置一张手牌,然后回复1点体力")
- .set("logSkill", "dcshenzhi")
- .set("ai", card => {
- var player = _status.event.player;
- if (!player.isDamaged()) return 0;
- return Math.min(3, 10 - 2 * player.hp) - get.value(card);
- });
- "step 1";
- if (result.bool) {
- player.recover();
- }
- },
- },
- //阮籍
- dczhaowen: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- filter: function (event, player) {
- return player.countCards("h");
- },
- check: function (event, player) {
- return player.hasCard(card => {
- return get.color(card) == "black" || (get.color(card) == "red" && player.hasValueTarget(card));
- });
- },
- content: function () {
- "step 0";
- player.showHandcards();
- "step 1";
- player.addTempSkill("dczhaowen_effect");
- game.broadcastAll(function (cards) {
- cards.forEach(card => card.addGaintag("dczhaowen_tag"));
- }, player.getCards("h"));
- },
- ai: {
- threaten: 3,
- },
- subSkill: {
- effect: {
- audio: "dczhaowen",
- enable: "chooseToUse",
- charlotte: true,
- onremove: function (player) {
- player.removeGaintag("dczhaowen_tag");
- },
- hiddenCard: function (player, name) {
- return (
- get.type(name) == "trick" &&
- !player.getStorage("dczhaowen_viewed").includes(name) &&
- player.countCards("h", card => {
- return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag");
- }) > 0
- );
- },
- filter: function (event, player) {
- if (
- !player.hasCard(card => {
- return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag");
- })
- )
- return false;
- var storage = player.getStorage("dczhaowen_viewed");
- for (var i of lib.inpile) {
- if (!storage.includes(i) && get.type(i) == "trick" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true;
- }
- return false;
- },
- chooseButton: {
- dialog: function (event, player) {
- var cards = player.getCards("h", card => {
- return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag");
- });
- var storage = player.getStorage("dczhaowen_viewed");
- var list = [];
- for (var i of lib.inpile) {
- if (!storage.includes(i) && get.type(i) == "trick" && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) {
- list.push(["锦囊", "", i]);
- }
- }
- return ui.create.dialog("昭文", [list, "vcard"], "hidden");
- },
- check: function (button) {
- var player = _status.event.player;
- return player.getUseValue({ name: button.link[2] }) + 1;
- },
- backup: function (links, player) {
- return {
- audio: "dczhaowen",
- popname: true,
- filterCard: function (card, player) {
- return get.color(card) == "black" && card.hasGaintag("dczhaowen_tag");
- },
- selectCard: 1,
- position: "h",
- viewAs: {
- name: links[0][2],
- },
- onuse: function (links, player) {
- player.addTempSkill("dczhaowen_viewed");
- player.markAuto("dczhaowen_viewed", [links.card.name]);
- },
- };
- },
- prompt: function (links, player) {
- return "将一张展示过的黑色手牌当做" + get.translation(links[0][2]) + "使用";
- },
- },
- group: "dczhaowen_draw",
- mod: {
- aiOrder: function (player, card, num) {
- var cards = [];
- if (card.cards) cards.addArray(cards);
- if (get.itemtype(card) == "card") cards.push(card);
- for (var cardx of cards) {
- if (get.color(cardx) != "red") continue;
- if (cardx.hasGaintag("dczhaowen_tag")) return num + 0.2;
- }
- },
- },
- ai: {
- order: 12,
- result: {
- player: 1,
- },
- },
- },
- draw: {
- audio: "dczhaowen",
- forced: true,
- charlotte: true,
- trigger: { player: "useCard" },
- filter: function (event, player) {
- var cards = event.cards.filter(card => get.color(card, player) == "red");
- return player.hasHistory("lose", evt => {
- if (event != evt.getParent()) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("dczhaowen_tag")) {
- if (cards.some(card => card.cardid == i)) return true;
- }
- }
- });
- },
- content: function () {
- var num = 0;
- var cards = trigger.cards.filter(card => get.color(card, player) == "red");
- player.getHistory("lose", evt => {
- if (trigger != evt.getParent()) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("dczhaowen_tag")) {
- if (cards.some(card => card.cardid == i)) num++;
- }
- }
- });
- while (num--) player.draw();
- },
- ai: {
- effect: {
- player: (card, player, target) => {
- if (get.itemtype(card) === "card" && cardx.hasGaintag("dczhaowen_tag") && get.color(card, player) === "red") return [1, 1];
- },
- },
- },
- },
- viewed: {
- onremove: true,
- charlotte: true,
- },
- effect_backup: {
- audio: "dczhaowen",
- },
- },
- },
- dcjiudun: {
- audio: 2,
- trigger: { target: "useCardToTargeted" },
- filter: function (event, player) {
- if (event.player == player || get.color(event.card) != "black") return false;
- if (player.hasSkill("jiu"))
- return player.countCards("h", card => {
- return _status.connectMode || lib.filter.cardDiscardable(card, player, "dcjiudun");
- });
- return true;
- },
- direct: true,
- content: function () {
- "step 0";
- if (player.hasSkill("jiu")) {
- player
- .chooseToDiscard(get.prompt("dcjiudun"), '弃置一张手牌,令' + get.translation(trigger.card) + "对你无效
")
- .set("logSkill", "dcjiudun")
- .set("ai", card => {
- if (_status.event.goon) return 4.5 + Math.max(0, 3 - player.hp) - get.value(card);
- return 0;
- })
- .set(
- "goon",
- (function () {
- if (get.effect(player, trigger.card, trigger.player, player) < -4 * Math.max(0, 5 - Math.sqrt(player.countCards("h")))) return true;
- return false;
- })()
- );
- event.goto(2);
- } else {
- player.chooseBool(get.prompt("dcjiudun"), "摸一张牌,然后视为使用一张【酒】").set("ai", () => 1);
- }
- "step 1";
- if (result.bool) {
- player.logSkill("dcjiudun");
- player.draw();
- player.chooseUseTarget("jiu", true);
- }
- event.finish();
- "step 2";
- if (result.bool) {
- trigger.excluded.add(player);
- game.log(trigger.card, "对", player, "无效");
- }
- },
- ai: {
- jiuSustain: true,
- skillTagFilter: function (player, tag, name) {
- if (name != "phase") return false;
- },
- effect: {
- target: (card, player, target) => {
- if (player === target || typeof card !== "object" || get.color(card) !== "black") return;
- if (target.hasSkill("jiu")) {
- if (
- card.name !== "huogong" &&
- get.tag(card, "damage") &&
- get.attitude(player, target) <= 0 &&
- target.hasCard(i => {
- return _status.connectMode || lib.filter.cardDiscardable(i, player, "dcjiudun");
- }, "h")
- )
- return [0, -1];
- } else return [1, 1.2];
- },
- },
- },
- },
- //武诸葛
- dcjincui: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- filter: function (event, player) {
- return true;
- },
- forced: true,
- group: "dcjincui_advent",
- content: function () {
- "step 0";
- var num = 0;
- for (var i = 0; i < ui.cardPile.childNodes.length; i++) {
- var card = ui.cardPile.childNodes[i];
- if (get.number(card) == 7) {
- num++;
- if (num >= player.maxHp) break;
- }
- }
- if (num < 1) num = 1;
- if (num > player.hp) player.recover(num - player.hp);
- else if (num < player.hp) player.loseHp(player.hp - num);
- "step 1";
- var num = player.hp;
- 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 target = _status.event.getTrigger().name == "phaseZhunbei" ? player : player.next;
- var att = get.sgn(get.attitude(player, target));
- var top = [];
- var judges = target.getCards("j");
- var stopped = false;
- if (player != target || !target.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)) * att;
- });
- if (judge(cards[0]) * att < 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)) * att;
- });
- while (cards.length) {
- if (get.value(cards[0], player) <= 5 == att > 0) break;
- top.unshift(cards.shift());
- }
- }
- bottom = cards;
- return [top, bottom];
- };
- "step 2";
- 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]);
- }
- if (event.triggername == "phaseZhunbeiBegin" && top.length == 0) {
- player.addTempSkill("reguanxing_on");
- }
- player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下");
- game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶");
- game.updateRoundNumber();
- game.delayx();
- },
- ai: {
- guanxing: true,
- effect: {
- target: function (card, player, target) {
- if (!get.tag(card, "damage")) return;
- var num = 0,
- bool = false;
- for (var i = 0; i < ui.cardPile.childNodes.length; i++) {
- var card = ui.cardPile.childNodes[i];
- if (get.number(card) == 7) {
- num++;
- if (num >= target.hp) {
- bool = true;
- break;
- }
- }
- }
- if (bool) return 0.2;
- },
- },
- threaten: 0.6,
- },
- subSkill: {
- advent: {
- audio: "dcjincui",
- trigger: { global: "phaseBefore", player: "enterGame" },
- forced: true,
- filter: function (event, player) {
- return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") < 7;
- },
- content: function () {
- player.drawTo(7);
- },
- },
- },
- },
- dcqingshi: {
- audio: 2,
- trigger: { player: "useCard" },
- filter: function (event, player) {
- if (!player.isPhaseUsing() || player.hasSkill("dcqingshi_blocker")) return false;
- if (player.getStorage("dcqingshi_clear").includes(event.card.name)) return false;
- if (
- player.hasCard(card => {
- return get.name(card) == event.card.name;
- })
- )
- return true;
- return false;
- },
- direct: true,
- content: function () {
- "step 0";
- var choices = [];
- var choiceList = ["令" + get.translation(trigger.card) + "对其中一个目标角色造成的伤害+1", "令任意名其他角色各摸一张牌", "摸三张牌,然后〖情势〗于本回合失效"];
- if (trigger.targets && trigger.targets.length) choices.push("选项一");
- else choiceList[0] = '' + choiceList[0] + "(无目标角色)";
- if (game.countPlayer(i => i != player)) choices.push("选项二");
- else choiceList[1] = '' + choiceList[1] + "";
- if (player.hp > 0) choices.push("选项三");
- else choiceList[2] = '' + choiceList[1] + "(体力值为0)";
- player
- .chooseControl(choices, "cancel2")
- .set("choiceList", choiceList)
- .set("prompt", get.prompt("dcqingshi"))
- .set("ai", () => {
- return _status.event.choice;
- })
- .set(
- "choice",
- (() => {
- var choicesx = choices.slice();
- var cards = player.getCards("hs");
- var bool1 =
- get.tag(trigger.card, "damage") &&
- choicesx.includes("选项一") &&
- trigger.targets.some(current => {
- return get.attitude(player, current) < 0;
- }),
- bool2 = choicesx.includes("选项二");
- if (bool2)
- bool2 = game.countPlayer(function (current) {
- return player != current && get.attitude(player, current) > 0;
- });
- else bool2 = 0;
- if (bool1 || bool2) {
- for (var i = 0; i < cards.length; i++) {
- var name = get.name(cards[i]);
- if (player.getStorage("dcqingshi_clear").includes(name)) continue;
- for (var j = i + 1; j < cards.length; j++) {
- if (name === get.name(cards[j]) && get.position(cards[i]) + get.position(cards[j]) !== "ss" && player.hasValueTarget(cards[i])) {
- choicesx.remove("选项三");
- break;
- }
- }
- }
- }
- if (bool2 > 2) return "选项二";
- if (choicesx.includes("选项三")) return "选项三";
- if (bool2 === 2) return "选项二";
- if (bool1) return "选项一";
- if (bool2) return "选项二";
- return "cancel2";
- })()
- );
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("dcqingshi");
- game.log(player, "选择了", "#y" + result.control);
- var index = ["选项一", "选项二", "选项三"].indexOf(result.control) + 1;
- player.addTempSkill("dcqingshi_clear");
- player.markAuto("dcqingshi_clear", [trigger.card.name]);
- var next = game.createEvent("dcqingshi_after");
- next.player = player;
- next.card = trigger.card;
- next.setContent(lib.skill.dcqingshi["content" + index]);
- }
- },
- content1: function () {
- "step 0";
- player
- .chooseTarget("令" + get.translation(card) + "对其中一个目标造成的伤害+1", true, (card, player, target) => {
- return _status.event.targets.includes(target);
- })
- .set("ai", target => {
- return 2 - get.attitude(_status.event.player, target);
- })
- .set("targets", event.getParent().getTrigger().targets);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target);
- player.addTempSkill("dcqingshi_ex");
- if (!player.storage.dcqingshi_ex) player.storage.dcqingshi_ex = [];
- player.storage.dcqingshi_ex.push([target, card]);
- }
- },
- content2: function () {
- "step 0";
- player.chooseTarget("令任意名其他角色各摸一张牌", [1, Infinity], true, lib.filter.notMe).set("ai", target => {
- return get.attitude(_status.event.player, target);
- });
- "step 1";
- if (result.bool) {
- var targets = result.targets;
- targets.sortBySeat();
- player.line(targets);
- game.asyncDraw(targets);
- game.delayex();
- }
- },
- content3: function () {
- "step 0";
- player.draw(3);
- player.addTempSkill("dcqingshi_blocker");
- },
- subSkill: {
- ex: {
- trigger: { source: "damageBegin1" },
- filter: function (event, player) {
- return (
- player.storage.dcqingshi_ex &&
- player.storage.dcqingshi_ex.some(info => {
- return info[0] == event.player && info[1] == event.card;
- })
- );
- },
- forced: true,
- charlotte: true,
- popup: false,
- onremove: true,
- content: function () {
- trigger.num++;
- for (var i = 0; i < player.storage.dcqingshi_ex.length; i++) {
- if (player.storage.dcqingshi_ex[i][1] == trigger.card) player.storage.dcqingshi_ex.splice(i--, 1);
- }
- },
- },
- clear: {
- onremove: true,
- charlotte: true,
- },
- blocker: { charlotte: true },
- },
- ai: {
- threaten: 6,
- },
- },
- dczhizhe: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- filterCard: true,
- position: "h",
- discard: false,
- lose: false,
- delay: false,
- skillAnimation: true,
- animationColor: "metal",
- check: function (card) {
- if (get.type(card) != "basic" && get.type(card) != "trick") return 0;
- return get.value(card) - 7.5;
- },
- content: function () {
- "step 0";
- var card = cards[0];
- player.awakenSkill("dczhizhe");
- var cardx = game.createCard2(card.name, card.suit, card.number, card.nature);
- player.gain(cardx).gaintag.add("dczhizhe");
- player.addSkill("dczhizhe_effect");
- },
- ai: {
- order: 15,
- result: {
- player: 1,
- },
- },
- subSkill: {
- effect: {
- mod: {
- aiOrder: function (player, card, num) {
- if (num > 0 && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) return num + 0.16;
- },
- aiValue: function (player, card, num) {
- if (num > 0 && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) return 2 * num;
- },
- aiUseful: function (player, card, num) {
- if (num > 0 && !player._dczhizhe_mod && get.itemtype(card) === "card" && card.hasGaintag("dczhizhe")) {
- if (player.canIgnoreHandcard(card)) return Infinity;
- player._dczhizhe_mod = true;
- if (
- player.hp < 3 &&
- player.needsToDiscard(0, (i, player) => {
- return !player.canIgnoreHandcard(i) && get.useful(i) > 6;
- })
- )
- return num * 1.5;
- return num * 10;
- }
- },
- },
- trigger: { player: ["useCardAfter", "respondAfter"] },
- charlotte: true,
- forced: true,
- filter: function (event, player) {
- 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("dczhizhe")) {
- if (
- event.cards.some(card => {
- return get.position(card, true) == "o" && card.cardid == i;
- })
- )
- return true;
- }
- }
- return false;
- });
- },
- content: function () {
- "step 0";
- var cards = [];
- player.getHistory("lose", function (evt) {
- if (evt.getParent() != trigger) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("dczhizhe")) {
- var cardsx = trigger.cards.filter(card => {
- return get.position(card, true) == "o" && card.cardid == i;
- });
- if (cardsx.length) cards.addArray(cardsx);
- }
- }
- });
- if (cards.length) {
- player.gain(cards, "gain2").gaintag.addArray(["dczhizhe", "dczhizhe_clear"]);
- player.addTempSkill("dczhizhe_clear");
- }
- },
- },
- clear: {
- charlotte: true,
- onremove: function (player) {
- player.removeGaintag("dczhizhe_clear");
- },
- mod: {
- cardEnabled2: function (card, player) {
- var cards = [];
- if (card.cards) cards.addArray(cards);
- if (get.itemtype(card) == "card") cards.push(card);
- for (var cardx of cards) {
- if (cardx.hasGaintag("dczhizhe_clear")) return false;
- }
- },
- cardRespondable: function (card, player) {
- var cards = [];
- if (card.cards) cards.addArray(cards);
- if (get.itemtype(card) == "card") cards.push(card);
- for (var cardx of cards) {
- if (cardx.hasGaintag("dczhizhe_clear")) return false;
- }
- },
- cardSavable: function (card, player) {
- var cards = [];
- if (card.cards) cards.addArray(cards);
- if (get.itemtype(card) == "card") cards.push(card);
- for (var cardx of cards) {
- if (cardx.hasGaintag("dczhizhe_clear")) return false;
- }
- },
- },
- },
- },
- },
- //段巧笑
- dccaizhuang: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.hasCard(function (card) {
- return lib.filter.cardDiscardable(card, player, "dccaizhuang");
- }, "he");
- },
- complexCard: true,
- selectCard: [1, Infinity],
- position: "he",
- filterCard: true,
- check: function (card) {
- let cache = lib.skill.dccaizhuang.tempCache();
- if (!cache || cache.no) return 0;
- let player = _status.event.player,
- suit = get.suit(card);
- if (
- ui.selected.cards.filter(i => {
- return get.suit(i) === suit;
- }).length < (cache[suit] || 0)
- ) {
- if (get.position(card) === "h") return 15 - get.value(card);
- return 9 - get.value(card);
- }
- return 0;
- },
- tempCache() {
- let cache = _status.event.getTempCache("dccaizhuang", "dsuits");
- if (cache) return cache;
- cache = { no: true };
- _status.event.putTempCache("dccaizhuang", "dsuits", cache);
- let player = _status.event.player,
- suits = {};
- lib.suit.forEach(i => {
- suits[i] = 0;
- });
- player.getCards("h", i => {
- let suit = get.suit(i);
- if (lib.suit.includes(suit)) suits[suit]++;
- });
- let sortedSuits = Object.fromEntries(Object.entries(suits).sort((a, b) => b[1] - a[1]));
- let dis = 0,
- idx = 0,
- dsuits = 0,
- leave = 0;
- for (let i in sortedSuits) {
- idx++;
- if (!sortedSuits[i]) continue;
- let num = 1;
- if (idx > 2 || sortedSuits[i] < 3) num = sortedSuits[i];
- cache[i] = num;
- dis += num;
- suits[i] -= num;
- dsuits++;
- }
- for (let i in suits) {
- if (suits[i]) leave++;
- }
- player.getCards("e", i => {
- let suit = get.suit(i);
- if (!cache[suit]) {
- dsuits++;
- cache[suit] = 1;
- dis++;
- }
- });
- let draw = 0,
- e = [0, 1, 4 / 3, 2, 4];
- if (dsuits <= leave) return false;
- do {
- draw += e[dsuits--];
- } while (dsuits > leave);
- if (draw > dis) {
- delete cache.no;
- _status.event.putTempCache("dccaizhuang", "dsuits", cache);
- return cache;
- }
- return false;
- },
- content: function () {
- "step 0";
- var suits = [];
- cards.forEach(i => {
- if (suits.length >= 4) return;
- let suit = get.suit(i, player);
- if (lib.suit.includes(suit)) suits.add(suit);
- });
- event.num = suits.length;
- "step 1";
- var suits = [];
- player.countCards("h", card => {
- if (suits.length >= 4) return;
- var suit = get.suit(card);
- if (lib.suit.includes(suit)) suits.add(suit);
- });
- if (suits.length >= event.num) event.finish();
- "step 2";
- player.draw();
- event.goto(1);
- },
- ai: {
- order: 2,
- result: { player: 1 },
- },
- },
- dchuayi: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- frequent: true,
- content: function () {
- "step 0";
- player.judge(() => 1).judge2 = result => result.bool;
- "step 1";
- var color = result.color;
- if (color == "red" || color == "black") player.addTempSkill("dchuayi_" + color, { player: "phaseBegin" });
- },
- subSkill: {
- red: {
- trigger: { global: "phaseEnd" },
- charlotte: true,
- forced: true,
- content: function () {
- player.draw();
- },
- mark: true,
- intro: {
- name: "华衣·红",
- content: "一名角色的回合结束时,你摸一张牌",
- },
- },
- black: {
- trigger: { player: "damageEnd" },
- charlotte: true,
- forced: true,
- content: function () {
- player.draw(2);
- },
- mark: true,
- intro: {
- name: "华衣·黑",
- content: "当你受到伤害后,摸两张牌",
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- if (!target.hasFriend()) return;
- var num = 1;
- if (get.attitude(player, target) > 0) {
- if (player.needsToDiscard()) num = 0.5;
- else num = 0.3;
- }
- if (target.hp >= 4) return [1, num * 2];
- if (target.hp == 3) return [1, num * 1.5];
- if (target.hp == 2) return [1, num * 0.5];
- }
- },
- },
- },
- },
- },
- },
- //张瑾云
- dchuizhi: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseToDiscard(get.prompt("dchuizhi"), "你可以选择弃置任意张手牌并点击“确定”,将手牌摸至与全场手牌数最多的角色数相同。", [0, Infinity])
- .set("logSkill", "dchuizhi")
- .set("ai", card => {
- if (_status.event.isMax) {
- if (ui.selected.cards.length) return -get.value(card);
- return 0;
- }
- return 6 - get.value(card);
- })
- .set("isMax", player.isMaxHandcard());
- "step 1";
- if (result.bool) {
- var num = 0,
- targets = game.filterPlayer();
- for (var current of targets) {
- if (current.isMaxHandcard()) {
- num = current.countCards("h");
- break;
- }
- }
- num = Math.max(1, Math.min(5, num - player.countCards("h")));
- player.draw(num);
- }
- },
- },
- dcjijiao: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- skillAnimation: true,
- animationColor: "orange",
- init: function (player) {
- player.addSkill("dcjijiao_machi");
- },
- onremove: function (player) {
- player.removeSkill("dcjijiao_machi");
- },
- onChooseToUse: function (event) {
- if (event.dcjijiao == undefined && !game.online) {
- var bool = lib.skill.dcjijiao.getCards(event.player, true);
- event.set("dcjijiao", bool);
- }
- },
- filter: function (event, player) {
- return event.dcjijiao;
- },
- filterTarget: true,
- getCards: function (player, bool) {
- var cards = Array.from(ui.discardPile.childNodes);
- var gains = cards.slice(0);
- var history = game.getAllGlobalHistory("cardMove", function (evt) {
- if (evt.name == "lose") return evt.position == ui.discardPile;
- return evt.name == "cardsDiscard";
- });
- for (var i = history.length - 1; i >= 0; i--) {
- var evt = history[i];
- var cards2 = evt.cards.filter(function (card) {
- return cards.includes(card);
- });
- if (cards2.length) {
- if (!lib.skill.dcjijiao.isUse(evt, player)) {
- gains.removeArray(cards2);
- }
- cards.removeArray(cards2);
- }
- if (!cards.length) break;
- }
- if (bool) return gains.some(card => get.type2(card, false) == "trick");
- return gains.filter(card => get.type2(card, false) == "trick");
- },
- isUse: function (event, player) {
- if (event.name != "cardsDiscard") return event.type == "discard" && event.player == player;
- var evtx = event.getParent();
- if (evtx.name != "orderingDiscard") return false;
- var evt2 = evtx.relatedEvent || evtx.getParent();
- return evt2.name == "useCard" && evt2.player == player;
- },
- content: function () {
- player.awakenSkill("dcjijiao");
- var cards = lib.skill.dcjijiao.getCards(player);
- if (cards.length) {
- target.gain(cards, "gain2").gaintag.add("dcjijiao");
- target.addSkill("dcjijiao_nowuxie");
- }
- },
- ai: {
- order: 1,
- result: {
- target: function (player, target) {
- if (ui.cardPile.childNodes.length > game.players.length * 5 && !player.hasSkill("dcjijiao_risutoa") && !game.hasPlayer(current => current.hp <= 1) && game.countPlayer(current => current.hp === 2 && current.countCards("hes") < 3) <= 1) return 0;
- return 5;
- },
- },
- },
- subSkill: {
- machi: {
- charlotte: true,
- forced: true,
- popup: false,
- trigger: {
- global: ["washCard", "die"],
- },
- filter: function (event, player) {
- return player.hasSkill("dcjijiao", null, false, false);
- },
- content: function () {
- player.addSkill("dcjijiao_risutoa");
- },
- },
- risutoa: {
- charlotte: true,
- forced: true,
- popup: false,
- trigger: { global: "phaseAfter" },
- content: function () {
- if (player.awakenedSkills.includes("dcjijiao")) {
- player.restoreSkill("dcjijiao");
- game.log(player, "重置了", "#g【继椒】");
- //player.removeSkill('dcjijiao_machi');
- }
- player.removeSkill("dcjijiao_risutoa");
- },
- },
- nowuxie: {
- trigger: { player: "useCard1" },
- forced: true,
- charlotte: true,
- firstDo: true,
- popup: false,
- filter: function (event, player) {
- if (get.type(event.card) != "trick") 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("dcjijiao")) return true;
- }
- return false;
- });
- },
- content: function () {
- trigger.nowuxie = true;
- },
- onremove: function (player) {
- player.removeGaintag("dcjijiao");
- },
- },
- },
- },
- //桓范
- dcjianzheng: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: function (card, player, target) {
- return target.countCards("h") && target != player;
- },
- content: function () {
- "step 0";
- var forced = target.hasCard(i => player.hasUseTarget(i), "h");
- player
- .choosePlayerCard(target, "h", "visible", forced, "获得并使用其中一张牌")
- .set("filterButton", button => {
- return _status.event.player.hasUseTarget(button.link);
- })
- .set("ai", button => {
- return _status.event.player.getUseValue(button.link);
- });
- "step 1";
- if (result.bool) {
- var card = result.links[0];
- event.card = card;
- player.gain(card, "giveAuto");
- } else event.goto(3);
- "step 2";
- if (get.position(card) == "h" && get.owner(card) == player && player.hasUseTarget(card)) {
- if (get.name(card, player) == "sha") player.chooseUseTarget(card, true, false);
- else player.chooseUseTarget(card, true);
- }
- "step 3";
- if (
- player.hasHistory("useCard", evt => {
- return evt.getParent(2).name == "dcjianzheng" && evt.targets.includes(target);
- })
- ) {
- player.link(true);
- target.link(true);
- } else event.finish();
- "step 4";
- target.viewHandcards(player);
- },
- ai: {
- order: 10,
- expose: 0.2,
- result: {
- target: function (player, target) {
- return -Math.sqrt(target.countCards("h"));
- },
- },
- },
- },
- //fumo!
- dcfumou: {
- audio: 2,
- trigger: { player: "damageEnd" },
- direct: true,
- filter: function (event, player) {
- return player.getDamagedHp() > 0;
- },
- content: function () {
- "step 0";
- event.num = trigger.num;
- "step 1";
- player.chooseTarget(get.prompt2("dcfumou"), [1, player.getDamagedHp()]).set("ai", target => {
- var att = get.attitude(_status.event.player, target);
- if (target.countCards("h") >= 3 || (target.countCards("e") && !target.isDamaged())) {
- if (!target.canMoveCard()) return -att;
- else if (!target.canMoveCard(true)) return -att / 5;
- }
- return att;
- });
- "step 2";
- if (result.bool) {
- var targets = result.targets;
- targets.sortBySeat(player);
- event.targets = targets;
- player.logSkill("dcfumou", targets);
- event.num--;
- } else event.finish();
- "step 3";
- var target = targets.shift();
- event.target = target;
- var choices = [];
- var choiceList = ["移动场上的一张牌", "弃置所有手牌并摸两张牌", "弃置装备区里的所有牌并回复1点体力"];
- if (target.canMoveCard()) choices.push("选项一");
- else choiceList[0] = '' + choiceList[0] + "";
- if (
- target.countCards("h") &&
- !target.hasCard(card => {
- return !lib.filter.cardDiscardable(card, target, "dcfumou");
- }, "h")
- )
- choices.push("选项二");
- else choiceList[1] = '' + choiceList[1] + "";
- if (
- target.countCards("e") &&
- !target.hasCard(card => {
- return !lib.filter.cardDiscardable(card, target, "dcfumou");
- }, "h")
- )
- choices.push("选项三");
- else choiceList[2] = '' + choiceList[2] + "";
- if (choices.length) {
- target
- .chooseControl(choices)
- .set("prompt", "腹谋:请选择一项")
- .set("choiceList", choiceList)
- .set("ai", () => {
- return _status.event.choice;
- })
- .set(
- "choice",
- (function () {
- if (choices.length == 1) return choices[0];
- var func = (choice, target) => {
- switch (choice) {
- case "选项一":
- if (target.canMoveCard(true)) return 5;
- return 3;
- case "选项二":
- if (target.countCards("h") < 2 && get.value(target.getCards("h")[0]) < 6) return 4.5;
- return 4.5 - target.countCards("h");
- case "选项三":
- var e2 = target.getEquip(2);
- if (target.hp + target.countCards("hs", ["tao", "jiu"]) < 2 && !e2) return 5.5;
- if (get.recoverEffect(target, target, target) <= 0) return 3;
- if (!e2) return 4.4;
- return 5 - 1.5 * target.countCards("e");
- }
- };
- var choicesx = choices.map(i => [i, func(i, target)]).sort((a, b) => b[1] - a[1]);
- return choicesx[0][0];
- })()
- );
- } else event.goto(5);
- "step 4";
- game.log(target, "选择了", "#y" + result.control);
- if (result.control == "选项一") {
- target.moveCard(true);
- } else if (result.control == "选项二") {
- target.chooseToDiscard(true, "h", target.countCards("h"));
- target.draw(2);
- } else {
- target.chooseToDiscard(true, "e", target.countCards("e"));
- target.recover();
- }
- "step 5";
- if (event.targets.length) event.goto(3);
- // else if(event.num) event.goto(1);
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
- if (!target.hasFriend()) return;
- var num = 1;
- if (get.attitude(player, target) > 0) {
- if (player.needsToDiscard()) num = 0.7;
- else num = 0.5;
- }
- if (target.hp == 2 && target.hasFriend()) return [1, num * 1.5];
- if (target.hp >= 2) return [1, num];
- }
- },
- },
- },
- },
- //陈泰
- dcctjiuxian: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterCard: lib.filter.cardRecastable,
- selectCard: function () {
- return Math.ceil(_status.event.player.countCards("h") / 2);
- },
- check: function (card) {
- return 6.5 - get.value(card);
- },
- discard: false,
- lose: false,
- delay: false,
- content: function () {
- "step 0";
- player.recast(cards);
- "step 1";
- player.addTempSkill("dcctjiuxian_help");
- player.chooseUseTarget(
- {
- name: "juedou",
- isCard: true,
- storage: { dcctjiuxian: true },
- },
- true
- );
- },
- ai: {
- order: function () {
- return 0.9 * get.order({ name: "juedou" });
- },
- tag: {
- respond: 2,
- respondSha: 2,
- damage: 1,
- },
- result: {
- player: function (player) {
- let target = null,
- maxval = 0;
- for (let i of game.players) {
- let jdeff = get.effect(
- i,
- {
- name: "juedou",
- isCard: true,
- cards: ui.selected.cards,
- storage: { dcctjiuxian: true },
- },
- player,
- player
- );
- if (
- i === player ||
- !player.canUse(
- {
- name: "juedou",
- isCard: true,
- cards: ui.selected.cards,
- storage: { dcctjiuxian: true },
- },
- i
- ) ||
- jdeff < 0
- )
- continue;
- let receff = 0;
- game.filterPlayer(function (current) {
- if (player != current && i.inRange(current) && current.isDamaged()) receff = Math.max(receff, get.recoverEffect(current, i, i));
- });
- if (jdeff + receff / 5 > maxval) {
- target = i;
- maxval = jdeff + receff / 5;
- }
- }
- if (target) return maxval / 80;
- return 0;
- },
- },
- },
- subSkill: {
- help: {
- trigger: { global: "damageSource" },
- filter: function (event, player) {
- return (
- event.card &&
- event.card.storage &&
- event.card.storage.dcctjiuxian &&
- event.player.isIn() &&
- event.getParent(2).targets.includes(event.player) &&
- game.hasPlayer(current => {
- return current != player && event.player.inRange(current) && current.isDamaged();
- })
- );
- },
- direct: true,
- forced: true,
- charlotte: true,
- content: function () {
- "step 0";
- player
- .chooseTarget("救陷:是否令其攻击范围内的一名其他角色回复1点体力?", (card, player, target) => {
- if (_status.event.player == target) return false;
- return target.isDamaged() && _status.event.targetx.inRange(target);
- })
- .set("targetx", trigger.player)
- .set("ai", target => get.recoverEffect(target, _status.event.player, _status.event.player));
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcctjiuxian_help", target);
- target.recover(player);
- }
- },
- },
- },
- },
- dcchenyong: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- frequent: true,
- filter: function (event, player) {
- return player.getHistory("useCard").length;
- },
- content: function () {
- var types = [];
- var history = player.getHistory("useCard");
- for (var evt of history) {
- types.add(get.type2(evt.card));
- }
- var num = types.length;
- player.draw(num);
- },
- ai: { threaten: 2.2 },
- },
- //孙瑜
- dcquanshou: {
- audio: 2,
- trigger: { global: "phaseBegin" },
- filter: function (event, player) {
- return event.player.countCards("h") <= event.player.maxHp;
- },
- logTarget: "player",
- check: function (event, player) {
- if (get.attitude(player, event.player) > 0) return true;
- const draw = event.player.maxHp - event.player.countCards("h");
- return draw <= 2 && event.player.getHp(true) - draw >= 1;
- },
- content: function () {
- "step 0";
- var draw = Math.min(5, trigger.player.maxHp - trigger.player.countCards("h"));
- trigger.player
- .chooseControl()
- .set("choiceList", [(draw > 0 ? "摸" + get.cnNumber(draw) + "张牌,然后" : "令") + "你本回合使用【杀】的次数上限-1", "当你本回合使用牌被抵消后," + get.translation(player) + "摸一张牌"])
- .set("ai", () => _status.event.choice)
- .set(
- "choice",
- (function () {
- var draw = Math.min(5, Math.max(0, trigger.player.maxHp - trigger.player.countCards("h")));
- if (get.attitude(trigger.player, player) > 0) {
- if (draw >= 3 || trigger.player.getCardUsable("sha") > 1) return "选项一";
- if (
- !draw ||
- (draw <= 1 &&
- trigger.player.countCards("hs", card => {
- return get.name(card) == "sha" && trigger.player.hasValueTarget(card);
- }))
- )
- return "选项二";
- return "选项一";
- } else {
- if (draw >= 4) return "选项一";
- if (
- draw < 2 &&
- trigger.player.countCards("hs", card => {
- return trigger.player.hasValueTarget(card);
- })
- )
- return "选项二";
- return "选项一";
- }
- })()
- )
- .set("prompt", "劝守:请选择一项");
- "step 1";
- game.log(trigger.player, "选择了", "#y" + result.control);
- if (result.control == "选项一") {
- var draw = Math.min(5, trigger.player.maxHp - trigger.player.countCards("h"));
- if (draw > 0) trigger.player.draw(draw);
- trigger.player.addTempSkill("dcquanshou_sha");
- trigger.player.addMark("dcquanshou_sha", 1, false);
- } else {
- trigger.player.addTempSkill("dcquanshou_respond");
- trigger.player.markAuto("dcquanshou_respond", [player]);
- }
- },
- ai: {
- expose: 0.1,
- },
- subSkill: {
- sha: {
- charlotte: true,
- onremove: true,
- marktext: "守",
- intro: { content: "使用【杀】的次数上限-#" },
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return num - player.countMark("dcquanshou_sha");
- },
- },
- },
- respond: {
- trigger: { player: ["shaMiss", "eventNeutralized"] },
- filter: function (event, player) {
- if (event.type != "card" && event.name != "_wuxie") return false;
- return player.getStorage("dcquanshou_respond").some(i => i.isIn());
- },
- forced: true,
- popup: false,
- charlotte: true,
- onremove: true,
- marktext: '守',
- intro: { content: "本回合使用的牌被抵消后,$摸一张牌" },
- content: function () {
- var targets = player.getStorage("dcquanshou_respond");
- targets.sortBySeat();
- for (var target of targets) {
- if (target.isIn()) {
- target.logSkill("dcquanshou_respond", player);
- target.draw();
- }
- }
- },
- },
- },
- },
- dcshexue: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- filter: function (event, player) {
- var cards = lib.skill.dcshexue.getLast();
- return cards.some(card => player.hasUseTarget(card, false));
- },
- getLast: function () {
- var cards = [];
- for (var current of game.filterPlayer()) {
- var history = current.actionHistory;
- if (history.length < 2) continue;
- if (history[history.length - 2].isMe) {
- var evts = history[history.length - 2].useCard;
- for (var i = evts.length - 1; i >= 0; i--) {
- var evt = evts[i];
- if (get.type(evt.card) != "basic" && get.type(evt.card) != "trick") continue;
- var evtx = evt.getParent("phaseUse");
- if (evtx && evtx.player == current) cards.push({ name: evt.card.name, nature: evt.card.nature });
- }
- }
- }
- return cards;
- },
- direct: true,
- group: "dcshexue_end",
- content: function () {
- "step 0";
- var cards = lib.skill.dcshexue.getLast();
- cards = cards.filter(card => player.hasUseTarget(card, false));
- player.chooseButton(["设学:是否将一张牌当作其中一张牌使用?", [cards, "vcard"]]);
- "step 1";
- if (!result.bool) return;
- var card = result.links[0];
- game.broadcastAll(function (card) {
- lib.skill.dcshexue_backup.viewAs = card;
- }, card);
- var next = player.chooseToUse();
- next.set("openskilldialog", `###${get.prompt("dcshexue")}###将一张牌当做${get.translation(card.nature) || ""}【${get.translation(card.name)}】使用`);
- next.set("norestore", true);
- next.set("addCount", false);
- next.set("_backupevent", "dcshexue_backup");
- next.set("custom", {
- add: {},
- replace: { window: function () {} },
- });
- next.backup("dcshexue_backup");
- },
- subSkill: {
- backup: {
- audio: "dcshexue",
- filterCard: function (card) {
- return get.itemtype(card) == "card";
- },
- filterTarget: lib.filter.targetEnabled,
- position: "hes",
- selectCard: 1,
- check: card => 6 - get.value(card),
- popname: true,
- },
- end: {
- audio: "dcshexue",
- trigger: { player: "phaseUseEnd" },
- filter: function (event, player) {
- return player.getHistory("useCard", evt => {
- return evt.getParent("phaseUse") == event && (get.type(evt.card) == "basic" || get.type(evt.card) == "trick");
- }).length;
- },
- prompt2: function (event, player) {
- return "令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做你本阶段使用过的一张基本牌或普通锦囊牌使用?";
- },
- check: function (event, player) {
- let evt = event.getParent("phase").getParent();
- let nextPlayer = player.getNext();
- if (evt && evt.next && evt.next.length) {
- nextPlayer = evt.next[0].player;
- }
- return get.attitude(player, nextPlayer) > 0;
- },
- content: function () {
- var history = player.getHistory("useCard", evt => {
- return evt.getParent("phaseUse") == trigger && (get.type(evt.card) == "basic" || get.type(evt.card) == "trick");
- });
- player.addSkill("dcshexue_studyclear");
- if (!player.storage.dcshexue_studyclear) player.storage.dcshexue_studyclear = [];
- history.forEach(evt => {
- var card = evt.card;
- card = { name: card.name, nature: card.nature };
- player.storage.dcshexue_studyclear.push(card);
- });
- },
- },
- study: {
- trigger: { player: "phaseUseBegin" },
- filter: function (event, player) {
- return player.getStorage("dcshexue_study").some(i => event.player.hasUseTarget(i, false));
- },
- onremove: true,
- charlotte: true,
- direct: true,
- content: function () {
- "step 0";
- event.cards = player.getStorage("dcshexue_study");
- "step 1";
- var card = cards.pop();
- if (trigger.player.hasUseTarget(card, false)) {
- game.broadcastAll(function (card) {
- lib.skill.dcshexue_backup.viewAs = card;
- lib.skill.dcshexue_backup.prompt = "设学:是否将一张牌当做" + get.translation(card) + "使用?";
- }, card);
- var next = trigger.player.chooseToUse();
- next.set("openskilldialog", `###${get.prompt("dcshexue_study")}###将一张牌当做${get.translation(card.nature) || ""}【${get.translation(card.name)}】使用`);
- next.set("norestore", true);
- next.set("addCount", false);
- next.set("_backupevent", "dcshexue_backup");
- next.set("custom", {
- add: {},
- replace: { window: function () {} },
- });
- next.backup("dcshexue_backup");
- }
- if (cards.length) event.redo();
- },
- },
- studyclear: {
- trigger: { global: "phaseBegin" },
- charlotte: true,
- forceDie: true,
- silent: true,
- onremove: true,
- lastDo: true,
- content: function () {
- trigger.player.addTempSkill("dcshexue_study");
- if (!trigger.player.storage.dcshexue_study) trigger.player.storage.dcshexue_study = [];
- trigger.player.storage.dcshexue_study = trigger.player.storage.dcshexue_study.concat(player.getStorage("dcshexue_studyclear"));
- player.removeSkill("dcshexue_studyclear");
- },
- },
- },
- },
- //郤正
- dcdanyi: {
- audio: 2,
- trigger: { player: "useCardToPlayered" },
- filter: function (event, player) {
- if (!event.isFirstTarget) return false;
- if (!event.targets || !event.targets.length) return false;
- var evt = lib.skill.dcjianying.getLastUsed(player, event.getParent());
- if (!evt || !evt.targets || !evt.targets.length) return false;
- return event.targets.some(target => evt.targets.includes(target));
- },
- frequent: true,
- locked: false,
- content: function () {
- var evt = lib.skill.dcjianying.getLastUsed(player, trigger.getParent());
- player.draw(trigger.targets.filter(target => evt.targets.includes(target)).length);
- },
- mod: {
- aiOrder: function (player, card, num) {
- var evt = player.getLastUsed();
- if (
- evt &&
- evt.targets &&
- evt.targets.length &&
- game.hasPlayer(current => {
- return evt.targets.includes(current) && player.canUse(card, current) && get.effect(current, card, player, player) > 0;
- })
- )
- return num + 10;
- },
- },
- ai: {
- effect: {
- player: function (card, player, target) {
- var evt = player.getLastUsed();
- if (evt && evt.targets.includes(target)) return [1.5, 0];
- },
- },
- },
- },
- dcwencan: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: function (card, player, target) {
- if (ui.selected.targets.length) {
- if (ui.selected.targets[0].hp == target.hp) return false;
- }
- return target != player;
- },
- selectTarget: [1, 2],
- complexTarget: true,
- multiline: true,
- content: function () {
- "step 0";
- target
- .chooseToDiscard(get.translation(player) + "对你发动了【文灿】", "是否弃置两张花色不同的牌?或者点击“取消”,令其本回合对你使用牌无距离和次数限制", "he", 2, (card, player) => {
- if (!ui.selected.cards.length) return true;
- var suit = get.suit(card, player);
- for (var i of ui.selected.cards) {
- if (get.suit(i, player) == suit) return false;
- }
- return true;
- })
- .set("complexCard", true)
- .set("ai", card => {
- if (_status.event.nofear) return 0;
- return 5 - get.value(card);
- })
- .set(
- "nofear",
- player.countCards("hs", card => {
- return get.tag(card, "damage") && player.canUse(card, target, false) && get.effect(target, card, player, target) <= 0;
- }) < target.hp
- );
- "step 1";
- if (!result.bool) {
- player.addTempSkill("dcwencan_paoxiao");
- player.markAuto("dcwencan_paoxiao", [target]);
- }
- },
- subSkill: {
- paoxiao: {
- charlotte: true,
- onremove: true,
- marktext: "灿",
- intro: { content: "对$使用牌无距离和次数限制" },
- mod: {
- cardUsableTarget: function (card, player, target) {
- if (player.getStorage("dcwencan_paoxiao").includes(target)) return true;
- },
- targetInRange: function (card, player, target) {
- if (player.getStorage("dcwencan_paoxiao").includes(target)) return true;
- },
- },
- },
- },
- ai: {
- order: 9,
- result: { target: -1 },
- },
- },
- //芮姬
- dcwangyuan: {
- audio: 2,
- trigger: {
- player: ["loseAfter", "logSkill"],
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- frequent: true,
- filter: function (event, player, name) {
- if (player == _status.currentPhase) return name == "logSkill" && event.skill == "dcliying" && player.getExpansions("dcwangyuan").length < game.countPlayer2();
- if (name == "logSkill") return false;
- if (player.getExpansions("dcwangyuan").length >= game.countPlayer()) return false;
- if (event.name == "gain" && event.player == player) return false;
- var evt = event.getl(player);
- return evt && evt.cards2 && evt.cards2.length > 0;
- },
- content: function () {
- "step 0";
- var cards = player.getExpansions("dcwangyuan");
- var card = get.cardPile2(cardx => {
- var type = get.type2(cardx);
- return (type == "basic" || type == "trick") && !cards.some(cardxx => get.name(cardx, false) == get.name(cardxx, false));
- });
- if (card) player.addToExpansion(card, "gain2").gaintag.add("dcwangyuan");
- },
- ai: {
- combo: "dclingyin",
- },
- marktext: "妄",
- intro: {
- name: "妄(妄缘/铃音)",
- content: "expansion",
- markcount: "expansion",
- },
- },
- dclingyin: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- filter: function (event, player) {
- return player.getExpansions("dcwangyuan").length;
- },
- direct: true,
- content: function () {
- "step 0";
- var cards = player.getExpansions("dcwangyuan");
- player
- .chooseButton([get.prompt("dclingyin") + "(当前轮数:" + get.cnNumber(game.roundNumber, true) + ")", cards], [1, game.roundNumber])
- .set("ai", button => {
- var color = _status.event.color,
- player = _status.event.player;
- if (ui.selected.buttons.length > 0 && ui.selected.buttons.length == player.getExpansions("dcwangyuan").length - 1) return 0;
- if (color == 1) return get.value(button.link);
- if (color) return get.color(button.link) == color ? 1 : 0;
- return 0;
- })
- .set(
- "color",
- (function () {
- var cardsR = cards.filter(i => get.color(i) == "red");
- if (cardsR.length == cards.length || cardsR.length == 0 || cards.length <= game.roundNumber) return 1;
- if (cardsR.length <= game.roundNumber) return "red";
- if (cards.length - cardsR.length <= game.roundNumber) return "black";
- return 1;
- })()
- );
- "step 1";
- if (result.bool) {
- player.logSkill("dclingyin");
- var cards = result.links;
- player.gain(cards, "gain2");
- var cardsx = player.getExpansions("dcwangyuan").removeArray(cards);
- if (cardsx.length <= 1 || get.color(cardsx) != "none") {
- player.addTempSkill("dclingyin_effect");
- player.addMark("dclingyin_effect", 1, false);
- game.log(player, "获得了", "#g【铃音】", "的后续效果");
- }
- }
- },
- ai: {
- combo: "dcwangyuan",
- threaten: 3,
- },
- subSkill: {
- effect: {
- audio: "dclingyin",
- enable: "phaseUse",
- trigger: { source: "damageBegin1" },
- viewAs: { name: "juedou" },
- charlotte: true,
- forced: true,
- onremove: true,
- prompt: "将一张武器牌或防具牌当【决斗】使用",
- filterCard: function (card) {
- return get.subtype(card) == "equip1" || get.subtype(card) == "equip2";
- },
- position: "hes",
- filter: function (event, player) {
- if (event.name == "chooseToUse") return player.countCards("hes", { subtype: ["equip1", "equip2"] }) > 0;
- return event.player != player;
- },
- content: function () {
- trigger.num += player.countMark("dclingyin_effect");
- },
- ai: {
- damageBonus: true,
- },
- },
- },
- },
- dcliying: {
- audio: 2,
- usable: 1,
- trigger: {
- player: "gainAfter",
- global: "loseAsyncAfter",
- },
- filter: function (event, player) {
- var cards = event.getg(player).filter(i => get.owner(i) == player && get.position(i) == "h");
- if (!cards.length) return false;
- var evt = event.getParent("phaseDraw");
- if (evt && evt.name == "phaseDraw") return false;
- return true;
- },
- direct: true,
- content: function () {
- "step 0";
- var cards = trigger.getg(player).filter(i => get.owner(i) == player && get.position(i) == "h");
- player
- .chooseCardTarget({
- prompt: get.prompt("dcliying"),
- prompt2: "选择本次获得的任意张牌交给一名其他角色,然后摸一张牌",
- filterTarget: lib.filter.notMe,
- filterCard: card => _status.event.cards.includes(card),
- cards: cards,
- selectCard: [1, cards.length],
- ai1: function (card) {
- if (ui.selected.cards.length) return 0;
- return 3 / (Math.abs(get.value(card)) + 0.1);
- },
- ai2: function (target) {
- return get.value(ui.selected.cards, target) * get.attitude(_status.event.player, target);
- },
- })
- .set("cards", cards);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcliying", target);
- player.give(result.cards, target);
- player.draw();
- //if(player!=_status.currentPhase) event.finish();
- } else {
- player.storage.counttrigger.dcliying--;
- event.finish();
- } /*
- 'step 2'
- var cards=player.getExpansions('dcwangyuan');
- var card=get.cardPile2(cardx=>{
- var type=get.type2(cardx);
- return (type=='basic'||type=='trick')&&!cards.some(cardxx=>get.name(cardx,false)==get.name(cardxx,false));
- });
- if(card) player.addToExpansion(card,'gain2').gaintag.add('dcwangyuan');*/
- },
- },
- //谢灵毓
- dcyuandi: {
- audio: 2,
- init: () => {
- game.addGlobalSkill("dcyuandi_ai");
- },
- onremove: () => {
- if (!game.hasPlayer(i => i.hasSkill("dcyuandi"), true)) game.removeGlobalSkill("dcyuandi_ai");
- },
- trigger: { global: "useCard" },
- filter: function (event, player) {
- var evt = event.getParent("phaseUse");
- if (!evt || evt.player != event.player) return false;
- if (event.player == player || !event.targets || event.targets.length > 1 || event.targets[0] != event.player) return false;
- return (
- event.player
- .getHistory("useCard", evtx => {
- return evtx.getParent("phaseUse") == evt;
- })
- .indexOf(event) == 0
- );
- },
- direct: true,
- content: function () {
- "step 0";
- var target = trigger.player;
- var name = get.translation(target);
- var choices = ["选项二"];
- var choiceList = ["弃置" + name + "一张手牌", "你与" + name + "各摸一张牌"];
- if (target.countDiscardableCards(player, "h")) choices.unshift("选项一");
- else choiceList[0] = '' + choiceList[0] + "";
- player
- .chooseControl(choices, "cancel2")
- .set("choiceList", choiceList)
- .set("ai", () => {
- return _status.event.choice;
- })
- .set("prompt", get.prompt("dcyuandi", trigger.player))
- .set(
- "choice",
- (function () {
- if (get.attitude(player, target) < 0) {
- if (choices.includes("选项一")) return "选项一";
- return "cancel2";
- }
- return "选项二";
- })()
- );
- "step 1";
- if (result.control != "cancel2") {
- var target = trigger.player;
- player.logSkill("dcyuandi", target);
- if (result.control == "选项一") {
- player.discardPlayerCard(target, "h", true);
- if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.15);
- } else game.asyncDraw([target, player]);
- }
- },
- subSkill: {
- ai: {
- mod: {
- aiOrder: function (player, card, num) {
- var info = get.info(card);
- if (!info || !info.toself) return;
- var evt = _status.event.getParent("phaseUse");
- if (!evt || evt.player != player) return;
- if (player.hasHistory("useCard", evtx => evtx.getParent("phaseUse") == evt)) return;
- if (
- game.hasPlayer(current => {
- return current.hasSkill("dcyuandi") && get.attitude(player, current) >= 0;
- })
- )
- return num + 10;
- return num / 3;
- },
- },
- trigger: { player: "dieAfter" },
- filter: () => {
- return !game.hasPlayer(i => i.hasSkill("dcyuandi"), true);
- },
- silent: true,
- forceDie: true,
- content: () => {
- game.removeGlobalSkill("dcyuandi_ai");
- },
- },
- },
- },
- dcxinyou: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.countCards("h") < player.maxHp || player.isDamaged();
- },
- content: function () {
- "step 0";
- player.recover(player.getDamagedHp(true));
- player.drawTo(player.maxHp);
- "step 1";
- var check = 0;
- if (
- player.hasHistory("gain", evt => {
- return evt.getParent(2) == event && evt.cards.length >= 3;
- })
- )
- check |= 1;
- if (
- game.getGlobalHistory("changeHp", evt => {
- return evt.getParent().name == "recover" && evt.getParent(2) == event;
- }).length
- )
- check |= 2;
- if (check > 0) {
- player.addTempSkill("dcxinyou_effect");
- player.storage.dcxinyou_effect = check;
- }
- },
- ai: {
- order: 1,
- result: { player: 1 },
- },
- subSkill: {
- effect: {
- audio: "dcxinyou",
- trigger: { player: "phaseJieshuBegin" },
- charlotte: true,
- forced: true,
- onremove: true,
- filter: function (event, player) {
- return player.storage.dcxinyou_effect;
- },
- content: function () {
- if ((player.storage.dcxinyou_effect & 1) > 0) player.loseHp();
- if ((player.storage.dcxinyou_effect & 2) > 0) player.chooseToDiscard("心幽:请弃置一张牌", 1, true, "he");
- },
- },
- },
- },
- //笮融
- dccansi: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- content: function () {
- "step 0";
- player.recover();
- if (!game.hasPlayer(current => current != player)) event.finish();
- else
- player.chooseTarget("残肆:选择一名其他角色", true, lib.filter.notMe).set("ai", target => {
- var player = _status.event.player;
- var list = ["recover", "sha", "juedou", "huogong"];
- return list.reduce((p, c) => {
- return p + get.effect(target, { name: c }, player, player);
- }, 0);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.line(target, "fire");
- target.recover();
- event.list = ["sha", "juedou", "huogong"];
- player.addTempSkill("dccansi_draw");
- player.storage.dccansi_draw = target;
- } else event.finish();
- "step 2";
- var card = { name: event.list.shift(), isCard: true };
- if (target.isIn() && player.canUse(card, target, false)) player.useCard(card, target, false);
- if (event.list.length) event.redo();
- "step 3";
- player.removeSkill("dccansi_draw");
- },
- subSkill: {
- draw: {
- trigger: { global: "damageEnd" },
- forced: true,
- charlotte: true,
- onremove: true,
- filter: function (event, player) {
- return event.getParent(3).name == "dccansi" && player.storage.dccansi_draw == event.player;
- },
- content: function () {
- for (var i = 0; i < trigger.num; i++) {
- player.draw(2);
- }
- },
- },
- },
- ai: {
- threaten: 5,
- expose: 0.3,
- },
- },
- dcfozong: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- filter: function (event, player) {
- return player.countCards("h") > 7;
- },
- forced: true,
- direct: true,
- intro: {
- markcount: "expansion",
- content: "expansion",
- },
- content: function () {
- "step 0";
- var num = player.countCards("h") - 7;
- player.chooseCard("佛宗:将" + get.cnNumber(num) + "张手牌置于武将上", true, num);
- "step 1";
- if (result.bool) {
- var cards = result.cards;
- player.logSkill("dcfozong");
- player.addToExpansion(cards, player, "give").gaintag.add("dcfozong");
- }
- "step 2";
- var cards = player.getExpansions("dcfozong");
- if (cards.length < 7) event.finish();
- else {
- event.targets = game.filterPlayer(i => i != player).sortBySeat(player);
- game.delayx();
- }
- "step 3";
- var target = targets.shift();
- event.target = target;
- player.line(target);
- var cards = player.getExpansions("dcfozong");
- if (!cards.length) event._result = { bool: false };
- else
- target
- .chooseButton(['###佛宗###获得一张牌并令' + get.translation(player) + "回复1点体力,或点击“取消”令其失去1点体力
", cards])
- .set("ai", button => {
- if (_status.event.refuse) return get.value(button.link) - 7.5;
- return get.value(button.link);
- })
- .set("refuse", get.attitude(target, player) < 1 && get.effect(player, { name: "losehp" }, player, target) > 0);
- "step 4";
- if (result.bool) {
- var card = result.links[0];
- target.gain(card, "give", player);
- player.recover(target);
- } else player.loseHp();
- "step 5";
- if (targets.length) event.goto(3);
- },
- ai: { halfneg: true },
- },
- //滕芳兰
- dcluochong: {
- audio: 2,
- trigger: { global: "roundStart" },
- filter: function (event, player) {
- return game.hasPlayer(current => current.countDiscardableCards(player, "hej") > 0);
- },
- direct: true,
- async content(event, trigger, player) {
- if (_status.connectMode)
- game.broadcastAll(function () {
- _status.noclearcountdown = true;
- });
- const lose_list = [];
- let num = 4 - player.countMark("dcluochong");
- while (num > 0) {
- const result = await player
- .chooseTarget(get.prompt("dcluochong"), `弃置任意名角色区域内的累计至多${num}张牌`, (card, player, target) => {
- return target.hasCard(card => {
- const discarded = _status.event.lose_list.find(item => item[0] == target);
- if (discarded && discarded[1].includes(card)) return false;
- return lib.filter.canBeDiscarded(card, player, target, "dcluochong");
- }, "hej");
- })
- .set("ai", target => {
- const player = _status.event.player,
- discarded = _status.event.lose_list.find(item => item[0] == target);
- if (discarded) {
- if (target == player) return 0;
- const num = discarded[1].length;
- if (num > 1 && player.hp + player.hujia > 2) return 0;
- }
- if (target == player) {
- if (ui.cardPile.childNodes.length > 80 && player.hasCard(card => get.value(card) < 8)) return 20;
- return 0;
- }
- return get.effect(target, { name: "guohe_copy2" }, player, player);
- })
- .set("lose_list", lose_list)
- .forResult();
- if (result.bool) {
- const target = result.targets[0];
- const cards = await player
- .choosePlayerCard(target, true, "hej", [1, num], `选择弃置${get.translation(target)}区域内的牌`)
- .set("filterButton", button => {
- const card = button.link,
- target = _status.event.target,
- player = get.player();
- const discarded = _status.event.lose_list.find(item => item[0] == target);
- if (discarded && discarded[1].includes(card)) return false;
- return lib.filter.canBeDiscarded(card, player, target, "dcluochong");
- })
- .set("lose_list", lose_list)
- .set("ai", button => {
- if (ui.selected.buttons.length > 0) return false;
- var val = get.buttonValue(button);
- if (get.attitude(_status.event.player, _status.event.target) > 0) return -val;
- return val;
- })
- .forResultCards();
- num -= cards.length;
- const index = lose_list.find(item => item[0] == target);
- if (!index) {
- lose_list.push([target, cards]);
- } else {
- index[1].addArray(cards);
- }
- } else {
- break;
- }
- }
- if (_status.connectMode) {
- game.broadcastAll(function () {
- delete _status.noclearcountdown;
- game.stopCountChoose();
- });
- }
- if (lose_list.length > 0) {
- lib.tempSortSeat = trigger.player;
- lose_list.sort((a, b) => {
- return lib.sort.seat(a[0], b[0]);
- });
- delete lib.tempSortSeat;
- player.logSkill(
- "dcluochong",
- lose_list.map(i => i[0])
- );
- if (lose_list.some(i => i[1].length > 2)) {
- game.log(player, "可弃置牌数", "#g-1");
- player.addMark("dcluochong", 1, false);
- }
- if (lose_list[0].length == 1) {
- lose_list[0][0].discard(lose_list[0][1]);
- } else {
- game.loseAsync({
- lose_list: lose_list,
- discarder: player,
- }).setContent("discardMultiple");
- }
- }
- },
- ai: {
- threaten: 2.5,
- effect: {
- target: function (card, player, target, current) {
- if (get.type(card) == "delay" && current < 0) {
- var current = _status.currentPhase;
- if (current.getSeatNum() > target.getSeatNum()) return "zerotarget";
- }
- },
- },
- },
- },
- dcaichen: {
- audio: 2,
- init: function (player) {
- game.addGlobalSkill("dcaichen_hit");
- },
- onremove: function (player) {
- if (!game.hasPlayer(current => current.hasSkill("dcaichen"), true)) game.removeGlobalSkill("dcaichen_hit");
- },
- trigger: {
- player: ["loseAfter", "phaseDiscardBefore"],
- global: "loseAsyncAfter",
- target: "useCardToTargeted",
- },
- filter: function (event, player, name) {
- if (event.name == "phaseDiscard") return ui.cardPile.childNodes.length > 40;
- if (name == "useCardToTargeted") return ui.cardPile.childNodes.length < 40 && get.suit(event.card) == "spade";
- if (event.getParent().name != "dcluochong") return false;
- if (event.name == "loseAsync" && !event.getl(player).cards.length) return false;
- return ui.cardPile.childNodes.length > 80;
- },
- forced: true,
- content: function () {
- if (trigger.name.indexOf("lose") == 0) player.draw(2);
- else if (trigger.name == "phaseDiscard") {
- trigger.cancel();
- game.log(player, "跳过了弃牌阶段");
- } else {
- trigger.directHit.add(player);
- game.log(player, "不可响应", trigger.card);
- }
- },
- subSkill: {
- hit: {
- trigger: { player: "dieAfter" },
- filter: function (event, player) {
- return !game.hasPlayer(current => current.hasSkill("dcaichen"), true);
- },
- silent: true,
- forceDie: true,
- content: function () {
- game.removeGlobalSkill("dcaichen_hit");
- },
- ai: {
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- return arg && arg.card && arg.target && arg.target.hasSkill("dcaichen") && ui.cardPile.childNodes.length < 40 && get.suit(arg.card) === "spade";
- },
- },
- },
- },
- },
- //杨彪
- dczhaohan: {
- audio: 2,
- trigger: { player: "phaseDrawBegin2" },
- frequent: true,
- filter: function (event, player) {
- return !event.numFixed;
- },
- content: function () {
- trigger.num += 2;
- trigger.dczhaohan = true;
- player.addTempSkill("dczhaohan_choose", "phaseDrawAfter");
- },
- subSkill: {
- choose: {
- trigger: { player: "gainAfter" },
- filter: function (event, player) {
- return event.getParent(2).dczhaohan && player.countCards("h") >= 2;
- },
- forced: true,
- charlotte: true,
- popup: false,
- content: function () {
- "step 0";
- var choices = [],
- choiceList = ["将两张手牌交给一名没有手牌的角色", "弃置两张手牌"];
- if (game.hasPlayer(current => current.countCards("h") == 0)) choices.push("选项一");
- else choiceList[0] = '' + choiceList[0] + "";
- choices.push("选项二");
- if (choices.length == 1) event._result = { control: "选项二" };
- else
- player
- .chooseControl(choices)
- .set("choiceList", choiceList)
- .set("ai", () => _status.event.choice)
- .set(
- "choice",
- (function () {
- if (
- game.hasPlayer(current => {
- return current.countCards("h") == 0 && get.attitude(player, current) > 0;
- })
- )
- return "选项一";
- return "选项二";
- })()
- );
- "step 1";
- if (result.control == "选项一") {
- player.chooseCardTarget({
- filterCard: true,
- selectCard: 2,
- forced: true,
- filterTarget: function (card, player, target) {
- return !target.countCards("h");
- },
- ai1: function (card) {
- return 7 - get.value(card);
- },
- ai2: function (target) {
- return get.attitude(_status.event.player, target);
- },
- prompt: "将两张手牌交给一名没有手牌的角色",
- });
- } else {
- player.chooseToDiscard("昭汉:请弃置两张手牌", true, 2);
- event.finish();
- }
- "step 2";
- if (result.bool) {
- player.give(result.cards, result.targets[0]);
- }
- },
- },
- },
- },
- oldjinjie: {
- audio: "dcjinjie",
- trigger: { global: "dying" },
- hasPhase: function (player) {
- var history = player.actionHistory;
- for (var i = history.length - 1; i >= 0; i--) {
- if (history[i].isMe && !history[i].isSkipped) return true;
- if (history[i].isRound) break;
- }
- return false;
- },
- direct: true,
- content: function () {
- "step 0";
- player.chooseBool(get.prompt("oldjinjie", trigger.player), "令其摸一张牌").set("ai", () => {
- return get.attitude(_status.event.player, _status.event.getTrigger().player) > 0;
- });
- "step 1";
- if (result.bool) {
- player.logSkill("oldjinjie", trigger.player);
- trigger.player.draw();
- } else event.finish();
- if (lib.skill.oldjinjie.hasPhase(player)) event.finish();
- "step 2";
- var num = 0;
- var history = player.actionHistory;
- for (var i = history.length - 1; i >= 0; i--) {
- for (var evt of history[i].useSkill) {
- if (evt.skill == "oldjinjie") num++;
- }
- if (history[i].isRound) break;
- }
- if (num == 0) {
- player.chooseBool(get.prompt("oldjinjie", trigger.player), "令其回复1点体力").set("ai", () => {
- var player = _status.event.player;
- return get.effect(_status.event.getTrigger().player, { name: "tao" }, player, player) > 0;
- });
- } else {
- player
- .chooseToDiscard(get.prompt("oldjinjie", trigger.player), "弃置" + get.cnNumber(num) + "张牌,令其回复1点体力", "he", num)
- .set("ai", card => {
- if (_status.event.eff > 0) return get.value({ name: "tao" }) - get.value(card);
- return 0;
- })
- .set("eff", get.effect(trigger.player, { name: "tao" }, player, player));
- }
- "step 3";
- if (result.bool) {
- player.line(trigger.player, "green");
- trigger.player.recover();
- }
- },
- },
- dcjinjie: {
- audio: 2,
- trigger: { global: "dying" },
- async cost(event, trigger, player) {
- const target = trigger.player;
- const result = await player
- .chooseControl(
- [0, 1, 2, 3].map(i => get.cnNumber(i, true)),
- "cancel2"
- )
- .set("prompt", get.prompt("dcjinjie", target))
- .set("prompt2", `令${get.translation(target)}摸至多三张牌,然后你可以弃置等量的牌令其回复1点体力。`)
- .set("ai", () => {
- return get.event("choice");
- })
- .set(
- "choice",
- (() => {
- if (get.attitude(player, target) <= 0) return "cancel2";
- if (target === player) return 3;
- const unusefulCount = player.countCards("he", card => {
- return lib.filter.cardDiscardable(card, player, "dcjinjie") && get.value(card) < 5 && !player.canSaveCard(card, target);
- });
- if (
- [player, target]
- .unique()
- .map(current => {
- return current.countCards("hs", card => {
- return player.canSaveCard(card, target);
- });
- })
- .reduce((p, c) => p + c) > unusefulCount
- ) {
- return 3;
- }
- return Math.min(3, unusefulCount);
- })()
- )
- .forResult();
- if (result.control !== "cancel2") {
- event.result = {
- bool: true,
- cost_data: {
- index: result.index,
- },
- };
- }
- },
- round: 1,
- logTarget: "player",
- async content(event, trigger, player) {
- const num = event.cost_data.index,
- target = trigger.player;
- if (num > 0) await target.draw(num);
- let next;
- if (num > 0) {
- next = player
- .chooseToDiscard(`尽节:是否弃置${get.cnNumber(num)}张牌,令${get.translation(target)}回复1点体力?`, num, "he")
- .set("ai", card => {
- if (get.event("goon")) {
- return 100 / Math.max(0.01, get.value(card) + 20);
- }
- return 0;
- })
- .set(
- "goon",
- (() => {
- if (get.attitude(player, target) <= 0) return false;
- const count = player.countCards("hs", card => {
- return player.canSaveCard(card, target);
- });
- return (
- !count ||
- (count > 0 &&
- player.countCards("he", card => {
- return get.value(card) < 5;
- }) >= num)
- );
- })()
- );
- } else {
- next = player.chooseBool(`尽节:是否令${get.translation(target)}回复1点体力?`).set("choice", get.attitude(player, target) > 0);
- }
- const bool = await next.forResultBool();
- if (bool) {
- player.line(target, "green");
- await target.recover();
- }
- },
- subSkill: {
- round: {},
- },
- },
- oldjue: {
- audio: "dcjue",
- trigger: { player: "phaseZhunbeiBegin" },
- direct: true,
- filter: function (event, player) {
- return game.hasPlayer(current => (current.getHp() > player.getHp() || current.countCards("h") > player.countCards("h")) && player.canUse("sha", current, false));
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt("oldjue"), "视为对一名体力值或手牌数大于你的角色使用一张【杀】", (card, player, target) => {
- return player.canUse("sha", target, false) && (target.getHp() > player.getHp() || target.countCards("h") > player.countCards("h"));
- })
- .set("ai", target => {
- return get.effect(target, { name: "sha" }, _status.event.player);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("oldjue", target);
- player.useCard({ name: "sha", isCard: true }, target, false);
- }
- },
- },
- dcjue: {
- audio: 2,
- trigger: { global: "phaseJieshuBegin" },
- filter(event, player) {
- if (!lib.skill.dcjue.getCards().length) return false;
- return (
- (event.player !== player && event.player.isIn()) ||
- (event.player === player &&
- game.hasPlayer(current => {
- return current.isIn();
- }))
- );
- },
- round: 1,
- async cost(event, trigger, player) {
- let maxLimit = lib.skill.dcjue.getCards().length;
- if (trigger.player === player) {
- event.result = await player
- .chooseTarget(get.prompt("dcjue"), `选择一名其他角色,视为对其依次随机使用X次【杀】/【过河拆桥】/【五谷丰登】(X为${maxLimit}与其体力上限中的较小值)。`)
- .set("filterTarget", lib.filter.notMe)
- .set("ai", target => {
- return -get.attitude(get.player(), target);
- })
- .forResult();
- } else {
- const target = trigger.player;
- maxLimit = Math.min(maxLimit, target.maxHp);
- event.result = await player
- .chooseBool(get.prompt("dcjue", target), `视为对${get.translation(target)}依次随机使用${get.cnNumber(maxLimit)}次【杀】/【过河拆桥】/【五谷丰登】。`)
- .set("choice", get.attitude(player, target) < 0)
- .forResult();
- }
- },
- logTarget: "player",
- getCards() {
- const cards = [];
- game.countPlayer2(current => {
- current.getHistory("lose", evt => {
- if (evt.type == "discard") cards.addArray(evt.cards2.filterInD("d"));
- });
- });
- return cards;
- },
- async content(event, trigger, player) {
- const target = event.targets ? event.targets[0] : trigger.player;
- const nameList = ["sha", "guohe", "wugu"];
- let maxLimit = Math.min(lib.skill.dcjue.getCards().length, target.maxHp);
- while (maxLimit--) {
- if (!target.isIn()) return;
- const list = nameList.slice().randomSort();
- for (const name of list) {
- const card = new lib.element.VCard({ name });
- if (player.canUse(card, target)) {
- await player.useCard(card, target);
- await game.asyncDelayx();
- break;
- }
- }
- }
- },
- },
- //杨弘
- dcjianji: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.getAttackRange() >= 1;
- },
- selectTarget: function () {
- return [1, _status.event.player.getAttackRange()];
- },
- complexSelect: true,
- complexTarget: true,
- filterTarget: function (card, player, target) {
- var selected = ui.selected.targets;
- if (!selected.length) return true;
- for (var i of selected) {
- if (i.getNext() == target || i.getPrevious() == target) return true;
- }
- return false;
- },
- contentBefore: function () {
- event.getParent()._dcjianji_discarded = [];
- },
- content: function () {
- "step 0";
- if (target.countCards("he") > 0) target.chooseToDiscard(true, "he");
- else event.finish();
- "step 1";
- if (result.bool) {
- event.getParent()._dcjianji_discarded.push(target);
- }
- },
- contentAfter: function () {
- "step 0";
- var list = targets.filter(target => {
- var num = target.countCards("h");
- return targets.every(targetx => {
- return targetx.countCards("h") <= num;
- });
- });
- if (list.length) {
- event.list = list;
- event.current = event.list.shift();
- event.getParent()._dcjianji_discarded.remove(player);
- event.targets = event.getParent()._dcjianji_discarded;
- } else event.finish();
- "step 1";
- var targets = event.targets.slice();
- targets.remove(event.current);
- if (!targets.length) event._result = { bool: false };
- else
- event.current
- .chooseTarget("间计:是否视为对除" + get.translation(player) + "外的弃置过牌的一名角色使用一张杀?", (card, player, target) => {
- return _status.event.targets.includes(target) && player.canUse("sha", target, false);
- })
- .set("targets", event.targets)
- .set("ai", target => {
- var player = _status.event.player;
- return get.effect(target, { name: "sha" }, player, player);
- });
- "step 2";
- if (result.bool) {
- event.current.useCard({ name: "sha", isCard: true }, result.targets, false);
- }
- "step 3";
- if (event.list.length) {
- event.current = event.list.shift();
- event.goto(1);
- }
- },
- ai: {
- order: 7,
- result: {
- target: function (player, target) {
- var eff = get.effect(target, { name: "guohe_copy2" }, player, target) / 2;
- if (ui.selected.targets.length && eff < 0) {
- var len = target.countCards("h");
- if (
- ui.selected.targets.every(i => {
- return i.countCards("h") < len + 1;
- }) &&
- ui.selected.targets.some(i => {
- return get.effect(i, { name: "sha" }, target, player) > 0;
- })
- )
- return 0.1;
- }
- return ui.selected.targets.reduce((p, c) => p + get.effect(c, { name: "guohe_copy2" }, player, c) / 2, 0) + eff;
- },
- },
- },
- },
- dcyuanmo: {
- audio: 2,
- trigger: { player: ["damageEnd", "phaseZhunbeiBegin"] },
- direct: true,
- group: "dcyuanmo_add",
- init: function (player) {
- player.storage.dcyuanmo_range = 0;
- },
- change: function (player, num) {
- player.addSkill("dcyuanmo_range");
- if (typeof player.storage.dcyuanmo_range !== "number") player.storage.dcyuanmo_range = 0;
- if (!num) return;
- player.storage.dcyuanmo_range += num;
- if (player.storage.dcyuanmo_range != 0) player.markSkill("dcyuanmo_range");
- else player.unmarkSkill("dcyuanmo_range");
- game.log(player, "的攻击范围", (num > 0 ? "+" : "") + num);
- },
- content: function () {
- "step 0";
- event.targets = game.filterPlayer(current => player.inRange(current));
- var choiceList = ["攻击范围+1。然后若你攻击范围内的角色数因此增加,你可以获得其中任意名角色的一张牌", "攻击范围-1。然后你摸两张牌"];
- player
- .chooseControl("cancel2")
- .set("prompt", get.prompt("dcyuanmo"))
- .set("choiceList", choiceList)
- .set("ai", () => {
- return _status.event.choice;
- })
- .set(
- "choice",
- (function () {
- if (
- trigger.name == "phaseZhunbei" &&
- player.getAttackRange() == 1 &&
- !player.hasCard(card => {
- if (get.subtype(card) != "equip1" && !player.hasUseTarget(card)) return false;
- var num = 1;
- var info = get.info(card, false);
- if (info && info.distance && typeof info.distance.attackFrom == "number") num -= info.distance.attackFrom;
- return num > 1;
- }, "hs")
- )
- return "选项一";
- var targets = event.targets.slice(),
- targetsx = [];
- var _tmp = player.storage.dcyuanmo_range;
- player.storage.dcyuanmo_range++;
- try {
- targetsx = game.filterPlayer(current => player.inRange(current));
- } catch (e) {
- player.storage.dcyuanmo_range = _tmp;
- }
- player.storage.dcyuanmo_range = _tmp;
- targetsx.removeArray(targets);
- return targetsx.reduce((p, c) => {
- return p + Math.max(0, get.effect(c, { name: "shunshou_copy2" }, player, player));
- }, 0) >
- get.effect(player, { name: "draw" }, player, player) * 1.3
- ? "选项一"
- : "选项二";
- })()
- );
- "step 1";
- if (result.control == "cancel2") {
- event.finish();
- return;
- }
- player.logSkill("dcyuanmo");
- if (result.control == "选项一") {
- lib.skill.dcyuanmo.change(player, 1);
- var targetsx = game.filterPlayer(current => player.inRange(current));
- if (targetsx.length <= targets.length) {
- event.finish();
- } else event.targets = targetsx.removeArray(targets);
- } else {
- lib.skill.dcyuanmo.change(player, -1);
- player.draw(2);
- event.finish();
- }
- "step 2";
- player
- .chooseTarget("远谟:获得任意名本次进入你攻击范围的角色的一张牌", [1, targets.length], (card, player, target) => {
- return _status.event.getParent().targets.includes(target) && target.countGainableCards(player, "he") > 0;
- })
- .set("ai", target => {
- var player = _status.event.player;
- return get.effect(target, { name: "shunshou_copy2" }, player, player);
- });
- "step 3";
- if (result.bool) {
- var targets = result.targets.sortBySeat();
- player.line(targets);
- for (var target of targets) {
- player.gainPlayerCard(target, "he", true);
- }
- }
- },
- subSkill: {
- add: {
- audio: "dcyuanmo",
- trigger: { player: "phaseJieshuBegin" },
- filter: function (event, player) {
- return !game.hasPlayer(current => player.inRange(current));
- },
- prompt2: "令你的攻击范围+1",
- check: () => true,
- content: function () {
- lib.skill.dcyuanmo.change(player, 1);
- },
- },
- range: {
- charlotte: true,
- intro: {
- content: function (storage, player) {
- var num = player.storage.dcyuanmo_range;
- return "攻击范围" + (num >= 0 ? "+" : "") + num;
- },
- },
- mod: {
- attackRange: function (player, num) {
- return num + player.countMark("dcyuanmo_range");
- },
- },
- },
- },
- },
- //薛灵芸
- dcxialei: {
- audio: 2,
- trigger: {
- player: "loseAfter",
- global: ["cardsDiscardAfter", "loseAsyncAfter", "equipAfter"],
- },
- filter: function (event, player) {
- if (player.countMark("dcxialei_clear") >= 3) return false;
- if (event.name != "cardsDiscard") {
- return event.getd(player, "cards2").some(i => get.color(i, player) == "red");
- } else {
- if (!event.cards.filterInD("d").some(i => get.color(i, player) == "red")) return false;
- var evt = event.getParent();
- if (evt.name != "orderingDiscard") return false;
- var evtx = evt.relatedEvent || evt.getParent();
- if (evtx.player != player) return false;
- return player.hasHistory("lose", evtxx => {
- return evtx == (evtxx.relatedEvent || evtxx.getParent()) && evtxx.cards2.length > 0;
- });
- }
- },
- content: function () {
- "step 0";
- var cards = get.cards(3 - player.countMark("dcxialei_clear"));
- event.cards = cards;
- game.cardsGotoOrdering(cards);
- if (cards.length == 1) event._result = { bool: true, links: cards };
- else player.chooseButton(["霞泪:获得其中的一张牌", cards], true);
- "step 1";
- if (result.bool) {
- var card = result.links[0];
- player.gain(card, "gain2");
- event.cards.remove(card);
- if (event.cards.length) {
- player
- .chooseBool()
- .set("createDialog", ["是否将剩余牌置于牌堆底?", event.cards])
- .set("ai", () => _status.event.bool)
- .set(
- "bool",
- (function () {
- if (!player.hasSkill("dcanzhi")) return Math.random() < 0.5;
- if (player.hasSkill("dcanzhi_blocker")) {
- var next = _status.currentPhase.getNext();
- var judges = next.getCards("j");
- var val = 0;
- if (judges.length && !next.hasWuxie()) {
- var att = get.attitude(player, next);
- for (var i = 0; ; i++) {
- var judge = judges[i] && get.judge(judges[i]),
- card = event.cards[i];
- if (!judge || !card) break;
- val += judge(card) * att;
- i++;
- }
- }
- if (val > 0) return false;
- else if (val == 0) return Math.random() < 0.5;
- return true;
- }
- var card = event.cards[0];
- if (
- get.color(card, player) == "red" &&
- player.isPhaseUsing() &&
- player.countCards("hs", card => {
- return get.color(card) == "red" && player.hasValueTarget(card) && ["basic", "trick"].includes(get.type(card));
- }) > 0
- )
- return false;
- if (get.color(card, player) == "black") return false;
- return true;
- })()
- );
- } else event.goto(3);
- } else event.finish();
- "step 2";
- if (result.bool) {
- player.popup("牌堆底");
- game.log(player, "将" + get.cnNumber(event.cards.length) + "张牌置于了牌堆底");
- } else player.popup("牌堆顶");
- while (cards.length) {
- var card = cards.pop();
- card.fix();
- if (result.bool) ui.cardPile.appendChild(card);
- else ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
- }
- game.updateRoundNumber();
- "step 3";
- player.addMark("dcxialei_clear", 1, false);
- player.addTempSkill("dcxialei_clear");
- },
- subSkill: { clear: { onremove: true } },
- },
- dcanzhi: {
- enable: "phaseUse",
- filter: function (event, player) {
- return !player.hasSkill("dcanzhi_blocker");
- },
- group: "dcanzhi_damage",
- content: function () {
- "step 0";
- player.judge(result => {
- if (get.color(result) == "red") return _status.event.getParent().player.countMark("dcxialei_clear") / 2;
- return 2;
- }).judge2 = result => result.bool;
- "step 1";
- if (result.color == "red") {
- player.removeSkill("dcxialei_clear");
- event.finish();
- } else if (result.color == "black") {
- player.addTempSkill("dcanzhi_blocker");
- player
- .chooseTarget("暗织:是否令一名非当前回合角色获得本回合进入弃牌堆的两张牌?", (card, player, target) => {
- return target != _status.currentPhase;
- })
- .set("ai", target => {
- return get.effect(target, { name: "wuzhong" }, _status.event.player);
- });
- } else event.finish();
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.line(target);
- var cards = [];
- game.getGlobalHistory("cardMove", evt => {
- if ((evt.name == "lose" && evt.position == ui.discardPile) || evt.name == "cardsDiscard") {
- cards.addArray(evt.cards.filterInD("d"));
- }
- });
- if (cards.length) {
- player.chooseButton(["暗织:选择令" + get.translation(target) + "获得的牌", cards], true, Math.min(cards.length, 2)).set("ai", button => {
- var player = _status.event.player,
- target = _status.event.getParent().target;
- return get.sgnAttitude(player, target) * get.value(button.link, target);
- });
- }
- } else event.finish();
- "step 3";
- if (result.bool) {
- target.gain(result.links, "gain2");
- }
- },
- ai: {
- combo: "dcxialei",
- order: function (item, player) {
- if (player.countMark("dcxialei_clear") >= 2) return 10;
- if (player.hasHistory("useSkill", evt => evt.skill == "dcxialei") && get.color(ui.cardPile.firstChild, player) == "red" && player.countMark("dcxialei_clear") > 0) return 9;
- return 1;
- },
- result: {
- player: function (player) {
- return 1;
- },
- },
- },
- subSkill: {
- damage: {
- audio: "dcanzhi",
- trigger: { player: "damageEnd" },
- filter: function (event, player) {
- return !player.hasSkill("dcanzhi_blocker");
- },
- check: function (event, player) {
- return game.hasPlayer(current => {
- return get.attitude(player, current) > 0 && current != _status.currentPhase;
- });
- },
- prompt2: "你判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。",
- content: function () {
- event.setContent(lib.skill.dcanzhi.content);
- event.goto(0);
- },
- },
- blocker: { charlotte: true },
- },
- },
- //十周年王允
- dclianji: {
- enable: "phaseUse",
- audio: "wylianji",
- usable: 1,
- check: function (card) {
- return 5 - get.value(card);
- },
- filterTarget: function (card, player, target) {
- return target != player;
- },
- filterCard: true,
- content: function () {
- "step 0";
- var card = get.cardPile2(function (card) {
- return get.subtype(card) == "equip1" && targets[0].hasUseTarget(card);
- });
- if (card) {
- if (card.name == "qinggang" && !lib.inpile.includes("qibaodao")) {
- card.remove();
- card = game.createCard("qibaodao", card.suit, card.number);
- }
- targets[0].chooseUseTarget(card, true, "nopopup", "nothrow");
- } else {
- player.chat("没有装备牌了吗");
- game.log("但是牌堆里已经没有装备牌了!");
- }
- "step 1";
- game.updateRoundNumber();
- targets[0]
- .chooseToUse(get.translation(player) + "对你发动了【连计】", { name: "sha" })
- .set("targetRequired", true)
- .set("complexSelect", true)
- .set("filterTarget", function (card, player, target) {
- if (target == _status.event.source) return false;
- return lib.filter.filterTarget.apply(this, arguments);
- })
- .set("addCount", false)
- .set("source", player)
- .set("prompt2", "对除" + get.translation(player) + "外的一名角色使用一张【杀】,并将装备区内的武器牌交给其中一名目标角色;或点击“取消”,令" + get.translation(player) + "视为对你使用一张【杀】,并获得你装备区内的武器牌");
- "step 2";
- var card = targets[0].getEquips(1);
- if (result.bool) {
- player.addSkill("dclianji_1");
- if (card.length && result.targets.filter(target => target.isIn()).length > 0) {
- event.card = card;
- targets[0]
- .chooseTarget(true, "将" + get.translation(card) + "交给一名目标角色", (card, player, target) => {
- return _status.event.targets.includes(target);
- })
- .set("ai", function (target) {
- var card = _status.event.getParent().card[0];
- return (target.hasSkillTag("nogain") ? 0 : get.attitude(_status.event.player, target)) * Math.max(0.1, target.getUseValue(card));
- })
- .set("targets", result.targets);
- } else event.finish();
- } else {
- player.addSkill("dclianji_2");
- event.goto(4);
- }
- "step 3";
- targets[0].give(card, result.targets[0], "give");
- event.finish();
- "step 4";
- player.useCard({ name: "sha", isCard: true }, targets[0], false);
- "step 5";
- var card = targets[0].getEquips(1);
- if (card.length) targets[0].give(card, player, "give");
- },
- ai: {
- order: 4,
- result: {
- target: function (player, target) {
- if (game.countPlayer() == 2) return -3;
- if (!target.getEquip(1)) {
- if (
- game.hasPlayer(function (current) {
- return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0;
- })
- )
- return 3;
- return -3;
- }
- if (
- !game.hasPlayer(function (current) {
- return current != target && !current.hasSkillTag("nogain") && get.attitude(current, target) > 0;
- })
- )
- return -6;
- return 4 - get.value(target.getEquip(1));
- },
- },
- },
- subSkill: {
- 1: { charlotte: true, onremove: true },
- 2: { charlotte: true, onremove: true },
- },
- },
- dcmoucheng: {
- trigger: { player: "phaseZhunbeiBegin" },
- audio: "moucheng",
- forced: true,
- juexingji: true,
- skillAnimation: true,
- animationColor: "gray",
- derivation: "xinjingong",
- unique: true,
- filter: function (event, player) {
- return player.hasSkill("dclianji_1") && player.hasSkill("dclianji_2");
- },
- content: function () {
- player.awakenSkill("dcmoucheng");
- player.changeSkills(["xinjingong"], ["dclianji"]);
- },
- ai: {
- combo: "dclianji"
- },
- },
- //周宣
- dcwumei: {
- audio: 2,
- trigger: { player: "phaseBeginStart" },
- filter: function (event, player) {
- return !player.hasSkill("dcwumei_used");
- },
- direct: true,
- content: function () {
- "step 0";
- player.chooseTarget(get.prompt2("dcwumei")).set("ai", target => {
- return get.attitude(_status.event.player, target);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcwumei", target);
- player.addTempSkill("dcwumei_used", "roundStart");
- target.insertPhase();
- target.addTempSkill("dcwumei_wake", "phaseAfter");
- var targets = game.filterPlayer();
- if (!target.storage.dcwumei_wake) target.storage.dcwumei_wake = [[], []];
- for (var targetx of targets) {
- target.storage.dcwumei_wake[0].push(targetx);
- target.storage.dcwumei_wake[1].push(targetx.hp);
- }
- target.markSkill("dcwumei_wake");
- if (!trigger._finished) {
- trigger.finish();
- trigger.untrigger(true);
- trigger._triggered = 5;
- game.players
- .slice()
- .concat(game.dead)
- .forEach(current => {
- current.getHistory().isSkipped = true;
- current.getStat().isSkipped = true;
- });
- var evt = player.insertPhase();
- delete evt.skill;
- game.broadcastAll(function (player) {
- player.classList.remove("glow_phase");
- delete _status.currentPhase;
- }, player);
- }
- }
- },
- subSkill: {
- used: { charlotte: true },
- wake: {
- init: function (player) {
- game.addGlobalSkill("dcwumei_all");
- },
- onremove: function (player) {
- game.removeGlobalSkill("dcwumei_all");
- delete player.storage.dcwumei_wake;
- },
- trigger: { player: "phaseJieshuBegin" },
- charlotte: true,
- popup: false,
- forced: true,
- filter: function (event, player) {
- return player.storage.dcwumei_wake && player.storage.dcwumei_wake.length;
- },
- content: function () {
- var storage = player.storage.dcwumei_wake;
- for (var i = 0; i < storage[0].length; i++) {
- var target = storage[0][i];
- if (target && target.isIn()) {
- if (target.hp != storage[1][i]) {
- game.log(target, "将体力从", get.cnNumber(target.hp, true), "改为", get.cnNumber(storage[1][i], true));
- target.changeHp(storage[1][i] - target.hp)._triggered = null;
- }
- }
- }
- player.removeSkill("dcwumei_wake");
- },
- marktext: "寐",
- intro: {
- markcount: function (storage, player) {
- if (!storage || !storage.length) return 0;
- return storage[0].length;
- },
- content: function (storage, player) {
- if (!storage || !storage.length) return "无信息";
- var str = "所有角色于回合开始时的体力值:
";
- for (var i = 0; i < storage[0].length; i++) {
- var str2 = get.translation(storage[0][i]) + ":" + storage[1][i];
- if (!storage[0][i].isIn()) str2 = '' + str2 + "(已故)";
- str += "" + str2;
- }
- return str;
- },
- },
- },
- all: {
- trigger: { player: "dieAfter" },
- filter: function (event, player) {
- return !game.hasPlayer(current => current.hasSkill("dcwumei_wake"), true);
- },
- silent: true,
- forceDie: true,
- content: function () {
- game.removeGlobalSkill("dcwumei_all");
- },
- ai: {
- effect: {
- player_use: function (card, player, target) {
- if (get.tag(card, "recover") && target.hp > 0) return 0;
- if (get.tag(card, "damage")) return 0.5;
- },
- },
- },
- },
- },
- },
- dczhanmeng: {
- audio: 2,
- trigger: { player: "useCard" },
- filter(event, player) {
- return (
- !player.hasSkill("dczhanmeng_choice1") ||
- !player.hasSkill("dczhanmeng_choice2") ||
- (!player.hasSkill("dczhanmeng_choice0") &&
- !game.hasPlayer2(current => {
- const history = current.actionHistory;
- if (history.length < 2) return false;
- for (let i = history.length - 2; i >= 0; i--) {
- if (history[i].isSkipped) continue;
- const list = history[i].useCard.map(evt => evt.card.name);
- return list.includes(event.card.name);
- }
- return false;
- }, true))
- );
- },
- direct: true,
- content() {
- "step 0";
- var list = [];
- var choiceList = ["上回合若没有同名牌被使用过,你获得一张非伤害牌", "下回合当同名牌首次被使用后,你获得一张伤害牌", "令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害"];
- var used = game.hasPlayer2(current => {
- var history = current.actionHistory;
- if (history.length < 2) return false;
- for (let i = history.length - 2; i >= 0; i--) {
- if (history[i].isSkipped) continue;
- const list = history[i].useCard.map(evt => evt.card.name);
- return list.includes(trigger.card.name);
- }
- return false;
- }, true);
- if (!player.hasSkill("dczhanmeng_choice0") && !used) list.push("选项一");
- else choiceList[0] = '' + choiceList[0] + (used ? "(同名牌被使用过)" : "(已选择)") + "";
- if (!player.hasSkill("dczhanmeng_choice1")) list.push("选项二");
- else choiceList[1] = '' + choiceList[1] + "(已选择)";
- var other = game.hasPlayer(current => current != player);
- if (!player.hasSkill("dczhanmeng_choice2") && other) list.push("选项三");
- else choiceList[2] = '' + choiceList[2] + (!other ? "(没人啦)" : "(已选择)") + "";
- list.push("cancel2");
- player
- .chooseControl(list)
- .set("prompt", get.prompt("dczhanmeng"))
- .set("ai", () => {
- var choices = _status.event.controls.slice().remove("cancel2");
- var player = _status.event.player,
- evt = _status.event.getTrigger();
- if (!game.hasPlayer(current => get.attitude(player, current) < 0)) choices.remove("选项三");
- else if (choices.includes("选项三")) return "选项三";
- if (choices.includes("选项二")) {
- if (evt.card.name == "sha") return "选项二";
- if (get.type(evt.card, null, false) == "equip") choices.remove("选项二");
- }
- if (!choices.length) return "cancel2";
- return choices.randomGet();
- })
- .set("choiceList", choiceList);
- "step 1";
- if (result.control == "cancel2") {
- event.finish();
- return;
- }
- if (result.control == "选项一") {
- player.logSkill("dczhanmeng");
- game.log(player, "选择了", "#y" + result.control);
- player.addTempSkill("dczhanmeng_choice0");
- var card = get.cardPile2(card => {
- return !get.tag(card, "damage");
- });
- if (card) player.gain(card, "gain2");
- event.finish();
- } else if (result.control == "选项二") {
- player.logSkill("dczhanmeng");
- game.log(player, "选择了", "#y" + result.control);
- player.addTempSkill("dczhanmeng_choice1");
- trigger["dczhanmeng_" + player.playerid] = true;
- player.addSkill("dczhanmeng_delay");
- event.finish();
- } else {
- player.addTempSkill("dczhanmeng_choice2");
- player.chooseTarget("占梦:令一名其他角色弃置两张牌", lib.filter.notMe, true).set("ai", target => {
- var player = _status.event.player;
- var eff1 = get.effect(target, { name: "guohe_copy2" }, player, player) + 0.1;
- var eff2 = get.damageEffect(target, player, player, "fire") + 0.1;
- if (eff1 < 0 && eff2 < 0) return -eff1 * eff2;
- return eff1 * eff2;
- });
- }
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("dczhanmeng", target);
- game.log(player, "选择了", "#y选项三");
- target.chooseToDiscard(2, "he", true);
- } else event.finish();
- "step 3";
- if (result.bool) {
- var cards = result.cards;
- var num = 0;
- for (var card of cards) {
- num += get.number(card, false);
- }
- if (num > 10) {
- player.line(target, "fire");
- target.damage("fire");
- }
- }
- },
- ai: { threaten: 8 },
- subSkill: {
- delay: {
- trigger: { global: ["useCardAfter", "phaseBeginStart"] },
- charlotte: true,
- forced: true,
- popup: false,
- silent: true,
- filter(event, player, name) {
- var history = player.actionHistory;
- if (history.length < 2) return false;
- var list = history[history.length - 2].useCard;
- if (name == "phaseBeginStart") {
- return !list.some(evt => evt["dczhanmeng_" + player.playerid]);
- }
- for (var evt of list) {
- if (
- evt["dczhanmeng_" + player.playerid] &&
- event.card.name == evt.card.name &&
- game
- .getGlobalHistory("useCard", evtx => {
- return evtx.card.name == event.card.name;
- })
- .indexOf(event) == 0
- )
- return true;
- }
- return false;
- },
- content() {
- if (event.triggername != "phaseBeginStart") {
- player.logSkill("dczhanmeng_delay");
- var card = get.cardPile2(card => {
- return get.tag(card, "damage");
- });
- if (card) player.gain(card, "gain2");
- } else player.removeSkill("dczhanmeng_delay");
- },
- },
- choice0: { charlotte: true },
- choice1: { charlotte: true },
- choice2: { charlotte: true },
- },
- },
- //程秉
- dcjingzao: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- if (3 + player.countMark("dcjingzao_add") - player.countMark("dcjingzao_ban") <= 0) return false;
- return game.hasPlayer(current => lib.skill.dcjingzao.filterTarget(null, player, current));
- },
- filterTarget: function (card, player, target) {
- return player != target && !target.hasSkill("dcjingzao_temp");
- },
- content: function () {
- "step 0";
- target.addTempSkill("dcjingzao_temp");
- var cards = game.cardsGotoOrdering(get.cards(3 + player.countMark("dcjingzao_add") - player.countMark("dcjingzao_ban"))).cards;
- event.cards = cards;
- game.log(player, "亮出了", event.cards);
- event.videoId = lib.status.videoId++;
- game.broadcastAll(
- function (player, target, id, cards) {
- var str = get.translation(player) + "对" + (target == game.me ? "你" : get.translation(target)) + "发动了【经造】";
- var dialog = ui.create.dialog(str, cards);
- dialog.videoId = id;
- },
- player,
- target,
- event.videoId,
- event.cards
- );
- game.addVideo("showCards", player, [get.translation(player) + "发动了【经造】", get.cardsInfo(event.cards)]);
- game.delay(cards.length - 1);
- "step 1";
- target
- .chooseToDiscard("he")
- .set("prompt", false)
- .set("filterCard", card => {
- var names = _status.event.getParent().cards.map(i => i.name);
- return names.includes(get.name(card));
- })
- .set("ai", card => {
- var target = _status.event.player,
- player = _status.event.getParent().player;
- var att = get.attitude(target, player),
- val = get.value(card);
- if (!lib.skill.dcjingzao.filter(null, player)) {
- if (att > 0) return 0;
- return 6 - val;
- } else {
- if (att > 0) return 4 - val;
- return 0;
- }
- });
- var update = function (id, source) {
- var dialog = get.idDialog(id);
- if (dialog) {
- var div = ui.create.div("", dialog.content, 1);
- var name = get.translation(source);
- div.innerHTML = "弃置一张满足条件的牌,然后" + name + "〖经造〗本回合亮出牌数+1;或点“取消”令" + name + "随机获得每种牌名的牌各一张,且〖经造〗本回合失效";
- ui.update();
- }
- };
- if (target == game.me) update(event.videoId, player);
- else if (target.isOnline()) target.send(update, event.videoId, player);
- "step 2";
- game.broadcastAll("closeDialog", event.videoId);
- if (result.bool) {
- player.addTempSkill("dcjingzao_add");
- player.addMark("dcjingzao_add", 1, false);
- } else {
- var cards = cards.randomSort(),
- cards2 = [];
- for (var card of cards) {
- if (!cards2.map(i => i.name).includes(card.name)) cards2.push(card);
- }
- if (cards2.length) player.gain(cards2, "gain2");
- player.addTempSkill("dcjingzao_ban");
- player.addMark("dcjingzao_ban", cards2.length, false);
- }
- },
- ai: {
- order: 7,
- result: {
- player: 1,
- },
- },
- subSkill: {
- add: { charlotte: true, onremove: true },
- ban: { charlotte: true, onremove: true },
- temp: { charlotte: true },
- },
- },
- dcenyu: {
- audio: 2,
- trigger: { target: "useCardToTargeted" },
- forced: true,
- filter: function (event, player) {
- return (
- event.player != player &&
- game.hasPlayer2(current => {
- return current.hasHistory("useCard", evt => {
- return evt.card.name == event.card.name && evt != event.getParent() && evt.targets && evt.targets.includes(player);
- });
- }) &&
- (event.card.name == "sha" || get.type(event.card) == "trick")
- );
- },
- content: function () {
- trigger.getParent().excluded.add(player);
- },
- ai: {
- effect: {
- target: (card, player, target) => {
- if (player === target) return;
- if (
- game.hasPlayer2(current => {
- return current.hasHistory("useCard", evt => evt.card.name == card.name && evt.targets && evt.targets.includes(target));
- }) &&
- (card.name == "sha" || get.type(card) == "trick")
- )
- return "zeroplayertarget";
- },
- },
- },
- },
- //董贵人
- dclianzhi: {
- audio: 2,
- trigger: { player: "dying" },
- usable: 1,
- forced: true,
- locked: false,
- derivation: "dcshouze",
- group: ["dclianzhi_connect", "dclianzhi_reproach"],
- filter: function (event, player) {
- return player.getStorage("dclianzhi").filter(i => i && i.isIn()).length;
- },
- content: function () {
- player.recover();
- game.asyncDraw([player].concat(player.getStorage("dclianzhi").filter(i => i && i.isIn())).sortBySeat());
- },
- ai: {
- threaten: 0.6,
- },
- subSkill: {
- connect: {
- audio: "dclianzhi",
- trigger: {
- player: "enterGame",
- global: "phaseBefore",
- },
- forced: true,
- direct: true,
- filter: function (event, player) {
- return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0);
- },
- content: function () {
- "step 0";
- player
- .chooseTarget("连枝:请选择一名其他角色", lib.translate.dclianzhi_info, true, (card, player, target) => {
- return target != player && !player.getStorage("dclianzhi").includes(target);
- })
- .set("ai", target => {
- var att = get.attitude(_status.event.player, target);
- if (att > 0) return att + 1;
- if (att == 0) return Math.random();
- return att;
- })
- .set("animate", false);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dclianzhi");
- player.markAuto("dclianzhi", [target]);
- }
- },
- },
- reproach: {
- audio: "dclianzhi",
- trigger: { global: "dieAfter" },
- filter: function (event, player) {
- return player.getStorage("dclianzhi").includes(event.player);
- },
- direct: true,
- content: function () {
- "step 0";
- var num = Math.max(1, player.countMark("dclingfang"));
- player
- .chooseTarget(get.prompt("dclianzhi"), "选择一名其他角色,你与其各获得〖受责〗,且其获得" + num + "枚“绞”标记", (card, player, target) => {
- return target != player;
- })
- .set("ai", target => -get.attitude(_status.event.player, target));
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dclianzhi_reproach", target);
- player.addSkills("dcshouze");
- target.addSkills("dcshouze");
- target.addMark("dclingfang", Math.max(1, player.countMark("dclingfang")));
- }
- },
- },
- },
- },
- dclingfang: {
- audio: 2,
- trigger: {
- player: "phaseZhunbeiBegin",
- global: "useCardAfter",
- },
- forced: true,
- filter: function (event, player) {
- if (event.name != "useCard") return true;
- if (get.color(event.card) != "black") return false;
- if (event.player == player) return !event.targets || !event.targets.includes(player);
- return event.targets && event.targets.includes(player);
- },
- content: function () {
- player.addMark("dclingfang", 1);
- },
- ai: {
- combo: "dcfengying",
- },
- marktext: "绞",
- intro: {
- name: "绞",
- name2: "绞",
- content: "mark",
- },
- },
- dcfengying: {
- audio: 2,
- enable: "chooseToUse",
- group: "dcfengying_record",
- locked: false,
- filter: function (event, player) {
- var mark = player.countMark("dclingfang");
- if (mark <= 0 || !player.hasCard(card => get.number(card) <= mark, "hs")) return false;
- var storage = player.getStorage("dcfengying");
- if (!storage.length) return false;
- var storage2 = player.getStorage("dcfengying_used");
- return storage.some(name => {
- return !storage2.includes(name) && event.filterCard(get.autoViewAs({ name }, "unsure"), player, event);
- });
- },
- hiddenCard: function (player, name) {
- var list = player.getStorage("dcfengying");
- if (player.getStorage("dcfengying_used").includes(name)) return false;
- return list.includes(name) && player.hasCard(card => get.number(card) <= player.countMark("dclingfang"), "hs");
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = [];
- for (var name of player.storage.dcfengying) {
- if (get.type(name) == "basic") list.push(["基本", "", name]);
- if (get.type(name) == "trick") list.push(["锦囊", "", name]);
- }
- return ui.create.dialog("风影", [list, "vcard"]);
- },
- filter: function (button, player) {
- var card = { name: button.link[2], storage: { dcfengying: true } };
- if (player.getStorage("dcfengying_used").includes(card.name)) return false;
- return _status.event.getParent().filterCard(get.autoViewAs(card, "unsure"), player, _status.event.getParent());
- },
- check: function (button) {
- var player = _status.event.player;
- if (player.countCards("hs", button.link[2]) > 0) return 0;
- if (button.link[2] == "wugu") return;
- var effect = player.getUseValue(button.link[2]);
- if (effect > 0) return effect;
- return 0;
- },
- backup: function (links, player) {
- return {
- filterCard: function (card, player, event) {
- return get.number(card) <= player.countMark("dclingfang");
- },
- audio: "dcfengying",
- selectCard: 1,
- popname: true,
- check: function (card) {
- return 6 - get.value(card) + get.number(card) / 15;
- },
- position: "hs",
- viewAs: {
- name: links[0][2],
- storage: { dcfengying: true },
- },
- precontent: function () {
- player.logSkill("dcfengying");
- player.addTempSkill("dcfengying_used");
- player.markAuto("dcfengying_used", [event.result.card.name]);
- event.getParent().addCount = false;
- delete event.result.skill;
- },
- };
- },
- prompt: function (links, player) {
- return "将一张点数不大于" + get.strNumber(player.countMark("dclingfang")) + "的手牌当做" + get.translation(links[0][2]) + "使用(无距离和次数限制)";
- },
- },
- mod: {
- targetInRange: function (card) {
- if (card.storage && card.storage.dcfengying) return true;
- },
- cardUsable: function (card, player) {
- if (card.storage && card.storage.dcfengying) return Infinity;
- },
- },
- ai: {
- order: 4,
- result: {
- player: function (player) {
- if (_status.event.dying) return get.attitude(player, _status.event.dying);
- return 1;
- },
- },
- threaten: 2,
- combo: "dclingfang",
- },
- subSkill: {
- record: {
- trigger: { global: "phaseBegin" },
- filter: function (event, player) {
- return ui.discardPile.childNodes.length > 0;
- },
- forced: true,
- popup: false,
- content: function () {
- player.storage.dcfengying = [];
- for (var i = 0; i < ui.discardPile.childNodes.length; i++) {
- var card = ui.discardPile.childNodes[i];
- if (get.color(card, false) != "black") continue;
- if (!["basic", "trick"].includes(get.type(card))) continue;
- player.storage.dcfengying.add(card.name);
- }
- player.storage.dcfengying.sort((a, b) => {
- return lib.inpile.indexOf(a) - lib.inpile.indexOf(b);
- });
- },
- },
- used: {
- charlotte: true,
- onremove: true,
- intro: {
- content: "已使用过$",
- },
- },
- },
- },
- dcshouze: {
- audio: true,
- trigger: { player: "phaseJieshuBegin" },
- forced: true,
- filter: function (event, player) {
- return player.countMark("dclingfang") > 0;
- },
- content: function () {
- "step 0";
- player.removeMark("dclingfang", 1);
- "step 1";
- var card = get.discardPile(card => get.color(card, false) == "black");
- if (card) player.gain(card, "gain2");
- player.loseHp();
- },
- ai: {
- combo: "dclingfang",
- },
- },
- //袁姬
- dcmengchi: {
- audio: "dcfangdu",
- trigger: { player: ["linkBefore", "damageEnd"] },
- forced: true,
- filter: function (event, player) {
- var num = player.getStat("gain");
- if (num && num > 0) return false;
- if (event.name == "link") return !player.isLinked();
- return event.hasNature();
- },
- content: function () {
- if (trigger.name == "link") trigger.cancel();
- else player.recover();
- },
- ai: {
- effect: {
- target: function (card, player, target, current) {
- if (get.itemtype(player) != "player" || player._dcmengchi_aiChecking || target.getStat("gain")) return;
- if (card.name == "tiesuo" && !target.isLinked()) return 0;
- if (player.hasSkillTag("jueqing", false, target)) return;
- if (!get.tag(card, "damage") || get.tag(card, "natureDamage")) return;
- if (target.hp <= 1) return 0.75;
- if (
- !target.hasSkillTag("filterDamage", null, {
- player: player,
- card: card,
- }) &&
- player.hasSkillTag("damageBonus", false, {
- target: target,
- card: card,
- })
- ) {
- if (target.hp > 2) return 0.5;
- return 0.75;
- }
- if (get.attitude(player, target) > 0) return [0, 0];
- var sha = player.getCardUsable({ name: "sha" });
- player._dcmengchi_aiChecking = true;
- var num = player.countCards("h", function (card) {
- if (get.name(card) == "sha") {
- if (sha == 0) return false;
- else sha--;
- }
- return player.canUse(card, target) && get.effect(target, card, player, player) > 0;
- });
- delete player._dcmengchi_aiChecking;
- if (player.hasSkillTag("damage")) num++;
- if (num < 2) return [0, 0];
- },
- },
- },
- mod: {
- cardEnabled: function (card, player) {
- if (!player.getStat("gain")) return false;
- },
- cardSavable: function (card, player) {
- if (!player.getStat("gain")) return false;
- },
- },
- },
- dcfangdu: {
- audio: 2,
- trigger: {
- player: "damageEnd",
- },
- forced: true,
- filter: function (event, player) {
- if (player == _status.currentPhase) return false;
- return (
- (!event.hasNature() &&
- !player.hasHistory(
- "damage",
- evt => {
- return !evt.hasNature() && evt != event;
- },
- event
- )) ||
- (event.hasNature() &&
- !player.hasHistory(
- "damage",
- evt => {
- return evt.hasNature() && evt != event;
- },
- event
- ) &&
- event.source &&
- event.source.isIn() &&
- event.source.countGainableCards(player, "h"))
- );
- },
- content: function () {
- "step 0";
- if (!trigger.hasNature()) {
- player.recover();
- } else {
- var cards = trigger.source.getGainableCards(player, "h");
- if (cards.length) {
- player.gain(cards.randomGet(), trigger.source, "giveAuto", "bySelf");
- }
- }
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (player._dcfangdu_aiChecking || target == _status.currentPhase) return;
- if (!get.tag(card, "damage") || player.hasSkillTag("jueqing", false, target)) return;
- if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return;
- if (!get.tag(card, "natureDamage")) {
- if (target.hasHistory("damage", evt => !evt.hasNature())) return 1.5;
- else if (
- target.hp <= 1 ||
- (player.hasSkillTag("damageBonus", false, {
- target: target,
- card: card,
- }) &&
- !target.hasSkillTag("filterDamage", null, {
- player: player,
- card: card,
- }))
- )
- return 0.75;
- else {
- if (get.attitude(player, target) > 0) return [0, 0];
- var sha = player.getCardUsable({ name: "sha" });
- player._dcfangdu_aiChecking = true;
- var num = player.countCards("h", function (card) {
- if (get.name(card) == "sha") {
- if (sha == 0) return false;
- else sha--;
- }
- return player.canUse(card, target) && get.effect(target, card, player, player) > 0;
- });
- delete player._dcfangdu_aiChecking;
- if (player.hasSkillTag("damage")) num++;
- if (num < 2) return [0, 0];
- }
- }
- if (get.tag(card, "natureDamage") && !target.hasHistory("damage", evt => evt.hasNature()) && player.countCards("he") > 1) return [1, 1, 1, -1];
- },
- },
- },
- },
- dcjiexing: {
- audio: 2,
- trigger: { player: ["recoverEnd", "damageEnd", "loseHpEnd"] },
- check: function (event, player) {
- var current = _status.currentPhase;
- if (!player.hasSkill("dcmengchi") || get.attitude(player, current) >= 0) return true;
- var num = player.getStat("gain");
- if (num && num > 0) return true;
- if (current.countCards("hs", card => current.canUse(card, player) && get.effect(player, card, current, player) < 0) >= 2) return false;
- return true;
- },
- frequent: "check",
- content: function () {
- player.draw().gaintag = ["dcjiexing"];
- player.addTempSkill("dcjiexing_add");
- },
- subSkill: {
- add: {
- charlotte: true,
- mod: {
- ignoredHandcard: function (card, player) {
- if (card.hasGaintag("dcjiexing")) return true;
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && card.hasGaintag("dcjiexing")) return false;
- },
- },
- onremove: function (player) {
- player.removeGaintag("dcjiexing");
- },
- },
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "recover")) return [1, 1];
- if (get.tag(card, "damage")) {
- var draw = 0.9;
- if (target.hasSkill("dcmengchi") && target.getStat("gain")) draw = 1.8;
- if (
- target.hp <= 1 ||
- (card.name == "sha" && player.hasSkill("jiu")) ||
- (get.itemtype(player) == "player" &&
- !target.hasSkillTag("filterDamage", null, {
- player: player,
- card: card,
- }) &&
- player.hasSkillTag("damageBonus", false, {
- target: target,
- card: card,
- }))
- ) {
- if (target.hp > 2) return [1, draw];
- return;
- }
- return [1, draw];
- }
- },
- },
- },
- },
- //朱建平
- olddcxiangmian: {
- audio: "dcxiangmian",
- trigger: { global: "phaseJieshuBegin" },
- filter: function (event, player) {
- return !player.getStorage("olddcxiangmian").includes(event.player) && player != event.player;
- },
- logTarget: "player",
- check: function (event, player) {
- return get.attitude(player, event.player) < 0;
- },
- content: function () {
- "step 0";
- player.judge(card => 2 / Math.sqrt(get.number(card, false))).set("judge2", result => result.bool);
- "step 1";
- player.markAuto("olddcxiangmian", [trigger.player]);
- trigger.player.addSkill("olddcxiangmian_countdown");
- if (!trigger.player.storage["olddcxiangmian_countdown"]) trigger.player.storage["olddcxiangmian_countdown"] = [];
- [player.playerid, result.suit, result.number].forEach(i => trigger.player.storage["olddcxiangmian_countdown"].push(i));
- trigger.player.markSkill("olddcxiangmian_countdown");
- },
- intro: { content: "已对$发动过技能" },
- ai: {
- expose: 0.3,
- },
- subSkill: {
- countdown: {
- trigger: { player: "useCardAfter" },
- mark: true,
- marktext: "噬",
- silent: true,
- forced: true,
- charlotte: true,
- intro: {
- markcount: function (storage) {
- if (storage) {
- var list = storage.filter((_, i) => i % 3 == 2);
- return Math.min.apply(null, list);
- }
- },
- content: function (storage, player) {
- var str = "使用";
- for (var i = 0; i < storage.length / 3; i++) {
- str += get.cnNumber(storage[i * 3 + 2]) + "张" + get.translation(storage[i * 3 + 1]) + "牌、";
- }
- str = str.slice(0, -1);
- str += "后,失去等同于体力值的体力";
- return str;
- },
- },
- filter: function (event, player) {
- if (!player.getStorage("olddcxiangmian_countdown").length) return false;
- return player
- .getStorage("olddcxiangmian_countdown")
- .filter((_, i) => i % 3 == 1)
- .includes(get.suit(event.card, player));
- },
- content: function () {
- "step 0";
- var storage = player.getStorage("olddcxiangmian_countdown");
- for (var i = 0; i < storage.length / 3; i++) {
- if (storage[i * 3 + 1] == get.suit(trigger.card, player)) {
- storage[i * 3 + 2]--;
- }
- }
- player.markSkill("olddcxiangmian_countdown");
- "step 1";
- var storage = player.getStorage("olddcxiangmian_countdown");
- for (var i = 0; i < storage.length / 3; i++) {
- if (storage[i * 3 + 2] <= 0) {
- if (!event.isMine() && !event.isOnline()) game.delayx();
- player.logSkill("olddcxiangmian_countdown");
- var target = (_status.connectMode ? lib.playerOL : game.playerMap)[i];
- player.storage["olddcxiangmian_countdown"].splice(i * 3, 3);
- if (!player.getStorage("olddcxiangmian_countdown").length) {
- player.removeSkill("olddcxiangmian_countdown");
- }
- if (player.hp > 0) player.loseHp(player.hp);
- i--;
- }
- }
- },
- ai: {
- effect: {
- player_use: function (card, player, target) {
- if (typeof card != "object") return;
- var storage = player.getStorage("olddcxiangmian_countdown");
- for (var i = 0; i < storage.length / 3; i++) {
- if (get.suit(card, player) == storage[i * 3 + 1] && storage[i * 3 + 2] == 1 && !player.canSave(player) && !get.tag(card, "save")) return "zeroplayertarget";
- }
- },
- },
- },
- },
- },
- },
- dcxiangmian: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return game.hasPlayer(current => lib.skill.dcxiangmian.filterTarget(null, player, current));
- },
- filterTarget: function (card, player, target) {
- return !player.getStorage("dcxiangmian").includes(target) && player != target;
- },
- content: function () {
- "step 0";
- target.judge(card => -2 / Math.sqrt(get.number(card, false))).set("judge2", result => (result.bool === false ? true : false));
- "step 1";
- player.markAuto("dcxiangmian", [target]);
- target.addSkill("dcxiangmian_countdown");
- if (!target.storage["dcxiangmian_countdown"]) target.storage["dcxiangmian_countdown"] = [];
- [player.playerid, result.suit, result.number].forEach(i => target.storage["dcxiangmian_countdown"].push(i));
- target.markSkill("dcxiangmian_countdown");
- },
- intro: { content: "已对$发动过技能" },
- ai: {
- expose: 0.3,
- order: 10,
- result: { target: -5 },
- },
- subSkill: {
- countdown: {
- trigger: { player: "useCardAfter" },
- mark: true,
- marktext: "💀",
- silent: true,
- forced: true,
- charlotte: true,
- intro: {
- markcount: function (storage) {
- if (storage) {
- var list = storage.filter((_, i) => i % 3 == 2);
- return Math.min.apply(null, list);
- }
- },
- content: function (storage, player) {
- if (!storage) return;
- var str = "使用";
- str +=
- get.cnNumber(
- Math.min.apply(
- null,
- storage.filter((_, i) => i % 3 == 2)
- )
- ) + "张牌后,或使用一张";
- for (var i = 0; i < storage.length / 3; i++) {
- str += get.translation(storage[i * 3 + 1]) + "、";
- }
- str = str.slice(0, -1);
- str += "后,失去等同于体力值的体力";
- return str;
- },
- },
- filter: function (event, player) {
- if (!player.getStorage("dcxiangmian_countdown").length) return false;
- //return (player.getStorage('dcxiangmian_countdown').filter((_,i)=>i%3==1)).includes(get.suit(event.card,player));
- return true;
- },
- content: function () {
- "step 0";
- var storage = player.getStorage("dcxiangmian_countdown");
- for (var i = 0; i < storage.length / 3; i++) {
- if (storage[i * 3 + 1] == get.suit(trigger.card, player)) {
- storage[i * 3 + 2] = 0;
- } else storage[i * 3 + 2]--;
- }
- player.markSkill("dcxiangmian_countdown");
- "step 1";
- var storage = player.getStorage("dcxiangmian_countdown");
- for (var i = 0; i < storage.length / 3; i++) {
- if (storage[i * 3 + 2] <= 0) {
- if (!event.isMine() && !event.isOnline()) game.delayx();
- player.logSkill("dcxiangmian_countdown");
- player.storage["dcxiangmian_countdown"].splice(i * 3, 3);
- if (!player.getStorage("dcxiangmian_countdown").length) {
- player.removeSkill("dcxiangmian_countdown");
- }
- if (player.hp > 0) player.loseHp(player.hp);
- i--;
- }
- }
- },
- ai: {
- effect: {
- player_use: function (card, player, target) {
- if (typeof card != "object") return;
- var storage = player.getStorage("dcxiangmian_countdown");
- for (var i = 0; i < storage.length / 3; i++) {
- if ((storage[i * 3 + 2] == 1 || get.suit(card, player) == storage[i * 3 + 1]) && !player.canSave(player) && !get.tag(card, "save")) return "zeroplayertarget";
- }
- },
- },
- },
- },
- },
- },
- dctianji: {
- audio: 2,
- trigger: { global: "cardsDiscardAfter" },
- forced: true,
- filter: function (event, player) {
- var evt = event.getParent().relatedEvent;
- return evt && evt.name == "judge" && event.cards.filterInD("d").length;
- },
- content: function () {
- var card = trigger.cards[0],
- cards = [],
- func = ["type2", "suit", "number"];
- for (var fn of func) {
- var cardx = get.cardPile2(cardxx => {
- if (get[fn](card, player) == get[fn](cardxx, player) && !cards.includes(cardxx)) {
- return true;
- }
- });
- if (cardx) cards.push(cardx);
- }
- /*if(cards.length&&!player.isMaxHandcard(true)) player.draw();
- else*/ if (cards.length) player.gain(cards, "gain2");
- },
- },
- //赵直
- dctongguan: {
- trigger: {
- global: "phaseBegin",
- },
- filter: function (event, player) {
- return (
- event.player
- .getAllHistory()
- .filter(history => {
- return history.isMe && !history.isSkipped;
- })
- .indexOf(event.player.getHistory()) === 0 &&
- lib.skill.dctongguan.derivation.some(i => {
- return (player.getStorage("dctongguan")[i] || 0) < 2;
- })
- );
- },
- forced: true,
- locked: false,
- logTarget: "player",
- derivation: ["dctongguan_wuyong", "dctongguan_gangying", "dctongguan_duomou", "dctongguan_guojue", "dctongguan_renzhi"],
- content: function () {
- "step 0";
- var skills = lib.skill.dctongguan.derivation.slice();
- player
- .chooseControl(
- skills.filter(i => {
- return (player.getStorage("dctongguan")[i] || 0) < 2;
- })
- )
- .set(
- "choiceList",
- skills.map(i => {
- var info = "";
- switch (player.getStorage("dctongguan")[i]) {
- case 1:
- info = ' style="opacity:0.65;"';
- break;
- case 2:
- info = ' style="text-decoration:line-through; opacity:0.3;"';
- break;
- }
- return '「' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "」
" + "" + get.skillInfoTranslation(i, player) + "(已选过" + get.cnNumber(player.getStorage("dctongguan")[i] || 0) + "次)" + "
";
- })
- )
- .set("displayIndex", false)
- .set("prompt", "统观:为" + get.translation(trigger.player) + "选择一个属性")
- .set("ai", function () {
- var controls = _status.event.controls,
- target = _status.event.getTrigger().player;
- var str = target
- .getSkills(null, false, false)
- .map(i => get.skillInfoTranslation(i))
- .join("");
- var choices = [];
- if (controls.includes("dctongguan_wuyong") && /你对\S{1,15}造成\S{1,10}伤害/.test(str)) choices.push("dctongguan_wuyong");
- if (controls.includes("dctongguan_gangying") && /回复\S{1,5}体力/.test(str) && _status.event.player.getFriends().length) choices.push("dctongguan_gangying");
- if (controls.includes("dctongguan_duomou") && /你(可|可以)?摸\S{1,3}张牌/.test(str)) choices.push("dctongguan_duomou");
- if (controls.includes("dctongguan_guojue") && /(当【过河拆桥】使用|((弃置|获得)\S{1,5}其他角色\S{1,7}牌|))/.test(str)) choices.push("dctongguan_guojue");
- if (controls.includes("dctongguan_renzhi") && /交给\S{0,5}其他角色/.test(str) && _status.event.player.getFriends().length) choices.push("dctongguan_renzhi");
- if (choices.length) return choices.randomGet();
- return _status.event.controls.randomGet();
- });
- "step 1";
- if (result.control) {
- var skill = result.control;
- var func = lib.skill.dctongguan.localMark;
- if (event.player == game.me) func(skill, trigger.player);
- else if (event.isOnline()) player.send(func, skill, trigger.player);
- // game.log(player,'为',trigger.player,'选择了','#g「'+get.translation(skill)+'」','属性');
- game.log(player, "为", trigger.player, "选择了", "#g一个属性");
- // player.popup(skill);
- trigger.player.addSkill(skill);
- if (!player.storage.dctongguan) player.storage.dctongguan = {};
- if (!player.storage.dctongguan[skill]) player.storage.dctongguan[skill] = 0;
- player.storage.dctongguan[skill]++;
- }
- },
- localMark: function (skill, player) {
- var name = skill,
- info;
- if (player.marks[name]) player.updateMarks();
- if (lib.skill[name]) info = lib.skill[name].intro;
- if (!info) return;
- if (player.marks[name]) player.marks[name].info = info;
- else player.marks[name] = player.mark(name, info);
- player.updateMarks();
- },
- ai: {
- combo: "dcmengjie",
- },
- subSkill: {
- forceFinish: { charlotte: true },
- wuyong: {
- marktext: "勇",
- intro: {
- name: "武勇",
- content: "属性目标:造成伤害",
- },
- charlotte: true,
- silent: true,
- nopop: true,
- },
- gangying: {
- marktext: "刚",
- intro: {
- name: "刚硬",
- content: "属性目标:回复体力,或于得到牌后手牌数大于体力值",
- },
- charlotte: true,
- silent: true,
- forced: true,
- nopop: true,
- lastDo: true,
- trigger: { player: "gainEnd" },
- filter: function (event, player) {
- return player.countCards("h") > player.hp;
- },
- content: function () {
- trigger._dctongguan_gangying = true;
- },
- },
- duomou: {
- marktext: "谋",
- intro: {
- name: "多谋",
- content: "属性目标:于摸牌阶段外摸牌",
- },
- charlotte: true,
- silent: true,
- nopop: true,
- },
- guojue: {
- marktext: "决",
- intro: {
- name: "果决",
- content: "属性目标:弃置或获得其他角色牌",
- },
- charlotte: true,
- silent: true,
- nopop: true,
- },
- renzhi: {
- marktext: "仁",
- intro: {
- name: "仁智",
- content: "属性目标:交给其他角色牌",
- },
- charlotte: true,
- silent: true,
- nopop: true,
- },
- },
- },
- dcmengjie: {
- trigger: {
- global: "phaseEnd",
- },
- forced: true,
- direct: true,
- locked: false,
- filter: function (event, player) {
- var target = event.player;
- if (
- (target.hasSkill("dctongguan_gangying") &&
- (target.hasHistory("gain", function (evt) {
- return evt._dctongguan_gangying == true;
- }) ||
- game.getGlobalHistory("changeHp", function (evt) {
- return evt.player == target && (evt.getParent().name == "recover" || target.countCards("h") > target.hp);
- }).length > 0)) ||
- (target.hasSkill("dctongguan_wuyong") && target.getHistory("sourceDamage").length) ||
- (target.hasSkill("dctongguan_duomou") && target.getHistory("gain", evt => evt.getParent().name == "draw" && evt.getParent("phaseDraw").name != "phaseDraw").length)
- ) {
- return true;
- }
- var guojue = false,
- renzhi = false;
- game.countPlayer2(current => {
- if (current == target) return false;
- if (
- !guojue &&
- current.hasHistory("lose", evt => {
- if (evt.type == "discard") {
- if ((evt.discarder || evt.getParent(2).player) != target) return false;
- if (!evt.getl(current).cards2.length) return false;
- return true;
- } else if (evt.type == "gain") {
- var evtx = evt.getParent();
- if (evtx.giver || evtx.getParent().name == "gift") return false;
- var cards = evtx.getg(target);
- if (!cards.length) return false;
- var cards2 = evtx.getl(current).cards2;
- for (var card of cards2) {
- if (cards.includes(card)) return true;
- }
- }
- return false;
- })
- )
- guojue = true;
- if (
- !renzhi &&
- current.hasHistory("gain", evt => {
- if (evt.giver != target || evt.getParent().name == "gift") return false;
- return evt.cards.length;
- })
- )
- renzhi = true;
- });
- return (target.hasSkill("dctongguan_guojue") && guojue) || (target.hasSkill("dctongguan_renzhi") && renzhi);
- },
- rules: [
- target => target.getHistory("sourceDamage").length,
- target =>
- target.hasHistory("gain", function (evt) {
- return evt._dctongguan_gangying;
- }) ||
- game.getGlobalHistory("changeHp", function (evt) {
- return evt.player == target && evt.getParent().name == "recover";
- }).length > 0 ||
- target.countCards("h") > target.hp,
- target => target.getHistory("gain", evt => evt.getParent().name == "draw" && evt.getParent("phaseDraw").name != "phaseDraw").length,
- (target, bool) => bool,
- (target, bool) => bool,
- ],
- content: function () {
- "step 0";
- event.nowProperty = 0;
- var target = trigger.player;
- var guojue = false,
- renzhi = false;
- game.countPlayer2(current => {
- if (current == target) return false;
- if (
- !guojue &&
- current.hasHistory("lose", evt => {
- if (evt.type == "discard") {
- if ((evt.discarder || evt.getParent(2).player) != target) return false;
- if (!evt.getl(current).cards2.length) return false;
- return true;
- } else if (evt.type == "gain") {
- var evtx = evt.getParent();
- if (evtx.giver || evtx.getParent().name == "gift") return false;
- var cards = evtx.getg(target);
- if (!cards.length) return false;
- var cards2 = evtx.getl(current).cards2;
- for (var card of cards2) {
- if (cards.includes(card)) return true;
- }
- }
- return false;
- })
- )
- guojue = true;
- if (
- !renzhi &&
- current.hasHistory("gain", evt => {
- if (evt.giver != target || evt.getParent().name == "gift") return false;
- return evt.cards.length;
- })
- )
- renzhi = true;
- });
- event.guojue = guojue;
- event.renzhi = renzhi;
- "step 1";
- if (event.nowProperty >= 5) {
- event.finish();
- return;
- }
- var skills = lib.skill.dctongguan.derivation;
- if (trigger.player.hasSkill(skills[event.nowProperty]) && lib.skill.dcmengjie.rules[event.nowProperty](trigger.player, event[event.nowProperty == 3 ? "guojue" : "renzhi"])) {
- event.goto(2 + event.nowProperty * 2);
- } else event.redo();
- event.nowProperty++;
- "step 2";
- if (!game.hasPlayer(current => current != player)) event._result = { bool: false };
- else player.chooseTarget("梦解:对一名其他角色造成1点伤害", true, lib.filter.notMe).set("ai", target => get.damageEffect(target, player, player));
- "step 3";
- if (result.bool) {
- player.logSkill("dcmengjie", result.targets[0]);
- result.targets[0].damage();
- }
- game.delayx();
- event.goto(1);
- "step 4";
- if (game.hasPlayer(target => target != player && target.isDamaged()))
- player
- .chooseTarget("梦解:令一名角色回复1点体力", function (card, player, target) {
- return target.isDamaged();
- })
- .set("ai", target => get.recoverEffect(target, player, player));
- else event._result = { bool: false };
- "step 5";
- if (result.bool) {
- player.logSkill("dcmengjie", result.targets[0]);
- result.targets[0].recover();
- }
- game.delayx();
- event.goto(1);
- "step 6";
- player.logSkill("dcmengjie");
- player.draw(2);
- "step 7";
- game.delayx();
- event.goto(1);
- "step 8";
- if (game.hasPlayer(target => target.countDiscardableCards(player, "hej")))
- player
- .chooseTarget("梦解:弃置一名角色区域内至多两张牌", true, (card, player, target) => {
- return target.countDiscardableCards(player, "hej");
- })
- .set("ai", target => get.effect(target, { name: "guohe" }, player, player));
- else event._result = { bool: false };
- "step 9";
- if (result.bool) {
- player.logSkill("dcmengjie", result.targets[0]);
- player.discardPlayerCard(result.targets[0], true, "hej", [1, 2]);
- }
- game.delayx();
- event.goto(1);
- "step 10";
- if (!game.hasPlayer(current => current != player)) event._result = { bool: false };
- else
- player
- .chooseTarget("梦解:令一名其他角色将手牌补至上限", true, (card, player, target) => {
- return target != player;
- })
- .set("ai", target => {
- var att = get.attitude(_status.event.player, target);
- if (target.hasSkillTag("nogain")) att /= 6;
- if (att > 2) {
- return Math.min(5, target.maxHp) - target.countCards("h");
- }
- return att / 3;
- });
- "step 11";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcmengjie", target);
- var num = Math.min(5, target.maxHp - target.countCards("h"));
- target.draw(num);
- }
- game.delayx();
- event.goto(1);
- },
- ai: {
- combo: "dctongguan",
- },
- },
- //刘晔
- dcpoyuan: {
- audio: 2,
- trigger: {
- global: "phaseBefore",
- player: ["phaseZhunbeiBegin", "enterGame"],
- },
- filter: function (event, player) {
- if (event.name == "phase" && game.phaseNumber > 0) return false;
- if (player.getEquip("pilitoushiche")) {
- return game.hasPlayer(function (current) {
- return current != player && current.countDiscardableCards(player, "he") > 0;
- });
- } else {
- return player.hasEquipableSlot(5);
- }
- },
- direct: true,
- content: function () {
- "step 0";
- if (player.getEquip("pilitoushiche")) {
- event.goto(2);
- player
- .chooseTarget(get.prompt("dcpoyuan"), "弃置一名其他角色的至多两张牌", function (card, player, target) {
- return target != player && target.countDiscardableCards(player, "he") > 0;
- })
- .set("ai", function (target) {
- var player = _status.event.player,
- cards = target.getDiscardableCards(player, "he");
- var att = get.attitude(player, target);
- if (att < 0 && target.hasSkillTag("noe")) att /= 2;
- var zheng = [],
- fu = [];
- for (var i of cards) {
- var val = get.value(i, target);
- if (val > 0) zheng.push(i);
- else fu.push(i);
- }
- zheng.sort((a, b) => get.value(b, target) - get.value(a, target));
- fu.sort((a, b) => get.value(b, target) - get.value(a, target));
- zheng = zheng.slice(0, 2);
- fu = fu.slice(0, 2);
- var eff1 = 0,
- eff2 = 0;
- for (var i of zheng) eff1 += get.value(i, target);
- for (var i of fu) {
- if (get.position(i) == "e") eff2 += 1 - get.value(i, target);
- }
- return -att * Math.max(eff1, eff2);
- });
- } else {
- player.chooseBool(get.prompt("dcpoyuan"), "装备一张【霹雳投石车】").set("ai", function () {
- return true;
- });
- }
- "step 1";
- if (result.bool) {
- player.logSkill("dcpoyuan");
- var card = game.createCard("pilitoushiche", "diamond", 9);
- player.$gain2(card);
- game.delayx();
- player.equip(card);
- }
- event.finish();
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcpoyuan", target);
- player.discardPlayerCard(target, true, "he", [1, 2]);
- }
- },
- },
- dchuace: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return event.dchuace && event.dchuace.length > 0 && player.countCards("hs") > 0;
- },
- onChooseToUse: function (event) {
- if (game.online || event.dchuace) return;
- var list = lib.inpile.filter(function (i) {
- return get.type(i) == "trick" && lib.filter.filterCard({ name: i }, event.player, event);
- });
- if (!list.length) {
- event.set("dchuace", list);
- return;
- }
- var history = _status.globalHistory;
- var stop = false;
- for (var i = history.length - 1; i >= 0; i--) {
- var evt = history[i];
- if (!stop) {
- if (evt.isRound) stop = true;
- continue;
- } else {
- for (var j of evt.useCard) list.remove(j.card.name);
- if (evt.isRound) break;
- }
- }
- event.set("dchuace", list);
- },
- chooseButton: {
- dialog: function (event, player) {
- return ui.create.dialog("画策", [event.dchuace, "vcard"], "hidden");
- },
- check: function (button) {
- var player = _status.event.player,
- card = { name: button.link[2] };
- return player.getUseValue(card);
- },
- backup: function (links, player) {
- return {
- audio: "dchuace",
- viewAs: { name: links[0][2] },
- ai1: card => 7 - get.value(card),
- filterCard: true,
- position: "hs",
- popname: true,
- };
- },
- prompt: function (links, player) {
- return "将一张手牌当做【" + get.translation(links[0][2]) + "】使用";
- },
- },
- ai: {
- order: 6,
- result: { player: 1 },
- },
- subSkill: { backup: {} },
- },
- pilitoushiche: {
- trigger: { player: ["useCard", "respond"] },
- forced: true,
- equipSkill: true,
- filter: function (event, player) {
- return get.type(event.card) == "basic";
- },
- content: function () {
- if (player == _status.currentPhase) trigger.baseDamage++;
- else player.draw();
- },
- mod: {
- targetInRange: function (card, player) {
- if (get.type(card) == "basic" && player == _status.currentPhase) return true;
- },
- },
- },
- //路易
- dcyaoyi: {
- audio: 2,
- getZhuanhuanji: function (player, bool) {
- var skills = player.getSkills(null, false, false).filter(function (i) {
- return get.is.zhuanhuanji(i, player);
- });
- if (!bool) return skills;
- if (!skills.length) return "none";
- var state = lib.skill.dcyaoyi.getState(player, skills[0]);
- for (var i = 1; i < skills.length; i++) {
- if (lib.skill.dcyaoyi.getState(player, skills[i]) != state) return "none";
- }
- return state;
- },
- getState: function (player, skill) {
- var info = get.info(skill),
- zhuanhuan = info.zhuanhuanji;
- if (zhuanhuan && zhuanhuan == "number") return player.countMark(skill) % 2 == 1;
- return Boolean(player.storage[skill]);
- },
- trigger: {
- player: "enterGame",
- global: "phaseBefore",
- },
- forced: true,
- filter: function (event, player) {
- if (event.name == "phase" && game.phaseNumber != 0) return false;
- return game.hasPlayer(function (current) {
- return lib.skill.dcyaoyi.getZhuanhuanji(current).length == 0;
- });
- },
- logTarget: function () {
- return game.filterPlayer(function (current) {
- return lib.skill.dcyaoyi.getZhuanhuanji(current).length == 0;
- });
- },
- content: function () {
- var targets = lib.skill.dcyaoyi.logTarget().sortBySeat();
- for (var target of targets) target.addSkills("dcshoutan");
- game.delayx();
- },
- global: "dcyaoyi_blocker",
- subSkill: {
- blocker: {
- mod: {
- targetEnabled: function (card, player, target) {
- if (
- player == target ||
- !game.hasPlayer(function (current) {
- return current.hasSkill("dcyaoyi");
- })
- )
- return;
- var state1 = lib.skill.dcyaoyi.getZhuanhuanji(player, true);
- if (state1 == "none") return;
- if (lib.skill.dcyaoyi.getZhuanhuanji(target, true) == state1) return false;
- },
- cardSavable: function (card, player, target) {
- if (
- player == target ||
- !game.hasPlayer(function (current) {
- return current.hasSkill("dcyaoyi");
- })
- )
- return;
- var state1 = lib.skill.dcyaoyi.getZhuanhuanji(player, true);
- if (state1 == "none") return;
- if (lib.skill.dcyaoyi.getZhuanhuanji(target, true) == state1) return false;
- },
- },
- },
- },
- },
- dcshoutan: {
- audio: 2,
- enable: "phaseUse",
- position: "h",
- filter: function (event, player) {
- if (player.hasSkill("dcyaoyi")) return !player.hasSkill("dcshoutan_blocker", null, null, false);
- return player.countCards("h") > 0 && !player.getStat("skill").dcshoutan;
- },
- selectCard: function () {
- if (_status.event.player.hasSkill("dcyaoyi")) return [0, 1];
- return [1, 1];
- },
- filterCard: function (card, player) {
- if (player.hasSkill("dcyaoyi")) return false;
- var color = get.color(card, player);
- if (player.storage.dcshoutan) return color == "black";
- return color != "black";
- },
- prompt: function () {
- var player = _status.event.player;
- if (player.hasSkill("dcyaoyi")) return "点击“确认”来变更转换技状态";
- if (player.storage.dcshoutan) return "弃置一张黑色手牌,变更转换技状态";
- return "弃置一张非黑色手牌,变更转换技状态";
- },
- check: function (card) {
- return 11 - get.value(card);
- },
- content: function () {
- player.changeZhuanhuanji("dcshoutan");
- player.addTempSkill("dcshoutan_blocker", {
- player: ["useCard1", "useSkillBegin", "phaseUseEnd"],
- });
- },
- zhuanhuanji: true,
- mark: true,
- marktext: "☯",
- intro: {
- content: function (storage, player) {
- if (storage) return "转换技。出牌阶段限一次,你可以弃置一张黑色手牌。";
- return "转换技。出牌阶段限一次,你可以弃置一张不为黑色的手牌。";
- },
- },
- ai: {
- order: 0.1,
- result: {
- player: function (player) {
- var base = 0;
- if (ui.selected.cards.length) base = get.value(ui.selected.cards[0]);
- var status = player.storage.dcshoutan;
- var cards = player.getCards("hs", function (card) {
- return !ui.selected.cards.includes(card);
- });
- for (var card of cards) {
- var val1 = player.getUseValue(card, null, true);
- player.storage.dcshoutan = !status;
- var val2 = 0;
- try {
- val2 = player.getUseValue(card, null, true);
- } catch (e) {
- player.storage.dcshoutan = status;
- }
- player.storage.dcshoutan = status;
- if (val2 > val1) base -= val2 - val1;
- }
- if (base < 0) return 1;
- return 0;
- },
- },
- },
- subSkill: { blocker: { charlotte: true } },
- },
- dcfuxue: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- direct: true,
- filter: function (event, player) {
- return player.hp > 0 && ui.discardPile.childNodes.length > 0;
- },
- content: function () {
- "step 0";
- var cards = Array.from(ui.discardPile.childNodes);
- var gains = cards.slice(0);
- var history = game.getAllGlobalHistory("cardMove", function (evt) {
- if (evt.name == "lose") return evt.position == ui.discardPile;
- return evt.name == "cardsDiscard";
- });
- for (var i = history.length - 1; i >= 0; i--) {
- var evt = history[i];
- var cards2 = evt.cards.filter(function (card) {
- return cards.includes(card);
- });
- if (cards2.length) {
- if (lib.skill.dcfuxue.isUse(evt)) {
- gains.removeArray(cards2);
- }
- cards.removeArray(cards2);
- }
- if (!cards.length) break;
- }
- if (gains.length) {
- var num = player.hp;
- player.chooseButton(["复学:选择获得" + (num > 0 ? "至多" : "") + get.cnNumber(num) + "张牌", gains], [1, num]).set("ai", function (button) {
- var player = _status.event.player,
- card = button.link;
- var getn = function (card) {
- return player.countCards("h", card.name) + ui.selected.buttons.filter(button => button.link.name == card.name).length;
- };
- var val = player.getUseValue(card);
- if (card.name == "tao" && getn(card) >= player.getDamagedHp()) return 0;
- if (card.name == "sha" && getn(card) >= player.getCardUsable("sha")) return 0;
- return val;
- });
- } else event.finish();
- "step 1";
- if (result.bool) {
- player.logSkill("dcfuxue");
- player.gain(result.links, "gain2").gaintag.add("dcfuxue");
- }
- },
- isUse: function (event) {
- if (event.name != "cardsDiscard") return false;
- var evtx = event.getParent();
- if (evtx.name != "orderingDiscard") return false;
- var evt2 = evtx.relatedEvent || evtx.getParent();
- return evt2.name == "phaseJudge" || evt2.name == "useCard";
- },
- group: "dcfuxue_draw",
- subSkill: {
- draw: {
- audio: "dcfuxue",
- trigger: { player: "phaseJieshuBegin" },
- forced: true,
- locked: false,
- mod: {
- aiOrder: function (player, card, num) {
- if (get.itemtype(card) == "card" && card.hasGaintag("dcfuxue")) return num + 0.5;
- },
- },
- filter: function (event, player) {
- return (
- player.hp > 0 &&
- !player.hasCard(function (card) {
- return card.hasGaintag("dcfuxue");
- }, "h")
- );
- },
- content: function () {
- player.draw(player.hp);
- },
- },
- },
- },
- //丁尚涴
- dcfengyan: {
- enable: "phaseUse",
- usable: 2,
- chooseButton: {
- dialog: function (event, player) {
- var dialog = ui.create.dialog("讽言:请选择一项", "hidden");
- dialog.add([
- [
- ["gain", "令一名体力值不大于你的其他角色交给你一张手牌"],
- ["sha", "视为对一名手牌数不大于你的其他角色使用一张【杀】"],
- ],
- "textbutton",
- ]);
- return dialog;
- },
- filter: function (button, player) {
- return !player.hasSkill("dcfengyan_" + button.link, null, null, false);
- },
- check: function (button) {
- var player = _status.event.player;
- if (
- button.link == "gain" &&
- game.hasPlayer(function (current) {
- return lib.skill.dcfengyan_gain.filterTarget(null, player, current) && get.effect(current, "dcfengyan_gain", player, player) > 0;
- })
- )
- return 4;
- if (
- button.link == "sha" &&
- game.hasPlayer(function (current) {
- return lib.skill.dcfengyan_sha.filterTarget(null, player, current) && get.effect(current, "dcfengyan_sha", player, player) > 0;
- })
- )
- return 4;
- return 2;
- },
- backup: function (links) {
- return get.copy(lib.skill["dcfengyan_" + links[0]]);
- },
- prompt: function (links) {
- if (links[0] == "gain") return "令一名体力值不大于你的其他角色交给你一张手牌";
- return "视为对一名手牌数不大于你的其他角色使用【杀】";
- },
- },
- ai: {
- order: 10,
- threaten: 1.7,
- result: { player: 1 },
- },
- subSkill: {
- backup: { audio: "dcfengyan" },
- gain: {
- audio: "dcfengyan",
- filterTarget: function (card, player, target) {
- return target != player && target.hp <= player.hp && target.countCards("h") > 0;
- },
- filterCard: () => false,
- selectCard: -1,
- content: function () {
- "step 0";
- player.addTempSkill("dcfengyan_gain", "phaseUseAfter");
- target.chooseCard("h", true, "交给" + get.translation(player) + "一张牌");
- "step 1";
- if (result.bool) target.give(result.cards, player);
- },
- ai: {
- tag: {
- loseCard: 1,
- gain: 1,
- },
- result: {
- player: 0.1,
- target: -1,
- },
- },
- },
- sha: {
- audio: "dcfengyan",
- filterTarget: function (card, player, target) {
- return target != player && target.countCards("h") <= player.countCards("h") && player.canUse("sha", target, false);
- },
- filterCard: () => false,
- selectCard: -1,
- content: function () {
- player.addTempSkill("dcfengyan_sha", "phaseUseAfter");
- player.useCard(
- {
- name: "sha",
- isCard: true,
- },
- target,
- false
- );
- },
- ai: {
- result: {
- player: function (player, target) {
- return get.effect(
- target,
- {
- name: "sha",
- isCard: true,
- },
- player,
- player
- );
- },
- },
- },
- },
- },
- },
- dcfudao: {
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return (event.name != "phase" || game.phaseNumber == 0) && game.hasPlayer(current => current != player);
- },
- content: function () {
- "step 0";
- player.chooseTarget(true, lib.filter.notMe, "抚悼:请选择一名“继子”", "你或“继子”每回合首次使用牌指定对方为目标后各摸两张牌;杀死你或“继子”的角色称为“决裂”。你或“继子”对“决裂”造成的伤害+1。“决裂”对你使用牌后,其本回合内不能再使用牌。").set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dcfudao", target);
- game.log(target, "成为了", player, "的继子");
- player.addSkill("dcfudao_effect");
- target.addSkill("dcfudao_effect");
- player.markAuto("dcfudao_effect", [target]);
- target.markAuto("dcfudao_effect", [player]);
- }
- },
- group: "dcfudao_refuse",
- subSkill: {
- effect: {
- trigger: { player: "useCardToPlayered" },
- forced: true,
- charlotte: true,
- usable: 1,
- filter: function (event, player) {
- var target = event.target;
- if (player == target || !target.isIn()) return false;
- return player.getStorage("dcfudao_effect").includes(target);
- },
- logTarget: "target",
- content: function () {
- "step 0";
- var list = [player, trigger.target];
- list.sortBySeat();
- game.asyncDraw(list, 2);
- "step 1";
- game.delayx();
- },
- marktext: "继",
- intro: { content: "已和$成为继母子关系" },
- group: ["dcfudao_revenge", "dcfudao_deadmark"],
- },
- deadmark: {
- trigger: { player: "dieBegin" },
- forced: true,
- popup: false,
- lastDo: true,
- silent: true,
- filter: function (event, player) {
- return get.itemtype(event.source) == "player";
- },
- content: function () {
- trigger.source.markAuto("dcfudao_deadmark", [player]);
- },
- marktext: "裂",
- intro: {
- name: "决裂",
- content: "你害死了$!",
- },
- },
- revenge: {
- trigger: { source: "damageBegin1" },
- forced: true,
- filter: function (event, player) {
- var storage1 = event.player.getStorage("dcfudao_deadmark"),
- storage2 = player.getStorage("dcfudao_effect");
- for (var i of storage1) {
- if (storage2.includes(i)) return true;
- }
- return false;
- },
- content: function () {
- trigger.num++;
- },
- logTarget: "player",
- },
- refuse: {
- trigger: { target: "useCardToTargeted" },
- forced: true,
- filter: function (event, player) {
- var storage1 = event.player.getStorage("dcfudao_deadmark"),
- storage2 = player.getStorage("dcfudao_effect");
- for (var i of storage1) {
- if (storage2.includes(i)) return true;
- }
- return false;
- },
- content: function () {
- trigger.player.addTempSkill("dcfudao_blocker");
- },
- logTarget: "player",
- },
- blocker: {
- charlotte: true,
- mod: {
- cardEnabled: () => false,
- cardSavable: () => false,
- },
- },
- },
- },
- //全惠解
- dchuishu: {
- audio: 2,
- getList: function (player) {
- if (!player.storage.dchuishu) return [3, 1, 2];
- return player.storage.dchuishu.slice(0);
- },
- trigger: { player: "phaseDrawEnd" },
- content: function () {
- "step 0";
- var list = lib.skill.dchuishu.getList(player);
- event.list = list;
- player.draw(list[0]);
- "step 1";
- player.addTempSkill("dchuishu_effect");
- player.chooseToDiscard("h", true, event.list[1]);
- },
- onremove: true,
- mark: true,
- intro: {
- markcount: function (storage, player) {
- var list = lib.skill.dchuishu.getList(player);
- return Math.max.apply(Math, list);
- },
- content: function (storage, player) {
- var list = lib.skill.dchuishu.getList(player);
- return "摸牌阶段结束时,你可以摸[" + list[0] + "]张牌。若如此做:你弃置[" + list[1] + "]张手牌,且当你于本回合内弃置第[" + list[2] + "]+1张牌后,你从弃牌堆中获得[" + list[2] + "]张非基本牌。";
- },
- },
- subSkill: {
- effect: {
- charlotte: true,
- audio: "dchuishu",
- trigger: {
- player: "loseAfter",
- global: "loseAsyncAfter",
- },
- filter: function (event, player) {
- var num = lib.skill.dchuishu.getList(player)[2];
- if (typeof num != "number") return false;
- if (event.type != "discard" || event.getlx === false) return false;
- var evt = event.getl(player);
- if (evt.cards2.length == 0) return false;
- var prev = 0,
- goon = true;
- player.getHistory("lose", function (evt) {
- if (!goon || evt.type != "discard") return false;
- prev += evt.cards2.length;
- if (evt == event || event.getParent() == event) {
- goon = false;
- return false;
- }
- });
- return prev > num;
- },
- forced: true,
- popup: false,
- firstDo: true,
- content: function () {
- var num = lib.skill.dchuishu.getList(player)[2];
- var cards = [];
- for (var i = 0; i < num; i++) {
- var card = get.discardPile(function (card) {
- return get.type(card) != "basic" && !cards.includes(card);
- });
- if (card) cards.push(card);
- else break;
- }
- if (cards.length) player.gain(cards, "gain2");
- },
- },
- },
- },
- dcyishu: {
- audio: 2,
- trigger: {
- player: ["loseAfter"],
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- forced: true,
- filter: function (event, player) {
- var evt = event.getl(player);
- if (!evt || !evt.cards2.length) return false;
- return !player.isPhaseUsing() && player.hasSkill("dchuishu", null, null, false);
- },
- content: function () {
- "step 0";
- var list = lib.skill.dchuishu.getList(player);
- var min = list[0],
- max = list[0];
- for (var i of list) {
- if (i < min) min = i;
- if (i > max) max = i;
- }
- var exps = ["摸牌数[", "弃牌数[", "目标牌数["];
- var choices_min = [],
- choices_max = [];
- for (var i = 0; i < list.length; i++) {
- if (list[i] == min) choices_min.push(exps[i] + min + "]");
- if (list[i] == max) choices_max.push(exps[i] + max + "]");
- }
- if (choices_min.length == 1 && choices_max.length == 1) {
- event._result = { bool: true, min: choices_min[0], max: choices_max[0] };
- } else {
- if (player.isUnderControl()) game.swapPlayerAuto(player);
- var switchToAuto = function () {
- _status.imchoosing = false;
- event._result = {
- bool: true,
- min: choices_min[0],
- max: choices_max[0],
- };
- if (event.dialog) event.dialog.close();
- if (event.control) event.control.close();
- };
- var chooseButton = function (player, min, max) {
- var event = _status.event;
- player = player || event.player;
- var list = lib.skill.dchuishu.getList(player);
- if (!event._result) event._result = {};
- var dialog = ui.create.dialog("###易数:请选择更改的数值###令〖慧淑〗的一个最小数值+2并令一个最大数值-1", "forcebutton", "hidden");
- event.dialog = dialog;
- dialog.addText("最小值+2");
- var table = document.createElement("div");
- table.classList.add("add-setting");
- table.style.margin = "0";
- table.style.width = "100%";
- table.style.position = "relative";
- for (var i = 0; i < min.length; i++) {
- var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode");
- td.link = min[i];
- table.appendChild(td);
- td.innerHTML = "" + min[i] + "";
- td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () {
- if (_status.dragged) return;
- if (_status.justdragged) return;
- _status.tempNoButton = true;
- setTimeout(function () {
- _status.tempNoButton = false;
- }, 500);
- var link = this.link;
- var current = this.parentNode.querySelector(".bluebg");
- if (current) current.classList.remove("bluebg");
- this.classList.add("bluebg");
- event._result.min = link;
- });
- }
- dialog.content.appendChild(table);
- dialog.addText("最大值-1");
- var table2 = document.createElement("div");
- table2.classList.add("add-setting");
- table2.style.margin = "0";
- table2.style.width = "100%";
- table2.style.position = "relative";
- for (var i = 0; i < max.length; i++) {
- var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode");
- td.link = max[i];
- table2.appendChild(td);
- td.innerHTML = "" + max[i] + "";
- td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () {
- if (_status.dragged) return;
- if (_status.justdragged) return;
- _status.tempNoButton = true;
- setTimeout(function () {
- _status.tempNoButton = false;
- }, 500);
- var link = this.link;
- var current = this.parentNode.querySelector(".bluebg");
- if (current) current.classList.remove("bluebg");
- this.classList.add("bluebg");
- event._result.max = link;
- });
- }
- dialog.content.appendChild(table2);
- dialog.add(" ");
- event.dialog.open();
- event.switchToAuto = function () {
- event._result = {
- bool: true,
- min: min[0],
- max: max[0],
- };
- event.dialog.close();
- event.control.close();
- game.resume();
- _status.imchoosing = false;
- };
- event.control = ui.create.control("ok", function (link) {
- var result = event._result;
- if (!result.min || !result.max) return;
- result.bool = true;
- event.dialog.close();
- event.control.close();
- game.resume();
- _status.imchoosing = false;
- });
- for (var i = 0; i < event.dialog.buttons.length; i++) {
- event.dialog.buttons[i].classList.add("selectable");
- }
- game.pause();
- game.countChoose();
- };
- if (event.isMine()) chooseButton(player, choices_min, choices_max);
- else if (event.isOnline()) {
- event.player.send(chooseButton, event.player, choices_min, choices_max);
- event.player.wait();
- game.pause();
- } else switchToAuto();
- }
- "step 1";
- var map = event.result || result;
- if (map.bool) {
- var min = map.min,
- max = map.max;
- min = min.slice(0, min.indexOf("["));
- max = max.slice(0, max.indexOf("["));
- var exps = ["摸牌数", "弃牌数", "目标牌数"];
- var list = lib.skill.dchuishu.getList(player);
- list[exps.indexOf(min)] += 2;
- list[exps.indexOf(max)]--;
- game.log(player, "令", "#g【慧淑】", "中的", "#y" + min, "+2");
- game.log(player, "令", "#g【慧淑】", "中的", "#y" + max, "-1");
- player.storage.dchuishu = list;
- } else event.finish();
- "step 2";
- player.markSkill("dchuishu");
- game.delayx();
- },
- ai: { combo: "dchuishu" },
- },
- dcligong: {
- audio: 2,
- juexingji: true,
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- filter: function (event, player) {
- if (!player.hasSkill("dchuishu")) return false;
- var list = lib.skill.dchuishu.getList(player);
- for (var i of list) {
- if (i >= 5) return true;
- }
- return false;
- },
- skillAnimation: true,
- animationColor: "wood",
- content: function () {
- "step 0";
- player.awakenSkill("dcligong");
- player.gainMaxHp();
- player.recover();
- "step 1";
- player.removeSkills("dcyishu");
- "step 2";
- var list;
- if (_status.characterlist) {
- list = [];
- for (var i = 0; i < _status.characterlist.length; i++) {
- var name = _status.characterlist[i];
- if (lib.character[name][1] == "wu" && (lib.character[name][0] == "female" || lib.character[name][0] == "double")) list.push(name);
- }
- } else if (_status.connectMode) {
- list = get.charactersOL(function (i) {
- return lib.character[i][1] != "wu" || (lib.character[i][0] != "female" && lib.character[i][0] != "double");
- });
- } else {
- list = get.gainableCharacters(function (info) {
- return info[1] == "wu" && (info[0] == "female" || info[0] == "double");
- });
- }
- var players = game.players.concat(game.dead);
- for (var i = 0; i < players.length; i++) {
- list.remove(players[i].name);
- list.remove(players[i].name1);
- list.remove(players[i].name2);
- }
- list = list.randomGets(4);
- var skills = [];
- for (var i of list) {
- skills.addArray(
- (lib.character[i][3] || []).filter(function (skill) {
- var info = get.info(skill);
- return info && !info.charlotte;
- })
- );
- }
- if (!list.length || !skills.length) {
- event.result = {
- bool: false,
- skills: [],
- };
- return;
- }
- if (player.isUnderControl()) {
- game.swapPlayerAuto(player);
- }
- var switchToAuto = function () {
- _status.imchoosing = false;
- event._result = {
- bool: true,
- skills: skills.randomGets(2),
- };
- if (event.dialog) event.dialog.close();
- if (event.control) event.control.close();
- };
- var chooseButton = function (list, skills) {
- var event = _status.event;
- if (!event._result) event._result = {};
- event._result.skills = [];
- var rSkill = event._result.skills;
- var dialog = ui.create.dialog("请选择获得至多两个技能", [list, "character"], "hidden");
- event.dialog = dialog;
- var table = document.createElement("div");
- table.classList.add("add-setting");
- table.style.margin = "0";
- table.style.width = "100%";
- table.style.position = "relative";
- for (var i = 0; i < skills.length; i++) {
- var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode");
- td.link = skills[i];
- table.appendChild(td);
- td.innerHTML = "" + get.translation(skills[i]) + "";
- td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () {
- if (_status.dragged) return;
- if (_status.justdragged) return;
- _status.tempNoButton = true;
- setTimeout(function () {
- _status.tempNoButton = false;
- }, 500);
- var link = this.link;
- if (!this.classList.contains("bluebg")) {
- if (rSkill.length >= 2) return;
- rSkill.add(link);
- this.classList.add("bluebg");
- } else {
- this.classList.remove("bluebg");
- rSkill.remove(link);
- }
- });
- }
- dialog.content.appendChild(table);
- dialog.add(" ");
- dialog.open();
-
- event.switchToAuto = function () {
- event.dialog.close();
- event.control.close();
- game.resume();
- _status.imchoosing = false;
- };
- event.control = ui.create.control("ok", function (link) {
- event.dialog.close();
- event.control.close();
- game.resume();
- _status.imchoosing = false;
- });
- for (var i = 0; i < event.dialog.buttons.length; i++) {
- event.dialog.buttons[i].classList.add("selectable");
- }
- game.pause();
- game.countChoose();
- };
- if (event.isMine()) {
- chooseButton(list, skills);
- } else if (event.isOnline()) {
- event.player.send(chooseButton, list, skills);
- event.player.wait();
- game.pause();
- } else {
- switchToAuto();
- }
- "step 3";
- var map = event.result || result;
- if (map.skills && map.skills.length) {
- //player.removeSkill('dchuishu');
- //for(var i of map.skills) player.addSkillLog(i);
- player.changeSkills(map.skills, ["dchuishu"]);
- player.markAuto("zhuSkill_dcligong", map.skills);
- } else {
- player.draw(3);
- }
- },
- ai: {
- combo: "dchuishu",
- },
- },
- //杜夔
- dcfanyin: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- filter: function (event, player) {
- return ui.cardPile.childNodes.length > 0;
- },
- frequent: true,
- locked: false,
- content: function () {
- "step 0";
- var card = false;
- if (typeof event.num != "number") {
- var num = false;
- for (var i = 0; i < ui.cardPile.childNodes.length; i++) {
- var cardx = ui.cardPile.childNodes[i],
- numc = get.number(cardx, false);
- if (!num || numc < num) {
- num = numc;
- card = cardx;
- if (num == 1) break;
- }
- }
- event.num = num;
- } else {
- card = get.cardPile2(function (card) {
- return get.number(card, false) == event.num;
- });
- }
- if (!card) event.finish();
- else {
- event.card = card;
- game.cardsGotoOrdering(card);
- player.showCards(card, get.translation(player) + "发动了【泛音】");
- }
- "step 1";
- if (!player.hasUseTarget(card, false)) event._result = { index: 1 };
- else {
- player
- .chooseControl()
- .set("choiceList", ["使用" + get.translation(card) + "(无距离限制)", "令本回合使用的下一张牌可以多选择一个目标"])
- .set("ai", function () {
- var player = _status.event.player,
- card = _status.event.getParent().card;
- if (player.hasValueTarget(card, false)) return 0;
- return 1;
- });
- }
- "step 2";
- if (result.index == 0) {
- var cardx = get.autoViewAs(card);
- cardx.storage.dcfanyin = true;
- player.chooseUseTarget(cardx, [card], true, false);
- } else {
- player.addTempSkill("dcfanyin_effect");
- player.addMark("dcfanyin_effect", 1, false);
- }
- event.num *= 2;
- if (event.num <= 13) event.goto(0);
- },
- mod: {
- targetInRange: function (card) {
- if (card.storage && card.storage.dcfanyin) return true;
- },
- },
- subSkill: {
- effect: {
- audio: "dcfanyin",
- trigger: { player: "useCard2" },
- forced: true,
- charlotte: true,
- popup: false,
- onremove: true,
- filter: function (event, player) {
- var type = get.type(event.card, null, false);
- return type == "basic" || type == "trick";
- },
- content: function () {
- "step 0";
- var num = player.countMark("dcfanyin_effect");
- player.removeSkill("dcfanyin_effect");
- var filter = function (event, player) {
- var card = event.card,
- info = get.info(card);
- if (info.allowMultiple == false) return false;
- if (event.targets && !info.multitarget) {
- if (
- game.hasPlayer(function (current) {
- return !event.targets.includes(current) && lib.filter.targetEnabled2(card, player, current) && lib.filter.targetInRange(card, player, current);
- })
- ) {
- return true;
- }
- }
- return false;
- };
- if (!filter(trigger, player)) event.finish();
- else {
- var prompt = "为" + get.translation(trigger.card) + "增加至多" + get.cnNumber(num) + "个目标?";
- trigger.player
- .chooseTarget(get.prompt("dcfanyin_effect"), prompt, [1, num], function (card, player, target) {
- var player = _status.event.player;
- return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target);
- })
- .set("ai", function (target) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.player;
- return get.effect(target, trigger.card, player, player);
- })
- .set("card", trigger.card)
- .set("targets", trigger.targets);
- }
- "step 1";
- if (result.bool) {
- if (!event.isMine() && !event.isOnline()) game.delayx();
- } else event.finish();
- "step 2";
- player.logSkill("dcfanyin_effect", result.targets);
- game.log(result.targets, "也成为了", trigger.card, "的目标");
- trigger.targets.addArray(result.targets);
- },
- intro: { content: "使用下一张牌选择目标后,可以增加#个目标" },
- },
- },
- },
- dcpeiqi: {
- audio: 2,
- trigger: { player: "damageEnd" },
- filter: function (event, player) {
- return player.canMoveCard();
- },
- check: function (event, player) {
- return player.canMoveCard(true);
- },
- content: function () {
- "step 0";
- player.moveCard(true);
- "step 1";
- if (result.bool && player.canMoveCard()) {
- var goon = true,
- players = game.filterPlayer();
- for (var i = 0; i < players.length; i++) {
- for (var j = i + 1; j < players.length; j++) {
- if (!players[i].inRange(players[j]) || !players[i].inRangeOf(players[j])) {
- goon = false;
- break;
- }
- }
- if (!goon) break;
- }
- if (goon) player.moveCard();
- }
- },
- },
- //张奋和大风车
- dcwanglu: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- content: function () {
- if (!player.hasEquipableSlot(5) || player.getEquip("dagongche")) {
- var next = player.phaseUse();
- event.next.remove(next);
- trigger.getParent().next.push(next);
- } else {
- var card = game.createCard("dagongche", "spade", 9);
- player.$gain2(card);
- game.delayx();
- player.equip(card);
- }
- },
- broadcast: function (player) {
- var card = player.getEquip("dagongche");
- if (card)
- game.broadcast(
- function (card, storage) {
- card.storage = storage;
- },
- card,
- card.storage
- );
- },
- },
- dcxianzhu: {
- audio: 2,
- trigger: { source: "damageSource" },
- direct: true,
- filter: function (event, player) {
- if (!event.card || event.card.name != "sha") return false;
- var card = player.getEquip("dagongche");
- if (!card) return false;
- var num = 0;
- for (var i = 1; i <= 3; i++) {
- var key = "大攻车选项" + get.cnNumber(i, true);
- if (card.storage[key]) num += card.storage[key];
- }
- return num < 5;
- },
- content: function () {
- "step 0";
- var choiceList = ["令【杀】无距离限制且无视防具", "令【杀】的可选目标数+1", "令后续的弃牌数量+1"];
- var list = [];
- var card = player.getEquip("dagongche");
- for (var i = 1; i <= 3; i++) {
- var key = "大攻车选项" + get.cnNumber(i, true);
- var num = card.storage[key];
- if (i == 1) {
- if (!num) list.push("选项一");
- else choiceList[0] = '' + choiceList[0] + "(已强化)";
- } else {
- list.push("选项" + get.cnNumber(i, true));
- if (num) choiceList[i - 1] += "(已强化" + num + "次)";
- }
- }
- player
- .chooseControl(list, "cancel2")
- .set("prompt", "是否发动【陷筑】强化【大攻车】?")
- .set("choiceList", choiceList)
- .set("ai", function () {
- var player = _status.event.player,
- controls = _status.event.controls.slice(0);
- var getval = function (choice) {
- var card = player.getEquip("dagongche");
- if (choice == "选项一") {
- card.storage.大攻车选项一 = 1;
- var goon = false;
- if (
- game.hasPlayer(function (current) {
- var eff1 = 0,
- eff2 = 0;
- var cardx = { name: "sha", isCard: true };
- if (player.canUse(cardx, current)) eff1 = get.effect(current, cardx, player, player);
- cardx.storage = { dagongche: true };
- if (player.canUse(cardx, current)) eff2 = get.effect(current, cardx, player, player);
- return eff2 > eff1;
- })
- )
- goon = true;
- delete card.storage.大攻车选项一;
- if (goon) return 5;
- return 0;
- } else if (choice == "选项二") {
- var num = 1;
- if (card.storage.大攻车选项二) num += card.storage.大攻车选项二;
- var cardx = { name: "sha", isCard: true };
- if (
- game.countPlayer(function (current) {
- return player.canUse(cardx, current) && get.effect(current, cardx, player, player) > 0;
- }) > num
- )
- return 2;
- } else if (choice == "选项三") return 1;
- return 0;
- };
- var eff = 0,
- current = "cancel2";
- for (var i of controls) {
- var effx = getval(i);
- if (effx > eff) {
- eff = effx;
- current = i;
- }
- }
- return current;
- });
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("dcxianzhu");
- var card = player.getEquip("dagongche"),
- key = "大攻车" + result.control;
- if (!card.storage[key]) card.storage[key] = 0;
- card.storage[key]++;
- lib.skill.dcwanglu.broadcast(player);
- }
- },
- ai: {
- combo: "dcwanglu",
- },
- },
- dcchaixie: {
- audio: 2,
- trigger: {
- player: ["loseAfter"],
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- forced: true,
- filter: function (event, player) {
- var evt = event.getl(player);
- if (!evt || !evt.es || !evt.es.length) return false;
- for (var card of evt.es) {
- if (card.name == "dagongche") {
- for (var i = 1; i <= 3; i++) {
- if (card.storage["大攻车选项" + get.cnNumber(i, true)]) return true;
- }
- }
- }
- return false;
- },
- content: function () {
- var num = 0;
- var evt = trigger.getl(player);
- for (var card of evt.es) {
- if (card.name == "dagongche") {
- for (var i = 1; i <= 3; i++) {
- var key = "大攻车选项" + get.cnNumber(i, true);
- if (card.storage[key]) num += card.storage[key];
- }
- }
- }
- player.draw(num);
- },
- ai: {
- combo: "dcwanglu",
- },
- },
- dagongche_skill: {
- trigger: { player: "phaseUseBegin" },
- direct: true,
- filter: function (event, player) {
- var cardx = {
- name: "sha",
- isCard: true,
- storage: { dagongche: true },
- };
- return player.hasUseTarget(cardx);
- },
- equipSkill: true,
- content: function () {
- var card = {
- name: "sha",
- isCard: true,
- storage: { dagongche: true },
- };
- lib.skill.dcwanglu.broadcast(player);
- player.chooseUseTarget(card, "大攻车:是否视为使用【杀】?", false).logSkill = "dagongche_skill";
- },
- mod: {
- targetInRange: function (card, player, target) {
- if (card.storage && card.storage.dagongche) {
- var cardx = player.getEquip("dagongche");
- if (cardx && cardx.storage.大攻车选项一) return true;
- }
- },
- selectTarget: function (card, player, range) {
- if (card.storage && card.storage.dagongche && range[1] != -1) {
- var cardx = player.getEquip("dagongche");
- if (cardx && cardx.storage.大攻车选项二) range[1] += cardx.storage.大攻车选项二;
- }
- },
- canBeDiscarded: function (card) {
- if (card.name == "dagongche" && get.position(card) == "e") {
- for (var i = 1; i <= 3; i++) {
- if (card.storage["大攻车选项" + get.cnNumber(i, true)]) return;
- }
- return false;
- }
- },
- },
- ai: {
- unequip: true,
- skillTagFilter: function (player, tag, arg) {
- if (!arg || !arg.card || !arg.card.storage || !arg.card.storage.dagongche) return false;
- var card = player.getEquip("dagongche");
- if (!card || !card.storage.大攻车选项一) return false;
- },
- },
- group: "dagongche_skill_discard",
- subSkill: {
- discard: {
- trigger: { source: "damageSource" },
- equipSkill: true,
- forced: true,
- filter: function (event, player) {
- if (!event.card || !event.card.storage || !event.card.storage.dagongche) return false;
- if (event.getParent().type != "card") return false;
- return event.player.hasCard(function (card) {
- return lib.filter.canBeDiscarded(card, event.player, player);
- }, "he");
- },
- logTarget: "player",
- content: function () {
- var num = 1;
- var cardx = player.getEquip("dagongche");
- if (cardx && cardx.storage.大攻车选项三) num += cardx.storage.大攻车选项三;
- player.discardPlayerCard(trigger.player, true, num, "he");
- },
- },
- },
- },
- //刘徽
- dcgeyuan: {
- audio: 2,
- trigger: {
- global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"],
- },
- forced: true,
- filter: function (event, player) {
- var cards = event.getd();
- for (var i of cards) {
- if (lib.skill.dcgeyuan.filterNumber(player, get.number(i, false))) return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- event.cards = trigger.getd();
- "step 1";
- var card = false;
- for (var i of cards) {
- if (lib.skill.dcgeyuan.filterNumber(player, get.number(i, false))) {
- card = i;
- cards.remove(card);
- break;
- }
- }
- if (card) {
- var number = get.number(card, false);
- game.log(player, "将", "#y" + get.strNumber(number), "记录为", "#g“圆环之弧”");
- player.markAuto("dcgeyuan_homura", [number]);
- player.markSkill("dcgeyuan");
- if (player.getStorage("dcgeyuan").length > player.getStorage("dcgeyuan_homura").length) {
- if (cards.length > 0) event.redo();
- else event.finish();
- } else if (player.storage.dcgusuan) event.goto(5);
- } else event.finish();
- "step 2";
- var list = player.getStorage("dcgeyuan_homura");
- var num1 = list[0],
- num2 = list[list.length - 1];
- event.cards2 = [];
- var lose_list = [],
- players = game.filterPlayer();
- for (var current of players) {
- var cards = current.getCards("ej", function (card) {
- var num = get.number(card);
- return num == num1 || num == num2;
- });
- if (cards.length > 0) {
- current.$throw(cards);
- lose_list.push([current, cards]);
- event.cards2.addArray(cards);
- }
- }
- if (lose_list.length) {
- event.lose_list = lose_list;
- game.loseAsync({
- lose_list: lose_list,
- }).setContent("chooseToCompareLose");
- }
- "step 3";
- var list = player.getStorage("dcgeyuan_homura");
- var num1 = list[0],
- num2 = list[list.length - 1];
- var cards = event.cards2;
- for (var i = 0; i < ui.cardPile.childNodes.length; i++) {
- var card = ui.cardPile.childNodes[i];
- var number = get.number(card, false);
- if (number == num1 || number == num2) cards.push(card);
- }
- if (cards.length > 0) {
- if (event.lose_list) game.delayx();
- player.gain(cards, "gain2");
- }
- "step 4";
- var list = player.getStorage("dcgeyuan_homura");
- var num1 = list[0],
- num2 = list[list.length - 1];
- player.storage.dcgeyuan_homura = [];
- game.log(player, "清空了", "#g“圆环之弧”");
- player.markSkill("dcgeyuan");
- if (player.getStorage("dcgeyuan").length > 3) {
- player.unmarkAuto("dcgeyuan", [num1, num2]);
- game.log(player, "从", "#g“圆环之理”", "中移除了", "#y" + get.strNumber(num1), "和", "#y" + get.strNumber(num2));
- }
- event.finish();
- "step 5";
- player.chooseTarget("割圆:选择至多三名角色", "第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将所有手牌与牌堆底的牌交换", true, [1, 3]);
- "step 6";
- if (result.bool) {
- var targets = result.targets;
- event.targets = targets;
- player.line(targets);
- targets[0].draw(3);
- if (targets.length < 2) event.goto(4);
- } else event.goto(4);
- "step 7";
- if (targets[1].countCards("he") > 0) targets[1].chooseToDiscard("he", true, 4);
- if (targets.length < 3) event.goto(4);
- "step 8";
- var target = targets[2];
- var cards = get.bottomCards(5);
- game.cardsGotoOrdering(cards);
- var hs = target.getCards("h");
- if (hs.length > 0) target.lose(hs, ui.cardPile);
- target.gain(cards, "draw");
- event.goto(4);
- },
- group: "dcgeyuan_kyubey",
- filterNumber: function (player, num) {
- var list1 = player.getStorage("dcgeyuan");
- var list2 = player.getStorage("dcgeyuan_homura");
- if (!list1.includes(num)) return false;
- if (!list2.length) return true;
- if (list2.includes(num)) return false;
- var madoka = list1.indexOf(num);
- for (var i of list2) {
- var homura = list1.indexOf(i);
- var dist = Math.abs(madoka - homura);
- if (dist == 1 || dist == list1.length - 1) return true;
- }
- return false;
- },
- subSkill: {
- kyubey: {
- audio: "dcgeyuan",
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- forced: true,
- filter: function (event, player) {
- return (event.name != "phase" || game.phaseNumber == 0) && !player.storage.dcgusuan;
- },
- content: function () {
- var list = [];
- for (var i = 1; i <= 13; i++) {
- list.push(i);
- }
- list.randomSort();
- player.storage.dcgeyuan = list;
- player.markSkill("dcgeyuan");
- var str = "#y";
- for (var i = 0; i < 13; i++) {
- str += get.strNumber(list[i]);
- if (i != 12) str += ",";
- }
- game.log(player, "将", "#y“圆环之理”", "赋值为", str);
- },
- },
- },
- intro: {
- name: "圆环之理",
- markcount: function (storage, player) {
- if (!player.storage.dcgeyuan || !player.getStorage("dcgeyuan_homura").length) return 0;
- var list = player.storage.dcgeyuan.filter(i => lib.skill.dcgeyuan.filterNumber(player, i));
- if (!list.length) return 0;
- list = list.map(num => {
- var list = [1, 10, 11, 12, 13];
- if (list.includes(num)) return ["A", "X", "J", "Q", "K"][list.indexOf(num)];
- return parseFloat(num);
- });
- return list.reduce((str, num) => {
- return str + num;
- }, "");
- },
- mark: function (dialog, storage, player) {
- dialog.content.style["overflow-x"] = "visible";
- var list = storage;
- if (!storage || !storage.length) return "(圆环之理尚不存在)";
- var list2 = player.getStorage("dcgeyuan_homura");
- var core = document.createElement("div");
- core.style.width = "0";
- var centerX = -15,
- centerY = 80,
- radius = 80;
- var radian = (Math.PI * 2) / list.length;
- var fulllist = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];
- for (var i = 0; i < list.length; i++) {
- var td = document.createElement("div");
- var color = "";
- if (list2[0] == list[i]) color = ' class="yellowtext"';
- else if (list2.includes(list[i])) color = ' class="greentext"';
- td.innerHTML = "[" + fulllist[list[i] - 1] + "]";
- td.style.position = "absolute";
- core.appendChild(td);
- td.style.left = centerX + radius * Math.sin(radian * i) + "px";
- td.style.top = centerY - radius * Math.cos(radian * i) + "px";
- }
- dialog.content.appendChild(core);
- },
- },
- },
- dcjieshu: {
- audio: 2,
- trigger: { player: ["useCard", "respond"] },
- forced: true,
- filter: function (event, player) {
- var num = get.number(event.card, false);
- if (typeof num != "number") return false;
- return lib.skill.dcgeyuan.filterNumber(player, num);
- },
- content: function () {
- player.draw();
- },
- mod: {
- ignoredHandcard: function (card, player) {
- if (!player.getStorage("dcgeyuan").includes(get.number(card))) return true;
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && !player.getStorage("dcgeyuan").includes(get.number(card))) return false;
- },
- },
- ai: {
- combo: "dcgeyuan",
- },
- },
- dcgusuan: {
- audio: 2,
- trigger: { global: "phaseEnd" },
- forced: true,
- juexingji: true,
- skillAnimation: true,
- animationColor: "soil",
- filter: function (event, player) {
- return player.getStorage("dcgeyuan").length == 3;
- },
- content: function () {
- player.awakenSkill("dcgusuan");
- player.storage.dcgusuan = true;
- player.loseMaxHp();
- },
- ai: { combo: "dcgeyuan" },
- derivation: "dcgeyuan_magica",
- },
- //王昶
- dckaiji: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- if (player.maxHp <= 0) return false;
- if (!player.storage.dckaiji) return true;
- return player.hasCard(card => lib.filter.cardDiscardable(card, player, "phaseUse"), "he");
- },
- filterCard: function (card, player) {
- if (!player.storage.dckaiji) return false;
- return true;
- },
- position: "he",
- selectCard: function () {
- var player = _status.event.player;
- return player.storage.dckaiji ? [1, player.maxHp] : -1;
- },
- check: function (card) {
- var player = _status.event.player;
- if (!player.hasSkill("dcpingxi")) {
- if (ui.selected.cards.length) return 0;
- if (player.needsToDiscard()) return 12 - get.value(card);
- return 2 * player.hp + 1.5 - get.value(card);
- }
- var num = lib.skill.dcpingxi.getNum() + ui.selected.cards.length;
- if (
- num <
- game.countPlayer(function (current) {
- if (current == player || current.countCards("he") == 0) return false;
- return get.effect(current, { name: "guohe_copy2" }, player, player) + get.effect(current, { name: "sha" }, player, player) > 0;
- })
- ) {
- if (
- get.position(card) == "h" &&
- player.needsToDiscard(0, (i, player) => {
- return !ui.selected.cards.includes(i) && !player.canIgnoreHandcard(i);
- })
- )
- return 7 + 1 / Math.max(1, get.value(card));
- return 7 - get.value(card);
- }
- return 0;
- },
- content: function () {
- player.changeZhuanhuanji("dckaiji");
- if (!cards.length) player.draw(Math.min(player.maxHp, 5));
- },
- zhuanhuanji: true,
- mark: true,
- marktext: "☯",
- intro: {
- content: storage => "转换技。出牌阶段限一次,你可以" + (storage ? "弃置至多X张牌" : "摸X张牌") + "(X为你的体力上限且至多为5)。",
- },
- ai: {
- threaten: 1.6,
- order: function (item, player) {
- if (player.storage.dckaiji) return 0.1;
- return 8;
- },
- result: { player: 1 },
- },
- },
- dcpingxi: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- getNum: function () {
- var num = 0;
- game.getGlobalHistory("cardMove", function (evt) {
- if (evt.name == "lose" && evt.type == "discard") num += evt.cards2.length;
- });
- return num;
- },
- filter: function (event, player) {
- return (
- lib.skill.dcpingxi.getNum() > 0 &&
- game.hasPlayer(function (current) {
- return current != player;
- })
- );
- },
- content: function () {
- "step 0";
- var num = lib.skill.dcpingxi.getNum();
- player
- .chooseTarget(
- [1, num],
- function (card, player, target) {
- return target != player;
- },
- get.prompt("dcpingxi"),
- "选择至多" + get.cnNumber(num) + "名其他角色。弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】"
- )
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, { name: "guohe_copy2" }, player, player) + get.effect(target, { name: "sha" }, player, player);
- });
- "step 1";
- if (result.bool) {
- var targets = result.targets.sortBySeat();
- event.targets = targets;
- player.logSkill("dcpingxi", targets);
- event.num = 0;
- } else event.finish();
- "step 2";
- var target = targets[num];
- if (
- target.hasCard(function (card) {
- return lib.filter.canBeDiscarded(card, player, target);
- }, "he")
- )
- player.discardPlayerCard(target, "he", true);
- event.num++;
- if (event.num < targets.length) event.redo();
- "step 3";
- var targetsx = targets.filter(function (target) {
- return player.canUse("sha", target, false);
- });
- if (targetsx.length > 0)
- player.useCard(
- {
- name: "sha",
- isCard: true,
- },
- targetsx
- );
- },
- },
- //赵昂
- dczhongjie: {
- audio: 2,
- round: 1,
- trigger: { global: "dying" },
- logTarget: "player",
- filter: function (event, player) {
- return event.player.hp < 1 && event.reason && event.reason.name == "loseHp";
- },
- check: function (event, player) {
- return get.attitude(player, event.player) > 2;
- },
- content: function () {
- trigger.player.recover();
- trigger.player.draw();
- },
- },
- dcsushou: {
- audio: 2,
- trigger: { global: "phaseUseBegin" },
- filter: function (event, player) {
- return player.hp > 0 && event.player.isMaxHandcard(true);
- },
- logTarget: "player",
- check: function (event, player) {
- var num = player.hp;
- if (player.hasSkill("dczhongjie") && (player.storage.dczhongjie_roundcount || 0) < game.roundNumber) num++;
- return num > 1;
- },
- content: function () {
- "step 0";
- player.loseHp();
- event.target = trigger.player;
- "step 1";
- var num = player.getDamagedHp();
- if (num > 0) player.draw(num);
- if (player == target) event.finish();
- "step 2";
- var ts = target.getCards("h");
- if (ts.length < 2) event.finish();
- else {
- var hs = player.getCards("h");
- ts = ts.randomGets(Math.floor(ts.length / 2));
- if (!hs.length) {
- player.viewCards(get.translation(target) + "的部分手牌");
- event.finish();
- return;
- }
- var next = player.chooseToMove("夙守:交换至多" + get.cnNumber(Math.min(hs.length, ts.length, player.getDamagedHp())) + "张牌");
- next.set("list", [
- [get.translation(target) + "的部分手牌", ts, "dcsushou_tag"],
- ["你的手牌", hs],
- ]);
- next.set("filterMove", function (from, to, moved) {
- if (typeof to == "number") return false;
- var player = _status.event.player;
- var hs = player.getCards("h");
- var changed = hs.filter(function (card) {
- return !moved[1].includes(card);
- });
- var changed2 = moved[1].filter(function (card) {
- return !hs.includes(card);
- });
- if (changed.length < player.getDamagedHp()) return true;
- var pos1 = moved[0].includes(from.link) ? 0 : 1,
- pos2 = moved[0].includes(to.link) ? 0 : 1;
- if (pos1 == pos2) return true;
- if (pos1 == 0) {
- if (changed.includes(from.link)) return true;
- return changed2.includes(to.link);
- }
- if (changed2.includes(from.link)) return true;
- return changed.includes(to.link);
- });
- next.set("max", Math.min(hs.length, ts.length, player.getDamagedHp()));
- next.set("processAI", function (list) {
- if (_status.event.max) {
- let gain = list[0][1]
- .sort((a, b) => {
- return player.getUseValue(b, null, true) - player.getUseValue(a, null, true);
- })
- .slice(0, _status.event.max),
- give = list[1][1]
- .sort((a, b) => {
- return get.value(a, player) - get.value(b, player);
- })
- .slice(0, _status.event.max);
- for (let i of gain) {
- if (get.value(i, player) < get.value(give[0], player)) continue;
- let j = give.shift();
- list[0][1].remove(i);
- list[0][1].push(j);
- list[1][1].remove(j);
- list[1][1].push(i);
- if (!give.length) break;
- }
- }
- return [list[0][1], list[1][1]];
- });
- }
- "step 3";
- var moved = result.moved;
- var hs = player.getCards("h"),
- ts = target.getCards("h");
- var cards1 = [],
- cards2 = [];
- for (var i of result.moved[0]) {
- if (!ts.includes(i)) cards1.push(i);
- }
- for (var i of result.moved[1]) {
- if (!hs.includes(i)) cards2.push(i);
- }
- if (cards1.length) {
- player.swapHandcards(target, cards1, cards2);
- }
- },
- },
- //蓝曹华
- caiyi: {
- audio: 2,
- zhuanhuanji: true,
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- onremove: function (player) {
- delete player.storage.caiyi;
- delete player.storage.caiyi_info;
- },
- filter: function (event, player) {
- if (player.storage.caiyi_info) {
- if (player.storage.caiyi_info[player.storage.caiyi ? 1 : 0].length >= 4) return false;
- }
- return true;
- },
- choices: [
- ["回复X点体力", "摸X张牌", "复原武将牌", "随机执行一个已经移除过的选项"],
- ["受到X点伤害", "弃置X张牌", "翻面并横置", "随机执行一个已经移除过的选项"],
- ],
- filterx: [
- [player => player.isDamaged(), () => true, player => player.isTurnedOver() || player.isLinked(), () => true],
- [
- () => true,
- player =>
- player.hasCard(function (card) {
- return lib.filter.cardDiscardable(card, player, "caiyi");
- }, "he"),
- player => !player.isTurnedOver() || !player.isLinked(),
- () => true,
- ],
- ],
- content: function () {
- "step 0";
- if (!player.storage.caiyi_info) player.storage.caiyi_info = [[], []];
- var index = player.storage.caiyi ? 1 : 0;
- event.index = index;
- var list = player.storage.caiyi_info[index],
- choices = lib.skill.caiyi.choices[index],
- numbers = ["⒈", ";⒉", ";⒊", ";⒋"];
- event.num = 4 - list.length;
- var str = "令一名角色选择执行其中一项:";
- for (var i = 0; i < 4; i++) {
- if (list.includes(i)) continue;
- if (i == 3 && !list.length) continue;
- str += numbers.shift();
- str += choices[i];
- }
- str += "。";
- str = str.replace(/X/g, get.cnNumber(event.num));
- player.chooseTarget(get.prompt("caiyi") + "(当前状态:" + (index ? "阳" : "阴") + ")", str).set("ai", function (target) {
- var player = _status.event.player;
- return (player.storage.caiyi ? -1 : 1) * get.attitude(player, target);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("caiyi", target);
- player.changeZhuanhuanji("caiyi");
- event.goto(event.index == 1 ? 5 : 2);
- } else event.finish();
- "step 2";
- var list = [],
- str = get.cnNumber(num);
- var choiceList = ["回复" + str + "点体力。", "摸" + str + "张牌。", "将武将牌翻至正面且重置。", "随机执行一个已经被移除的选项。"];
- var storage = player.storage.caiyi_info[event.index];
- for (var i = 0; i < 4; i++) {
- if (storage.includes(i)) {
- choiceList[i] = '' + choiceList[i] + "";
- } else if (!lib.skill.caiyi.filterx[event.index][i](target) || (i == 3 && !storage.length)) {
- choiceList[i] = '' + choiceList[i] + "";
- } else list.push("选项" + get.cnNumber(i + 1, true));
- }
- if (!list.length) {
- event.finish();
- return;
- }
- target
- .chooseControl(list)
- .set("choiceList", choiceList)
- .set("ai", function () {
- var evt = _status.event,
- player = evt.player;
- var list = evt.controls.slice(0);
- var gett = function (choice) {
- if (choice == "cancel2") return 0.1;
- var max = 0,
- func = {
- 选项一: function (current) {
- max = get.recoverEffect(current, player, player) * Math.min(evt.getParent().num, player.getDamagedHp());
- },
- 选项二: function (target) {
- max = get.effect(target, { name: "draw" }, player, player) * evt.getParent().num;
- },
- 选项三: function (target) {
- if (player.isTurnedOver()) max += 25;
- if (player.isLinked()) max += get.effect(player, { name: "tiesuo" }, player, player);
- },
- 选项四: function (target) {
- max = 3;
- },
- }[choice];
- func(player);
- return max;
- };
- return list.sort(function (a, b) {
- return gett(b) - gett(a);
- })[0];
- });
- "step 3";
- var index2 = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control);
- player.storage.caiyi_info[event.index].push(index2);
- if (index2 == 3) {
- var list = player.storage.caiyi_info[event.index].filter(function (i) {
- return i != 3 && lib.skill.caiyi.filterx[event.index][i](target);
- });
- if (!list.length) {
- event.finish();
- return;
- }
- index2 = list.randomGet();
- }
- switch (index2) {
- case 0:
- target.recover(num);
- break;
- case 1:
- target.draw(num);
- break;
- case 2:
- !target.isTurnedOver() || target.turnOver();
- break;
- }
- if (index2 != 2) event.finish();
- "step 4";
- !target.isLinked() || target.link();
- event.finish();
- "step 5";
- var list = [],
- str = get.cnNumber(num);
- var choiceList = ["受到" + str + "点伤害。", "弃置" + str + "张牌。", "将武将牌翻至背面并横置。", "随机执行一个已经被移除的选项。"];
- var storage = player.storage.caiyi_info[event.index];
- for (var i = 0; i < 4; i++) {
- if (storage.includes(i)) {
- choiceList[i] = '' + choiceList[i] + "";
- } else if (!lib.skill.caiyi.filterx[event.index][i](target) || (i == 3 && !storage.length)) {
- choiceList[i] = '' + choiceList[i] + "";
- } else list.push("选项" + get.cnNumber(i + 1, true));
- }
- if (!list.length) {
- event.finish();
- return;
- }
- target
- .chooseControl(list)
- .set("choiceList", choiceList)
- .set("ai", function () {
- var evt = _status.event,
- player = evt.player;
- var list = evt.controls.slice(0);
- var gett = function (choice) {
- if (choice == "cancel2") return 0.1;
- var max = 0,
- func = {
- 选项一: function (current) {
- max = get.effect(current, { name: "damage" }, player, player) * evt.getParent().num;
- },
- 选项二: function (target) {
- max = get.effect(target, { name: "guohe_copy2" }, player, player) * Math.min(player.countCards("he"), evt.getParent().num);
- },
- 选项三: function (target) {
- if (!player.isTurnedOver()) max -= 5;
- if (!player.isLinked()) max += get.effect(player, { name: "tiesuo" }, player, player);
- },
- 选项四: function (target) {
- max = -3;
- },
- }[choice];
- func(player);
- return max;
- };
- return list.sort(function (a, b) {
- return gett(b) - gett(a);
- })[0];
- });
- "step 6";
- var index2 = ["选项一", "选项二", "选项三", "选项四"].indexOf(result.control);
- player.storage.caiyi_info[event.index].push(index2);
- if (index2 == 3) {
- var list = player.storage.caiyi_info[event.index].filter(function (i) {
- return i != 3 && lib.skill.caiyi.filterx[event.index][i](target);
- });
- if (!list.length) {
- event.finish();
- return;
- }
- index2 = list.randomGet();
- }
- switch (index2) {
- case 0:
- target.damage(num);
- break;
- case 1:
- target.chooseToDiscard(num, true, "he");
- break;
- case 2:
- target.isTurnedOver() || target.turnOver();
- break;
- }
- if (index2 != 2) event.finish();
- "step 7";
- target.isLinked() || target.link();
- event.finish();
- },
- mark: true,
- marktext: "☯",
- intro: {
- content: function (storage) {
- if (storage) return "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。";
- return "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。";
- },
- },
- },
- guili: {
- audio: 2,
- trigger: { player: "phaseBegin" },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return player.phaseNumber == 1 && game.hasPlayer(current => current != player);
- },
- content: function () {
- "step 0";
- player.chooseTarget(lib.filter.notMe, true, "请选择【归离】的目标", lib.translate.guili_info).set("ai", function (target) {
- return -get.threaten(target);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- game.log(player, "选择了", target);
- player.storage.guili_insert = target;
- player.addSkill("guili_insert");
- game.delayx();
- }
- },
- onremove: true,
- subSkill: {
- insert: {
- mark: true,
- intro: {
- content: "players",
- },
- trigger: { global: "phaseAfter" },
- forced: true,
- charlotte: true,
- logTarget: "player",
- filter: function (event, player) {
- if (event.player != player.storage.guili_insert) return false;
- if (event.player.getHistory("sourceDamage").length > 0) return false;
- var history = event.player.actionHistory;
- if (history[history.length - 1].isRound) return true;
- for (var i = history.length - 2; i >= 0; i--) {
- if (history[i].isMe) return false;
- if (history[i].isRound) return true;
- }
- return false;
- },
- content: function () {
- player.insertPhase();
- },
- },
- },
- },
- //刘虞
- dcsuifu: {
- audio: 2,
- trigger: { global: "phaseJieshuBegin" },
- filter: function (event, player) {
- if (player == event.player || !event.player.countCards("h")) return false;
- var num = 0;
- game.countPlayer(function (current) {
- if (current == player || current.getSeatNum() == 1) {
- current.getHistory("damage", function (evt) {
- num += evt.num;
- });
- }
- });
- return num >= 2;
- },
- logTarget: "player",
- check: function (event, player) {
- return get.attitude(player, event.player) <= 0;
- },
- content: function () {
- "step 0";
- var target = trigger.player,
- cards = target.getCards("h");
- target.lose(cards, ui.cardPile, "insert");
- target.$throw(cards.length);
- game.updateRoundNumber();
- game.log(player, "将", target, "的", get.cnNumber(cards.length), "张手牌置于牌堆顶");
- "step 1";
- game.delayx();
- player.chooseUseTarget({ name: "wugu", isCard: true }, true);
- },
- },
- dcpijing: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- content: function () {
- "step 0";
- player.chooseTarget([1, game.countPlayer()], get.prompt("dcpijing"), "令任意名角色获得技能〖自牧〗").set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- });
- "step 1";
- if (result.bool) {
- var targets = result.targets;
- targets.add(player);
- targets.sortBySeat();
- player.logSkill("dcpijing", targets);
- game.countPlayer(function (current) {
- if (!targets.includes(current)) current.removeSkills("dczimu");
- else current.addSkills("dczimu");
- });
- game.delayx();
- }
- },
- derivation: "dczimu",
- },
- dczimu: {
- audio: 2,
- trigger: { player: "damageEnd" },
- forced: true,
- mark: true,
- logTarget: function (event, player) {
- return game
- .filterPlayer(function (current) {
- return current.hasSkill("dczimu", null, null, false);
- })
- .sortBySeat();
- },
- content: function () {
- "step 0";
- var list = game.filterPlayer(function (current) {
- return current.hasSkill("dczimu", null, null, false);
- });
- if (list.length > 0) {
- if (list.length == 1) list[0].draw();
- else {
- game.asyncDraw(list);
- event.delay = true;
- }
- }
- "step 1";
- player.removeSkills("dczimu");
- if (event.delay) game.delayx();
- },
- marktext: "牧",
- intro: {
- content: "锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。",
- },
- },
- //黄祖
- dcjinggong: {
- audio: 2,
- enable: "chooseToUse",
- locked: false,
- mod: {
- targetInRange: function (card) {
- if (card.storage && card.storage.dcjinggong) return true;
- },
- },
- viewAsFilter: function (player) {
- return player.hasCard(function (card) {
- return get.type(card) == "equip";
- }, "ehs");
- },
- position: "hes",
- filterCard: { type: "equip" },
- viewAs: {
- name: "sha",
- storage: { dcjinggong: true },
- },
- check: function (card) {
- return 6 - get.value(card);
- },
- ai: {
- respondSha: true,
- skillTagFilter: function (player) {
- return player.hasCard(function (card) {
- return get.type(card) == "equip";
- }, "ehs");
- },
- },
- group: "dcjinggong_base",
- subSkill: {
- base: {
- trigger: { player: "useCard1" },
- forced: true,
- popup: false,
- firstDo: true,
- filter: function (event, player) {
- return event.skill == "dcjinggong" && event.targets.length > 0;
- },
- content: function () {
- trigger.baseDamage = Math.min(5, get.distance(player, trigger.targets[0]));
- },
- },
- },
- },
- dcxiaojuan: {
- audio: 2,
- trigger: { player: "useCardToPlayered" },
- logTarget: "target",
- filter: function (event, player) {
- return event.targets.length == 1 && player != event.target && event.target.countCards("h") > 1;
- },
- check: function (event, player) {
- var target = event.target;
- if (get.attitude(player, target) >= 0) return false;
- if (get.color(event.card) == "none") return true;
- return Math.floor(target.countCards("h") / 2) >= Math.floor(player.countCards("h") / 2);
- },
- content: function () {
- "step 0";
- var target = trigger.target;
- event.target = target;
- var num = Math.floor(target.countCards("h") / 2);
- if (num > 0) player.discardPlayerCard(target, "h", num, true);
- else event.finish();
- "step 1";
- var suit = get.suit(trigger.card);
- if (result.bool && lib.suit.includes(suit) && player.countCards("h") > 1) {
- var bool = false;
- for (var i of result.cards) {
- if (get.suit(i, target) == suit) {
- bool = true;
- break;
- }
- }
- if (!bool) event.finish();
- } else event.finish();
- "step 2";
- if (player.countCards("h") > 0) player.chooseToDiscard("h", 1, true);
- },
- },
- //来莺儿
- xiaowu: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- selectTarget: function () {
- return [1, game.countPlayer() - 1];
- },
- complexSelect: true,
- complexTarget: true,
- filterTarget: function (card, player, target) {
- if (player == target) return false;
- var next = player.getNext(),
- prev = player.getPrevious();
- var selected = ui.selected.targets;
- if (!selected.includes(next) && !selected.includes(prev)) return target == next || target == prev;
- for (var i of selected) {
- if (i.getNext() == target || i.getPrevious() == target) return true;
- }
- return false;
- },
- contentBefore: function () {
- event.getParent()._xiaowu_targets = [];
- },
- content: function () {
- "step 0";
- if (!target.isIn()) {
- event.finish();
- return;
- }
- target
- .chooseControl()
- .set("choiceList", ["令" + get.translation(player) + "摸一张牌", "令自己摸一张牌"])
- .set("ai", function () {
- var player = _status.event.player,
- target = _status.event.getParent().player;
- var all = _status.event.getParent().targets.length,
- dam = _status.event.getParent(2)._xiaowu_targets.length;
- if (get.attitude(player, target) > 0 || dam >= Math.floor(all / 2)) return 0;
- return 1;
- });
- "step 1";
- if (result.index == 0) {
- player.draw();
- } else {
- target.draw();
- event.getParent()._xiaowu_targets.push(target);
- }
- },
- contentAfter: function () {
- var targetsx = event.getParent()._xiaowu_targets;
- var num = targets.length - targetsx.length - targetsx.length;
- if (num > 0) player.addMark("shawu", 1);
- else if (num < 0) {
- player.line(targetsx, "fire");
- for (var i of targetsx) i.damage();
- }
- },
- ai: {
- order: 8,
- result: { player: 1 },
- },
- },
- huaping: {
- audio: 2,
- trigger: { global: "die" },
- limited: true,
- skillAnimation: true,
- animationColor: "fire",
- filter: function (event, player) {
- return player != event.player;
- },
- logTarget: "player",
- check: function (event, player) {
- return get.rank(event.player.name, true) >= 5;
- },
- content: function () {
- player.awakenSkill("huaping");
- var skills = trigger.player.getSkills(null, false, false).filter(function (i) {
- var info = get.info(i);
- return info && !info.charlotte;
- });
- if (skills.length) {
- //for(var i of skills) player.addSkillLog(i);
- player.addSkills(skills);
- }
- player.removeSkills("xiaowu");
- var num = player.countMark("shawu");
- if (num > 0) {
- player.removeMark("shawu", num);
- player.draw(num);
- }
- },
- group: "huaping_give",
- subSkill: {
- give: {
- audio: "huaping",
- trigger: { player: "die" },
- direct: true,
- filter: function (event, player) {
- return event.player == player;
- },
- forceDie: true,
- skillAnimation: true,
- animationColor: "gray",
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt("huaping"), "令一名其他角色获得〖沙舞〗", lib.filter.notMe)
- .set("forceDie", true)
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target) + 100;
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.awakenSkill("huaping");
- player.logSkill("huaping_give", target);
- target.addSkills("shawu");
- var num = player.countMark("shawu");
- if (num > 0) {
- player.removeMark("shawu", num);
- target.addMark("shawu", num);
- }
- }
- },
- },
- },
- derivation: "shawu",
- },
- shawu: {
- audio: 2,
- trigger: { player: "useCardToTargeted" },
- shaRelated: true,
- direct: true,
- filter: function (event, player) {
- return (
- event.card.name == "sha" &&
- event.player.isIn() &&
- (player.hasMark("shawu") ||
- player.countCards("h", function (card) {
- return lib.filter.cardDiscardable(card, player, "shawu");
- }) > 1)
- );
- },
- content: function () {
- "step 0";
- var list = [];
- if (
- player.countCards("h", function (card) {
- return lib.filter.cardDiscardable(card, player, "shawu");
- }) > 1
- )
- list.push("弃置手牌");
- if (player.hasMark("shawu")) list.push("移除标记");
- list.push("cancel2");
- player
- .chooseControl(list)
- .set("prompt", get.prompt("shawu", trigger.target))
- .set("prompt2", "弃置两张手牌,或移去一枚“沙”并摸两张牌,然后对该角色造成1点伤害")
- .set("ai", function () {
- var player = _status.event.player,
- target = _status.event.getTrigger().target;
- if (get.damageEffect(target, player, player) <= 0) return "cancel2";
- if (player.hasMark("shawu")) return "移除标记";
- if (
- player.countCards("h", function (card) {
- return lib.filter.cardDiscardable(card, player, "shawu") && get.value(card) <= 6.5;
- }) > 1
- )
- return "弃置手牌";
- return "cancel2";
- });
- "step 1";
- var target = trigger.target;
- if (result.control == "cancel2") {
- event.finish();
- return;
- } else if (result.control == "移除标记") {
- player.logSkill("shawu", target);
- player.removeMark("shawu", 1);
- player.draw(2);
- target.damage();
- event.finish();
- } else {
- player.chooseToDiscard("h", true, 2).logSkill = ["shawu", target];
- }
- "step 2";
- trigger.target.damage();
- },
- intro: {
- content: "mark",
- },
- },
- //曹髦
- qianlong: {
- audio: 2,
- trigger: { player: "damageEnd" },
- frequent: true,
- content: function () {
- "step 0";
- var cards = get.cards(3);
- event.cards = cards;
- game.cardsGotoOrdering(cards);
- //展示牌
- game.log(player, "展示了", event.cards);
- event.videoId = lib.status.videoId++;
- game.broadcastAll(
- function (player, id, cards) {
- if (player == game.me || player.isUnderControl()) return;
- var str = get.translation(player) + "发动了【潜龙】";
- var dialog = ui.create.dialog(str, cards);
- dialog.videoId = id;
- },
- player,
- event.videoId,
- event.cards
- );
- game.addVideo("showCards", player, [get.translation(player) + "发动了【潜龙】", get.cardsInfo(event.cards)]);
- if (player != game.me && !player.isUnderControl() && !player.isOnline()) game.delay(2);
- //选牌
- var next = player.chooseToMove("潜龙:获得至多" + get.cnNumber(Math.min(3, player.getDamagedHp())) + "张牌并将其余牌置于牌堆底");
- next.set("list", [["置于牌堆底", cards], ["自己获得"]]);
- next.set("filterMove", function (from, to, moved) {
- if (moved[0].includes(from.link)) {
- if (typeof to == "number") {
- if (to == 1) {
- if (moved[1].length >= _status.event.player.getDamagedHp()) return false;
- }
- return true;
- }
- }
- return true;
- });
- next.set("processAI", function (list) {
- let cards = list[0][1].slice(0),
- player = _status.event.player;
- cards.sort((a, b) => {
- return get.value(b, player) - get.value(a, player);
- });
- if (!player.storage.juetao && player.hasSkill("juetao") && player.hasSha()) {
- let gain,
- bottom,
- pai = cards.filter(card => card.name !== "sha");
- pai.sort((a, b) => {
- return get.value(b, player) - get.value(a, player);
- });
- gain = pai.splice(0, player.getDamagedHp());
- bottom = cards.slice(0);
- bottom.removeArray(gain);
- return [bottom, gain];
- }
- return [cards, cards.splice(0, player.getDamagedHp())];
- });
- "step 1";
- game.broadcastAll("closeDialog", event.videoId);
- game.addVideo("cardDialog", null, event.videoId);
- var moved = result.moved;
- if (moved[0].length > 0) {
- for (var i of moved[0]) {
- i.fix();
- ui.cardPile.appendChild(i);
- }
- }
- if (moved[1].length > 0) player.gain(moved[1], "gain2");
- },
- ai: {
- maixie: true,
- maixie_hp: true,
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "damage")) {
- if (player.hasSkillTag("jueqing", false, target)) return;
- if (!target.hasFriend()) return;
- var num = 1;
- if (!player.needsToDiscard() && target.isDamaged()) {
- num = 0.7;
- } else {
- num = 0.5;
- }
- if (target.hp >= 4) return [1, num * 2];
- if (target.hp == 3) return [1, num * 1.5];
- if (target.hp == 2) return [1, num * 0.5];
- }
- },
- },
- },
- },
- fensi: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- content: function () {
- "step 0";
- if (
- !game.hasPlayer(function (current) {
- return current != player && current.hp >= player.hp;
- })
- ) {
- player.damage();
- event.finish();
- return;
- } else {
- player
- .chooseTarget(true, "忿肆:对一名体力值不小于你的角色造成1点伤害", function (card, player, target) {
- return target.hp >= player.hp;
- })
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- }
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.line(target, "green");
- target.damage();
- } else event.finish();
- "step 2";
- if (target.isIn() && target.canUse("sha", player, false)) target.useCard({ name: "sha", isCard: true }, player, false, "noai");
- },
- },
- juetao: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- limited: true,
- skillAnimation: true,
- animationColor: "thunder",
- filter: function (event, player) {
- return player.hp == 1;
- },
- content: function () {
- "step 0";
- player.chooseTarget(get.prompt2("juetao"), lib.filter.notMe).set("ai", function (target) {
- let att = -get.attitude(_status.event.player, target);
- if (att <= 0) return att;
- if (target.hasSkillTag("nodamage") || target.getEquip("qimenbagua")) return 0.01 * att;
- if (target.getEquip("tengjia") || target.getEquip("renwang")) return 0.3 * att;
- if (target.getEquip("rewrite_tengjia") || target.getEquip("rewrite_renwang")) return 0.2 * att;
- if (
- target.hasSkillTag(
- "freeShan",
- false,
- {
- player: _status.event.player,
- },
- true
- )
- )
- return 0.3 * att;
- if (target.getEquip(2)) return att / 2;
- return 1.2 * att;
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("juetao", target);
- player.awakenSkill("juetao");
- } else event.finish();
- "step 2";
- var card = get.bottomCards()[0];
- game.cardsGotoOrdering(card);
- player.showCards(card);
- player
- .chooseUseTarget(card, true, false, "nodistance")
- .set("filterTarget", function (card, player, target) {
- var evt = _status.event;
- if (_status.event.name == "chooseTarget") evt = evt.getParent();
- if (target != player && target != evt.juetao_target) return false;
- return lib.filter.targetEnabledx(card, player, target);
- })
- .set("juetao_target", target);
- "step 3";
- if (result.bool && target.isIn()) event.goto(2);
- },
- },
- zhushi: {
- audio: 2,
- usable: 1,
- trigger: { global: "recoverEnd" },
- direct: true,
- zhuSkill: true,
- filter: function (event, player) {
- return player != event.player && event.player.group == "wei" && event.player == _status.currentPhase && event.player.isIn() && player.hasZhuSkill("zhushi", event.player);
- },
- content: function () {
- "step 0";
- var str = get.translation(player);
- trigger.player
- .chooseBool("是否响应" + get.translation(player) + "的主公技【助势】?", "令" + get.translation(player) + "摸一张牌")
- .set("goon", get.attitude(trigger.player, player) > 0)
- .set("ai", () => _status.event.goon);
- "step 1";
- if (result.bool) {
- player.logSkill("zhushi");
- trigger.player.line(player, "thunder");
- player.draw();
- } else player.storage.counttrigger.zhushi--;
- },
- },
- //骆统
- renzheng: {
- audio: 2,
- trigger: { global: ["damageCancelled", "damageZero", "damageAfter"] },
- forced: true,
- filter: function (event, player, name) {
- if (name == "damageCancelled") return true;
- for (var i of event.change_history) {
- if (i < 0) return true;
- }
- return false;
- },
- content: function () {
- player.draw(2);
- },
- },
- jinjian: {
- audio: 2,
- trigger: { source: "damageBegin1" },
- logTarget: "player",
- filter: function (event, player) {
- return !event.jinjian_source2 && !player.hasSkill("jinjian_source2");
- },
- prompt2: "令即将对其造成的伤害+1",
- check: function (event, player) {
- return (
- get.attitude(player, event.player) < 0 &&
- !event.player.hasSkillTag("filterDamage", null, {
- player: player,
- card: event.card,
- })
- );
- },
- content: function () {
- trigger.jinjian_source = true;
- trigger.num++;
- player.addTempSkill("jinjian_source2");
- },
- group: "jinjian_player",
- subSkill: {
- player: {
- audio: "jinjian",
- trigger: { player: "damageBegin4" },
- filter: function (event, player) {
- return !event.jinjian_player2 && !player.hasSkill("jinjian_player2");
- },
- prompt2: "令即将受到的伤害-1",
- content: function () {
- trigger.jinjian_player = true;
- trigger.num--;
- player.addTempSkill("jinjian_player2");
- },
- },
- source2: {
- trigger: { source: "damageBegin1" },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- return !event.jinjian_source;
- },
- content: function () {
- trigger.num--;
- trigger.jinjian_source2 = true;
- player.removeSkill("jinjian_source2");
- },
- marktext: " -1 ",
- intro: {
- content: "下次造成的伤害-1",
- },
- },
- player2: {
- trigger: { player: "damageBegin3" },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- return !event.jinjian_player;
- },
- content: function () {
- trigger.num++;
- trigger.jinjian_player2 = true;
- player.removeSkill("jinjian_player2");
- },
- marktext: " +1 ",
- intro: {
- content: "下次受到的伤害+1",
- },
- },
- },
- ai: {
- maixie_defend: true,
- threaten: 0.9,
- effect: {
- target: function (card, player, target) {
- if (player.hasSkillTag("jueqing")) return;
- //if(target.hujia) return;
- if (player._jinjian_tmp) return;
- if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return;
- if (get.tag(card, "damage")) {
- if (target.hasSkill("jinjian_player2")) {
- return [1, -2];
- } else {
- if (get.attitude(player, target) > 0) {
- return [0, 0.2];
- }
- if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) {
- var sha = player.getCardUsable({ name: "sha" });
- player._jinjian_tmp = true;
- var num = player.countCards("h", function (card) {
- if (card.name == "sha") {
- if (sha == 0) {
- return false;
- } else {
- sha--;
- }
- }
- return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0;
- });
- delete player._jinjian_tmp;
- if (player.hasSkillTag("damage")) {
- num++;
- }
- if (num < 2) {
- return [0, 0.8];
- }
- }
- }
- }
- },
- },
- },
- },
- //冯妤
- tiqi: {
- audio: 2,
- trigger: { global: ["phaseDrawEnd", "phaseDrawSkipped", "phaseDrawCancelled"] },
- filter: function (event, player) {
- if (player == event.player) return false;
- var num = 0;
- event.player.getHistory("gain", function (evt) {
- if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == event) num += evt.cards.length;
- });
- return num != 2;
- },
- frequent: true,
- logTarget: "player",
- content: function () {
- "step 0";
- var num = 0;
- trigger.player.getHistory("gain", function (evt) {
- if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == trigger) num += evt.cards.length;
- });
- num = Math.abs(num - 2);
- event.num = num;
- player.draw(num);
- "step 1";
- if (trigger.player.isIn()) {
- player
- .chooseControl(" +" + num + " ", " -" + num + " ", "cancel2")
- .set("prompt", "是否改变" + get.translation(trigger.player) + "本回合的手牌上限?")
- .set("ai", function () {
- var sgn = get.sgn(get.attitude(_status.event.player, _status.event.getTrigger().player));
- if (sgn == 0) return 2;
- if (sgn == 1) return 0;
- return 1;
- });
- } else event.finish();
- "step 2";
- if (result.index < 2) {
- var target = trigger.player;
- player.line(target);
- if (!target.storage.tiqi_effect) target.storage.tiqi_effect = 0;
- target.storage.tiqi_effect += num * get.sgn(0.5 - result.index);
- target.addTempSkill("tiqi_effect");
- target.markSkill("tiqi_effect");
- }
- },
- subSkill: {
- effect: {
- mod: {
- maxHandcard: function (player, num) {
- if (typeof player.storage.tiqi_effect == "number") return num + player.storage.tiqi_effect;
- },
- },
- charlotte: true,
- onremove: true,
- mark: true,
- intro: {
- content: num => "手牌上限" + (num < 0 ? "" : "+") + num,
- },
- },
- },
- },
- baoshu: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- direct: true,
- filter: function (event, player) {
- return player.maxHp > 0;
- },
- content: function () {
- "step 0";
- player.chooseTarget([1, player.maxHp], get.prompt("baoshu"), "令至多" + get.cnNumber(player.maxHp) + "名角色重置武将牌并获得“梳”").set("ai", function (target) {
- var att = get.attitude(player, target);
- if (att <= 0) return 0;
- //if(target.isTurnedOver()) return 3*att;
- if (target.isLinked() && get.effect(target, { name: "tiesuo" }, player, player) > 0) return 1.6 * att;
- if (ui.selected.targets.length >= Math.sqrt(1 + player.maxHp)) return 0;
- if (target != player) return 1.3 * att;
- return att;
- });
- "step 1";
- if (result.bool) {
- var targets = result.targets;
- targets.sortBySeat();
- player.logSkill("baoshu", targets);
- event.targets = targets;
- event.num = 0;
- event.num2 = 1 + player.maxHp - targets.length;
- } else event.finish();
- "step 2";
- var target = targets[num];
- event.target = target;
- if (!target.isIn()) {
- if (num < targets.length - 1) {
- event.num++;
- event.goto(2);
- } else event.finish();
- } else if (target.isLinked()) target.link();
- "step 3";
- if (target.isIn()) target.addMark("baoshu", event.num2);
- if (num < targets.length - 1) {
- event.num++;
- event.goto(2);
- } else event.finish();
- },
- marktext: "梳",
- intro: {
- name2: "梳",
- content: "mark",
- },
- group: "baoshu_draw",
- subSkill: {
- draw: {
- trigger: { global: "phaseDrawBegin2" },
- forced: true,
- popup: false,
- filter: function (event, player) {
- return !event.numFixed && event.player.hasMark("baoshu");
- },
- content: function () {
- var target = trigger.player,
- num = target.countMark("baoshu");
- trigger.player.logSkill("baoshu_draw");
- trigger.num += num;
- trigger.player.removeMark("baoshu", num);
- },
- },
- },
- },
- //吴范
- tianyun: {
- audio: 2,
- trigger: { global: "phaseBegin" },
- frequent: true,
- filter: function (event, player) {
- return event.player.getSeatNum() == game.roundNumber && player.countCards("h") > 0;
- },
- content: function () {
- "step 0";
- var suits = [],
- hs = player.getCards("h");
- for (var i of hs) {
- suits.add(get.suit(i, player));
- }
- var num = suits.length;
- event.num = num;
- 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];
- return [[], cards];
- };
- "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();
- if (top.length) {
- game.delayx();
- event.finish();
- }
- "step 2";
- player
- .chooseTarget("是否令一名角色摸" + get.cnNumber(num) + "张牌,然后失去1点体力?")
- .set("", function (target) {
- if (!_status.event.goon || target.hasSkillTag("nogain")) return 0;
- return get.attitude(_status.event.player, target) * Math.sqrt(Math.max(1, 5 - target.getCards("h")));
- })
- .set("goon", num > 1 && player.hp > 5 - num);
- "step 3";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.draw(num);
- player.loseHp();
- } else game.delayx();
- },
- group: "tianyun_gain",
- subSkill: {
- gain: {
- audio: "tianyun",
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- forced: true,
- locked: false,
- filter: function (event, player) {
- if (event.name == "phase" && game.phaseNumber != 0) return false;
- var suits = lib.suit.slice(0),
- hs = player.getCards("h");
- for (var i of hs) {
- suits.remove(get.suit(i, player));
- if (!suits.length) return false;
- }
- return true;
- },
- content: function () {
- var suits = lib.suit.slice(0),
- hs = player.getCards("h");
- for (var i of hs) {
- suits.remove(get.suit(i, player));
- }
- var cards = [];
- for (var i of suits) {
- var card = get.cardPile(function (card) {
- return get.suit(card, false) == i;
- });
- if (card) cards.push(card);
- }
- if (cards.length) player.gain(cards, "gain2");
- },
- },
- },
- },
- wfyuyan: {
- audio: 2,
- derivation: "refenyin",
- trigger: { global: "roundStart" },
- forced: true,
- locked: false,
- content: function () {
- "step 0";
- var next = player
- .chooseTarget("请选择【预言】的目标", true)
- .set("animate", false)
- .set("ai", function () {
- return Math.random();
- });
- "step 1";
- if (result.bool) {
- player.storage.wfyuyan = result.targets[0];
- player.addSkill("wfyuyan_dying");
- player.addSkill("wfyuyan_damage");
- }
- },
- subSkill: {
- dying: {
- trigger: { global: "dying" },
- forced: true,
- charlotte: true,
- popup: false,
- content: function () {
- if (trigger.player == player.storage.wfyuyan) {
- player.logSkill("wfyuyan", trigger.player);
- player.addTempSkill("iwasawa_refenyin", { player: "phaseEnd" });
- }
- player.removeSkill("wfyuyan_dying");
- },
- },
- damage: {
- trigger: { global: "damageSource" },
- forced: true,
- popup: false,
- charlotte: true,
- filter: function (event, player) {
- return event.source && event.source.isIn();
- },
- content: function () {
- if (trigger.source == player.storage.wfyuyan) {
- player.logSkill("wfyuyan", trigger.source);
- player.draw(2);
- }
- player.removeSkill("wfyuyan_damage");
- },
- },
- },
- },
- //张宝
- xinzhoufu: {
- audio: "zhoufu",
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return player.countCards("he") > 0;
- },
- filterCard: true,
- filterTarget: function (card, player, target) {
- return target != player && !target.getExpansions("xinzhoufu2").length;
- },
- check: function (card) {
- return 6 - get.value(card);
- },
- position: "he",
- discard: false,
- lose: false,
- delay: false,
- content: function () {
- target.addToExpansion(cards, player, "give").gaintag.add("xinzhoufu2");
- target.addSkill("xinzhoufu_judge");
- },
- ai: {
- order: 9,
- result: {
- target: function (player, target) {
- if (player.inRange(target)) return -1.3;
- return -1;
- },
- },
- },
- subSkill: {
- judge: {
- audio: "zhoufu",
- trigger: { player: "judgeBefore" },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- return !event.directresult && player.getExpansions("xinzhoufu2").length;
- },
- content: function () {
- var cards = [player.getExpansions("xinzhoufu2")[0]];
- trigger.directresult = cards[0];
- },
- },
- },
- },
- xinzhoufu2: {
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- },
- xinyingbing: {
- audio: "yingbin",
- trigger: { player: "useCardToPlayered" },
- forced: true,
- logTarget: "target",
- filter: function (event, player) {
- return (
- event.target.getExpansions("xinzhoufu2").length > 0 &&
- !player.hasHistory("gain", function (evt) {
- var evtx = evt.getParent(2);
- return evtx && evtx.name == "xinyingbing" && evtx._trigger.target == event.target;
- })
- );
- },
- content: function () {
- player.draw(2);
- },
- ai: {
- effect: {
- player: function (card, player, target) {
- if (
- target &&
- target.getExpansions("xinzhoufu2").length > 0 &&
- !player.hasHistory("gain", function (evt) {
- var evtx = evt.getParent(2);
- return evtx && evtx.name == "xinyingbing" && evtx._trigger.target == target;
- })
- )
- return [1, 1];
- },
- },
- combo: "xinzhoufu",
- },
- },
- //孙翊
- syjiqiao: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- content: function () {
- var cards = get.cards(player.maxHp);
- cards.sort(function (a, b) {
- return get.color(b).length - get.color(a).length;
- });
- player.addToExpansion(cards, "gain2").gaintag.add("syjiqiao");
- player.addTempSkill("syjiqiao_gain", "phaseUseAfter");
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- subSkill: {
- gain: {
- audio: "syjiqiao",
- trigger: { player: "useCardAfter" },
- charlotte: true,
- forced: true,
- filter: function (event, player) {
- return player.hasCard(card => card.hasGaintag("syjiqiao"), "x");
- },
- content: function () {
- "step 0";
- var cards = player.getExpansions("syjiqiao");
- var dialog = ["激峭:选择获得一张牌"];
- var reds = [],
- blacks = [];
- for (var i of cards) (get.color(i) == "red" ? reds : blacks).push(i);
- if (reds.length > 0) {
- dialog.push('红色牌
');
- dialog.push(reds);
- }
- if (blacks.length > 0) {
- dialog.push('黑色牌
');
- dialog.push(blacks);
- }
- player.chooseButton(dialog, true).set("ai", function (button) {
- var player = _status.event.player;
- var color = get.color(button.link),
- cards = player.getExpansions("syjiqiao");
- var num1 = cards.filter(card => get.color(card) == color).length,
- num2 = cards.length - num1;
- if (num1 >= num2) return get.value(button.link);
- return 0;
- });
- "step 1";
- if (result.bool) {
- player.gain(result.links, "gain2");
- } else event.finish();
- "step 2";
- var map = { red: 0, black: 0 },
- cards = player.getExpansions("syjiqiao");
- for (var i of cards) {
- var color = get.color(i, false);
- if (map[color] != undefined) map[color]++;
- }
- if (map.red == map.black) player.recover();
- else player.loseHp();
- },
- onremove: function (player) {
- var cards = player.getExpansions("syjiqiao");
- if (cards.length) player.loseToDiscardpile(cards);
- },
- },
- },
- },
- syxiongyi: {
- audio: 2,
- skillAnimation: true,
- animationColor: "wood",
- limited: true,
- enable: "chooseToUse",
- filter: function (event, player) {
- if (event.type != "dying") return false;
- if (player != event.dying) return false;
- return true;
- },
- async content(event, trigger, player) {
- "step 0";
- player.awakenSkill("syxiongyi");
- if (!_status.characterlist) {
- lib.skill.pingjian.initList();
- }
- if (_status.characterlist.includes("xushi")) {
- if (player.name2 && get.character(player.name2)[3].includes("syxiongyi")) {
- await player.reinitCharacter(player.name2, "xushi");
- } else {
- await player.reinitCharacter(player.name1, "xushi");
- }
- if (player.hp < 3) await player.recover(3 - player.hp);
- } else {
- await player.addSkills("olhunzi");
- if (player.hp < 1) await player.recover(1 - player.hp);
- }
- },
- ai: {
- order: 1,
- save: true,
- skillTagFilter: function (player, arg, target) {
- return player == target;
- },
- result: {
- player: 10,
- },
- },
- derivation: ["olhunzi", "reyingzi", "gzyinghun"],
- },
- gzyinghun_re_sunyi: { audio: 1 },
- reyingzi_re_sunyi: { audio: 1 },
- //曹金玉
- yuqi: {
- audio: 2,
- trigger: { global: "damageEnd" },
- init: function (player) {
- if (!player.storage.yuqi) player.storage.yuqi = [0, 3, 1, 1];
- },
- getInfo: function (player) {
- if (!player.storage.yuqi) player.storage.yuqi = [0, 3, 1, 1];
- return player.storage.yuqi;
- },
- onremove: true,
- usable: 2,
- filter: function (event, player) {
- var list = lib.skill.yuqi.getInfo(player);
- return event.player.isIn() && get.distance(player, event.player) <= list[0];
- },
- logTarget: "player",
- content: function () {
- "step 0";
- event.list = lib.skill.yuqi.getInfo(player);
- var cards = get.cards(event.list[1]);
- event.cards = cards;
- game.cardsGotoOrdering(cards);
- var next = player.chooseToMove(true, "隅泣(若对话框显示不完整,可下滑操作)");
- next.set("list", [["牌堆顶的牌", cards], ["交给" + get.translation(trigger.player) + "(至少一张" + (event.list[2] > 1 ? ",至多" + get.cnNumber(event.list[2]) + "张" : "") + ")"], ["交给自己(至多" + get.cnNumber(event.list[3]) + "张)"]]);
- next.set("filterMove", function (from, to, moved) {
- var info = lib.skill.yuqi.getInfo(_status.event.player);
- if (to == 1) return moved[1].length < info[2];
- if (to == 2) return moved[2].length < info[3];
- return true;
- });
- next.set("processAI", function (list) {
- var cards = list[0][1].slice(0).sort(function (a, b) {
- return get.value(b, "raw") - get.value(a, "raw");
- }),
- player = _status.event.player,
- target = _status.event.getTrigger().player;
- var info = lib.skill.yuqi.getInfo(_status.event.player);
- var cards1 = cards.splice(0, Math.min(info[3], cards.length - 1));
- var card2;
- if (get.attitude(player, target) > 0) card2 = cards.shift();
- else card2 = cards.pop();
- return [cards, [card2], cards1];
- });
- next.set("filterOk", function (moved) {
- return moved[1].length > 0;
- });
- "step 1";
- if (result.bool) {
- var moved = result.moved;
- cards.removeArray(moved[1]);
- cards.removeArray(moved[2]);
- while (cards.length) {
- ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild);
- }
- var list = [[trigger.player, moved[1]]];
- if (moved[2].length) list.push([player, moved[2]]);
- game.loseAsync({
- gain_list: list,
- giver: player,
- animate: "gain2",
- }).setContent("gaincardMultiple");
- }
- },
- mark: true,
- intro: {
- content: function (storage, player) {
- var info = lib.skill.yuqi.getInfo(player);
- return '蓝色:' + info[0] + " 红色:" + info[1] + "
绿色:" + info[2] + " 黄色:" + info[3] + "
";
- },
- },
- ai: {
- threaten: 8.8,
- },
- },
- shanshen: {
- audio: 2,
- trigger: { global: "die" },
- direct: true,
- content: function () {
- "step 0";
- event.goon = !player.hasAllHistory("sourceDamage", function (evt) {
- return evt.player == trigger.player;
- });
- var list = lib.skill.yuqi.getInfo(player);
- player
- .chooseControl("蓝色(" + list[0] + ")", "红色(" + list[1] + ")", "绿色(" + list[2] + ")", "黄色(" + list[3] + ")", "cancel2")
- .set("prompt", get.prompt("shanshen"))
- .set("prompt2", "令〖隅泣〗中的一个数字+2" + (event.goon ? "并回复1点体力" : ""))
- .set("ai", function () {
- var player = _status.event.player,
- info = lib.skill.yuqi.getInfo(player);
- if (
- info[0] < info[3] &&
- game.countPlayer(function (current) {
- return get.distance(player, current) <= info[0];
- }) < Math.min(3, game.countPlayer())
- )
- return 0;
- if (info[3] < info[1] - 1) return 3;
- if (info[1] < 5) return 1;
- if (
- info[0] < 5 &&
- game.hasPlayer(function (current) {
- return current != player && get.distance(player, current) > info[0];
- })
- )
- return 0;
- return 2;
- });
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("shanshen", trigger.player);
- var list = lib.skill.yuqi.getInfo(player);
- list[result.index] = Math.min(5, list[result.index] + 2);
- game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]);
- player.markSkill("yuqi");
- if (event.goon) player.recover();
- }
- },
- ai: {
- combo: "yuqi",
- },
- },
- xianjing: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- direct: true,
- content: function () {
- "step 0";
- var list = lib.skill.yuqi.getInfo(player);
- player
- .chooseControl("蓝色(" + list[0] + ")", "红色(" + list[1] + ")", "绿色(" + list[2] + ")", "黄色(" + list[3] + ")", "cancel2")
- .set("prompt", get.prompt("xianjing"))
- .set("prompt2", "令〖隅泣〗中的一个数字+1")
- .set("ai", function () {
- var player = _status.event.player,
- info = lib.skill.yuqi.getInfo(player);
- if (
- info[0] < info[3] &&
- game.countPlayer(function (current) {
- return get.distance(player, current) <= info[0];
- }) < Math.min(3, game.countPlayer())
- )
- return 0;
- if (info[3] < info[1] - 1) return 3;
- if (info[1] < 5) return 1;
- if (
- info[0] < 5 &&
- game.hasPlayer(function (current) {
- return current != player && get.distance(player, current) > info[0];
- })
- )
- return 0;
- return 2;
- });
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("xianjing");
- var list = lib.skill.yuqi.getInfo(player);
- list[result.index] = Math.min(5, list[result.index] + 1);
- game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]);
- player.markSkill("yuqi");
- if (player.isDamaged()) event.finish();
- } else event.finish();
- "step 2";
- var list = lib.skill.yuqi.getInfo(player);
- player
- .chooseControl("蓝色(" + list[0] + ")", "红色(" + list[1] + ")", "绿色(" + list[2] + ")", "黄色(" + list[3] + ")", "cancel2")
- .set("prompt", "是否令〖隅泣〗中的一个数字+1?")
- .set("ai", function () {
- var player = _status.event.player,
- info = lib.skill.yuqi.getInfo(player);
- if (
- info[0] < info[3] &&
- game.countPlayer(function (current) {
- return get.distance(player, current) <= info[0];
- }) < Math.min(3, game.countPlayer())
- )
- return 0;
- if (info[3] < info[1] - 1) return 3;
- if (info[1] < 5) return 1;
- if (
- info[0] < 5 &&
- game.hasPlayer(function (current) {
- return current != player && get.distance(player, current) > info[0];
- })
- )
- return 0;
- return 2;
- });
- "step 3";
- if (result.control != "cancel2") {
- var list = lib.skill.yuqi.getInfo(player);
- list[result.index] = Math.min(5, list[result.index] + 1);
- game.log(player, "将", result.control, "数字改为", "#y" + list[result.index]);
- player.markSkill("yuqi");
- }
- },
- ai: {
- combo: "yuqi",
- },
- },
- //周夷
- zhukou: {
- audio: 2,
- trigger: { source: "damageSource" },
- filter: function (event, player) {
- if (!player.getHistory("useCard").length) return false;
- var evt = event.getParent("phaseUse");
- if (!evt || !evt.player) return false;
- return (
- player
- .getHistory("sourceDamage", function (evtx) {
- return evtx.getParent("phaseUse") == evt;
- })
- .indexOf(event) == 0
- );
- },
- frequent: true,
- content: function () {
- player.draw(player.getHistory("useCard").length);
- },
- group: "zhukou_all",
- subSkill: {
- all: {
- audio: "zhukou",
- trigger: { player: "phaseJieshuBegin" },
- filter: function (event, player) {
- return game.countPlayer(current => current != player) > 1 && !player.getHistory("sourceDamage").length;
- },
- direct: true,
- content: function () {
- "step 0";
- player.chooseTarget(get.prompt("zhukou"), "对两名其他角色各造成1点伤害", 2, lib.filter.notMe).set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- "step 1";
- if (result.bool) {
- var targets = result.targets.sortBySeat();
- player.logSkill("zhukou", targets);
- for (var i of targets) i.damage();
- }
- },
- },
- },
- },
- mengqing: {
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- filter: function (event, player) {
- return game.countPlayer(current => current.isDamaged()) > player.hp;
- },
- juexingji: true,
- skillAnimation: true,
- animationColor: "wood",
- content: function () {
- player.awakenSkill("mengqing");
- player.gainMaxHp(3);
- player.recover(3);
- //player.removeSkill('zhukou');
- //player.addSkill('yuyun');
- player.changeSkills(["yuyun"], ["zhukou"]);
- },
- derivation: "yuyun",
- },
- yuyun: {
- trigger: { player: "phaseUseBegin" },
- forced: true,
- filter: function (event, player) {
- return player.hp > 0 || player.maxHp > 1;
- },
- content: function () {
- "step 0";
- if (player.maxHp <= 1) event._result = { control: "失去体力", index: 0 };
- else if (player.hp < 1) event._result = { control: "减体力上限", index: 1 };
- else
- player
- .chooseControl("失去体力", "减体力上限")
- .set("prompt", "玉陨:失去1点体力或减1点体力上限")
- .set("ai", function () {
- var player = _status.event.player;
- if (player.hp < 2 || player.getDamagedHp() > 2) return 1;
- return 0;
- });
- "step 1";
- if (result.index == 1) player.loseMaxHp();
- else player.loseHp();
- "step 2";
- var list = ["选项一:摸两张牌", "选项二:对一名其他角色造成1点伤害,且本回合对其使用【杀】无距离和次数限制", "选项三:本回合手牌上限视为无限", "选项四:获得一名其他角色区域内的一张牌", "选项五:令一名其他角色将手牌数摸至体力上限(至多摸至五张)"];
- var next = player.chooseButton([
- "玉陨:请选择一" + (player.getDamagedHp() > 0 ? "至" + get.cnNumber(player.getDamagedHp() + 1) : "") + "项",
- [
- list.map((item, i) => {
- return [i, item];
- }),
- "textbutton",
- ],
- ]);
- next.set("dialog", event.videoId);
- next.set("forced", true);
- next.set("ai", function (button) {
- var player = _status.event.player;
- switch (button.link) {
- case 0:
- return 2;
- case 1:
- return (
- Math.max(
- 0.5,
- player.countCards("hs", function (card) {
- return get.name(card) == "sha" && player.hasValueTarget(card);
- }) - player.getCardUsable({ name: "sha" })
- ) +
- Math.max.apply(
- Math,
- game
- .filterPlayer(function (current) {
- return current != player;
- })
- .map(function (target) {
- return get.damageEffect(target, player, player);
- })
- )
- );
- case 2:
- return player.needsToDiscard() / 4;
- case 3:
- var num = 0;
- return (
- 0.8 *
- Math.max.apply(
- Math,
- game
- .filterPlayer(function (current) {
- return current != player && current.hasCard(card => lib.filter.canBeGained(card, current, player), "hej");
- })
- .map(function (target) {
- return get.effect(target, { name: "shunshou_copy" }, player, player);
- })
- )
- );
- case 4:
- var num = 0;
- game.countPlayer(function (current) {
- if (current != player && get.attitude(player, current) > 0) {
- var num2 = Math.min(5, current.maxHp) - current.countCards("h");
- if (num2 > num) num = num2;
- }
- });
- return num * 0.8;
- }
- });
- if (player.getDamagedHp() > 0) next.set("selectButton", [1, 1 + player.getDamagedHp()]);
- "step 3";
- result.links.sort();
- for (var i of result.links) game.log(player, "选择了", "#g【玉陨】", "的", "#y选项" + get.cnNumber(1 + i, true));
- event.links = result.links;
- if (result.links.includes(0)) player.draw(2);
- if (result.links.includes(2)) player.addTempSkill("yuyun_114514");
- "step 4";
- if (
- event.links.includes(1) &&
- game.hasPlayer(function (current) {
- return current != player;
- })
- )
- player.chooseTarget(lib.filter.notMe, true, "对一名其他角色造成1点伤害").set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- else if (event.links.includes(3)) event.goto(6);
- else if (event.links.includes(4)) event.goto(8);
- else event.finish();
- "step 5";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.damage();
- player.markAuto("yuyun_sha", [target]);
- player.addTempSkill("yuyun_sha");
- }
- if (event.links.includes(3)) event.goto(6);
- else if (event.links.includes(4)) event.goto(8);
- else event.finish();
- "step 6";
- if (
- event.links.includes(3) &&
- game.hasPlayer(function (current) {
- return current != player && current.hasCard(card => lib.filter.canBeGained(card, current, player), "hej");
- })
- ) {
- player
- .chooseTarget(true, "获得一名其他角色区域内的一张牌", function (card, player, current) {
- return current != player && current.hasCard(card => lib.filter.canBeGained(card, current, player), "hej");
- })
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, { name: "shunshou_copy" }, player, player);
- });
- } else if (event.links.includes(4)) event.goto(8);
- else event.finish();
- "step 7";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- player.gainPlayerCard(target, "hej", true);
- }
- if (!event.links.includes(4)) event.finish();
- "step 8";
- if (
- event.links.includes(4) &&
- game.hasPlayer(function (current) {
- return current != player && current.countCards("h") < Math.min(5, current.maxHp);
- })
- ) {
- player
- .chooseTarget(true, "令一名其他角色将手牌数摸至体力上限", function (card, player, current) {
- return current != player && current.countCards("h") < Math.min(5, current.maxHp);
- })
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- if (target.hasSkillTag("nogain")) att /= 6;
- if (att > 2) {
- return Math.min(5, target.maxHp) - target.countCards("h");
- }
- return att / 3;
- });
- } else event.finish();
- "step 9";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.drawTo(Math.min(5, target.maxHp));
- }
- },
- subSkill: {
- 114514: {
- mod: {
- maxHandcardFinal: function (player, num) {
- return 114514;
- },
- },
- charlotte: true,
- },
- sha: {
- mod: {
- cardUsableTarget: function (card, player, target) {
- if (card.name == "sha" && player.getStorage("yuyun_sha").includes(target)) return Infinity;
- },
- targetInRange: function (card, player, target) {
- if (card.name == "sha" && player.getStorage("yuyun_sha").includes(target)) return true;
- },
- },
- charlotte: true,
- onremove: true,
- },
- },
- },
- //潘淑
- zhiren: {
- audio: 2,
- trigger: { player: "useCard" },
- filter: function (event, player) {
- return (
- (player == _status.currentPhase || player.hasSkill("yaner_zhiren")) &&
- event.card.isCard &&
- player
- .getHistory("useCard", function (evt) {
- return evt.card.isCard;
- })
- .indexOf(event) == 0
- );
- },
- frequent: true,
- locked: false,
- content: function () {
- "step 0";
- event.num = get.translation(trigger.card.name).length;
- player.chooseToGuanxing(event.num);
- if (event.num < 2) event.finish();
- "step 1";
- if (
- !game.hasPlayer(function (current) {
- return current.countDiscardableCards(player, "e") > 0;
- })
- ) {
- event.goto(3);
- } else
- player
- .chooseTarget("织纴:是否弃置一名角色装备区内的一张牌?", function (card, player, target) {
- return target.countDiscardableCards(player, "e") > 0;
- })
- .set("ai", function (target) {
- var player = _status.event.player,
- att = get.attitude(player, target),
- es = target.getCards("e"),
- val = 0;
- for (var i of es) {
- var eff = -(get.value(i, target) - 0.1) * att;
- if (eff > val) val = eff;
- }
- return eff;
- });
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- player.addExpose(0.15);
- player.line(target, "green");
- player.discardPlayerCard(target, "e", true);
- } else event.goto(5);
- if (event.num < 3) event.finish();
- "step 3";
- if (
- !game.hasPlayer(function (current) {
- return current.countDiscardableCards(player, "j") > 0;
- })
- ) {
- if (event.num < 3) event.finish();
- else event.goto(5);
- } else
- player
- .chooseTarget("织纴:是否弃置一名角色判定区内的一张牌?", function (card, player, target) {
- return target.countDiscardableCards(player, "j") > 0;
- })
- .set("ai", function (target) {
- var player = _status.event.player,
- att = get.attitude(player, target),
- es = target.getCards("j"),
- val = 0;
- for (var i of es) {
- var eff = -get.effect(target, i, target, player);
- if (eff > val) val = eff;
- }
- return eff;
- });
- "step 4";
- if (result.bool) {
- var target = result.targets[0];
- player.addExpose(0.15);
- player.line(target, "green");
- player.discardPlayerCard(target, "j", true);
- }
- if (event.num < 3) event.finish();
- "step 5";
- player.recover();
- if (event.num < 4) event.finish();
- "step 6";
- player.draw(3);
- },
- mod: {
- aiOrder: function (player, card, num) {
- if (
- player == _status.currentPhase &&
- !player.getHistory("useCard", function (evt) {
- return evt.card.isCard;
- }).length
- )
- return num + Math.pow(get.translation(card.name).length, 2);
- },
- },
- },
- yaner: {
- audio: 2,
- trigger: {
- global: ["equipAfter", "addJudgeAfter", "loseAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- filter: function (event, player) {
- var current = _status.currentPhase;
- if (!current || current == player || !current.isIn() || !current.isPhaseUsing()) return false;
- var evt = event.getl(current);
- return evt && evt.hs && evt.hs.length && current.countCards("h") == 0;
- },
- usable: 1,
- logTarget: function () {
- return _status.currentPhase;
- },
- prompt2: "与该角色各摸两张牌",
- check: function (event, player) {
- return get.attitude(player, _status.currentPhase) > 0;
- },
- content: function () {
- "step 0";
- game.asyncDraw([_status.currentPhase, player], 2);
- "step 1";
- var e1 = player.getHistory("gain", function (evt) {
- return evt.getParent(2) == event;
- })[0];
- if (e1 && e1.cards && e1.cards.length == 2 && get.type(e1.cards[0]) == get.type(e1.cards[1])) {
- player.addTempSkill("yaner_zhiren", { player: "phaseBegin" });
- game.log(player, "修改了技能", "#g【织纴】");
- }
- var target = _status.currentPhase;
- if (target.isIn() && target.isDamaged()) {
- var e2 = target.getHistory("gain", function (evt) {
- return evt.getParent(2) == event;
- })[0];
- if (e2 && e2.cards && e2.cards.length == 2 && get.type(e2.cards[0]) == get.type(e2.cards[1])) target.recover();
- }
- "step 2";
- game.delayx();
- },
- subSkill: {
- zhiren: { charlotte: true },
- },
- ai: {
- expose: 0.5,
- },
- },
- //杨婉
- youyan: {
- audio: 2,
- // trigger:{
- // player:'loseAfter',
- // global:'loseAsyncAfter',
- // },
- trigger: {
- player: ["loseAfter", "equipAfter"],
- global: ["loseAsyncAfter", "cardsDiscardAfter"],
- },
- //usable:1,
- prompt2: function (event, player) {
- var cards2 = [];
- if (event.name == "cardsDiscard") {
- var evtx = event.getParent();
- if (evtx.name != "orderingDiscard") return false;
- var evtx2 = evtx.relatedEvent || evtx.getParent();
- if (evtx2.name == "useCard" || evtx2.name == "respond") return false;
- player.getHistory("lose", evtx3 => {
- var evtx4 = evtx3.relatedEvent || evtx3.getParent();
- if (evtx2 != evtx4) return false;
- if (!evtx3.cards2 || !evtx3.cards2.length) return false;
- cards2.addArray(evtx3.cards2.filterInD("d"));
- });
- } else if (event.name == "loseAsync") {
- player.hasHistory("lose", evt => {
- if (evt.getParent() != event || evt.position != ui.discardPile) return false;
- cards2.addArray(evt.cards2.filterInD("d"));
- });
- } else {
- cards2.addArray(event.getd(player).filterInD("d"));
- }
- return "获得与" + get.translation(cards2) + "花色" + (cards2.length > 1 ? "各" : "") + "不相同的牌各一张";
- },
- filter: function (event, player) {
- if (player != _status.currentPhase) return false;
- var cards2 = [];
- if (event.name == "cardsDiscard") {
- var evtx = event.getParent();
- if (evtx.name != "orderingDiscard") return false;
- var evtx2 = evtx.relatedEvent || evtx.getParent();
- if (evtx2.name == "useCard" || evtx2.name == "respond") return false;
- player.getHistory("lose", evtx3 => {
- var evtx4 = evtx3.relatedEvent || evtx3.getParent();
- if (evtx2 != evtx4) return false;
- if (!evtx3.cards2 || !evtx3.cards2.length) return false;
- cards2.addArray(evtx3.cards2.filterInD("d"));
- });
- } else if (event.name == "loseAsync") {
- player.hasHistory("lose", evt => {
- if (evt.getParent() != event || evt.position != ui.discardPile) return false;
- cards2.addArray(evt.cards2.filterInD("d"));
- });
- } else {
- cards2.addArray(event.getd(player).filterInD("d"));
- }
- if (!cards2.length) return false;
- var list = [];
- for (var i of cards2) {
- list.add(get.suit(i, player));
- if (list.length >= lib.suit.length) return false;
- }
- var evt = event.getParent("phaseUse");
- if (evt && evt.player == player && !evt.youyaned) return true;
- var evt = event.getParent("phaseDiscard");
- if (evt && evt.player == player && !evt.youyaned) return true;
- return false;
- },
- content: function () {
- var evt = trigger.getParent("phaseUse");
- if (evt && evt.player == player) evt.youyaned = true;
- else {
- var evt = trigger.getParent("phaseDiscard");
- if (evt) evt.youyaned = true;
- }
- var list = [],
- cards = [];
- var cards2 = [];
- if (trigger.name == "cardsDiscard") {
- var evtx = trigger.getParent();
- if (evtx.name != "orderingDiscard") return false;
- var evtx2 = evtx.relatedEvent || evtx.getParent();
- if (evtx2.name == "useCard" || evtx2.name == "respond") return false;
- player.getHistory("lose", evtx3 => {
- var evtx4 = evtx3.relatedEvent || evtx3.getParent();
- if (evtx2 != evtx4) return false;
- if (!evtx3.cards2 || !evtx3.cards2.length) return false;
- cards2.addArray(evtx3.cards2.filterInD("d"));
- });
- } else if (trigger.name == "loseAsync") {
- player.hasHistory("lose", evt => {
- if (evt.getParent() != trigger || evt.position != ui.discardPile) return false;
- cards2.addArray(evt.cards2.filterInD("d"));
- });
- } else {
- cards2.addArray(trigger.getd(player).filterInD("d"));
- }
- for (var i of cards2) {
- list.add(get.suit(i, player));
- }
- for (var i of lib.suit) {
- if (list.includes(i)) continue;
- var card = get.cardPile2(function (card) {
- return get.suit(card, false) == i;
- });
- if (card) cards.push(card);
- }
- if (cards.length) player.gain(cards, "gain2");
- },
- ai: {
- effect: {
- player_use: function (card, player, target) {
- if (
- typeof card == "object" &&
- player == _status.currentPhase &&
- //(!player.storage.counttrigger||!player.storage.counttrigger.youyan)&&
- player.needsToDiscard() == 1 &&
- card.cards &&
- card.cards.filter(function (i) {
- return get.position(i) == "h";
- }).length > 0 &&
- !get.tag(card, "draw") &&
- !get.tag(card, "gain") &&
- !get.tag(card, "discard")
- )
- return "zeroplayertarget";
- },
- },
- },
- },
- zhuihuan: {
- audio: 2,
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- filter: function (event, player) {
- return game.hasPlayer(function (current) {
- return !current.hasSkill("zhuihuan2_new");
- });
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt("zhuihuan"), "令一名角色获得“追还”效果", function (card, player, target) {
- return !target.hasSkill("zhuihuan2_new");
- })
- .set("ai", function (target) {
- var player = _status.event.player,
- att = get.attitude(player, target);
- if (target.hasSkill("maixie") || target.hasSkill("maixie_defend")) att /= 3;
- if (target != player) att /= Math.pow(game.players.length - get.distance(player, target, "absolute"), 0.7);
- return att;
- })
- .set("animate", false);
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("zhuihuan");
- target.addTempSkill("zhuihuan2_new", { player: "phaseZhunbei" });
- game.delayx();
- }
- },
- },
- zhuihuan2_new: {
- trigger: { player: "phaseZhunbeiBegin" },
- charlotte: true,
- forced: true,
- onremove: true,
- filter: function (event, player) {
- if (player.storage.zhuihuan2_new) {
- for (var source of player.storage.zhuihuan2_new) {
- if (!source.isIn()) continue;
- if (source.hp > player.hp) return true;
- return source.countCards("h") > 0;
- }
- }
- },
- logTarget: function (event, player) {
- return player.storage.zhuihuan2_new.filter(function (target) {
- return target.isIn();
- });
- },
- content: function () {
- "step 0";
- event.targets = player.storage.zhuihuan2_new;
- player.removeSkill("zhuihuan2_new");
- "step 1";
- var target = targets.shift();
- if (target.isIn()) {
- if (target.hp > player.hp) target.damage(2);
- else {
- var hs = target.getCards("h");
- if (hs.length) target.discard(hs.randomGets(2));
- }
- }
- if (targets.length) event.redo();
- },
- group: "zhuihuan2_new_count",
- subSkill: {
- count: {
- trigger: { player: "damage" },
- forced: true,
- silent: true,
- popup: false,
- charlotte: true,
- filter: function (event, player) {
- return get.itemtype(event.source) == "player";
- },
- content: function () {
- player.markAuto("zhuihuan2_new", [trigger.source]);
- },
- },
- },
- },
- zhuihuan2: {
- trigger: { player: "damageEnd" },
- forced: true,
- charlotte: true,
- logTarget: "source",
- filter: function (event, player) {
- var source = event.source;
- if (source.hp > player.hp) return true;
- return source.countCards("h") > 0;
- },
- content: function () {
- if (player.hp < trigger.source.hp) trigger.source.damage();
- else trigger.source.discard(trigger.source.getCards("h").randomGet());
- },
- mark: true,
- intro: {
- content: "当你受到伤害后,若伤害来源体力值大于你,则你对其造成1点伤害,否则其随机弃置一张手牌",
- },
- },
- //阮瑀
- xingzuo: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- frequent: true,
- content: function () {
- "step 0";
- player.addTempSkill("xingzuo2");
- var cards = get.bottomCards(3);
- event.cards2 = cards;
- game.cardsGotoOrdering(cards);
- var next = player.chooseToMove("兴作:将三张牌置于牌堆底");
- var list = [["牌堆底", cards]],
- hs = player.getCards("h");
- if (hs.length) {
- list.push(["手牌", hs]);
- next.set("filterMove", function (from, to) {
- return typeof to != "number";
- });
- }
- next.set("list", list);
- next.set("processAI", function (list) {
- var allcards = list[0][1].slice(0),
- cards = [];
- if (list.length > 1) {
- allcards = allcards.concat(list[1][1]);
- }
- var canchoose = allcards.slice(0);
- var player = _status.event.player;
- var getv = function (button) {
- if (
- button.name == "sha" &&
- allcards.filter(function (card) {
- return (
- card.name == "sha" &&
- !cards.filter(function () {
- return button == card;
- }).length
- );
- }).length > player.getCardUsable({ name: "sha" })
- )
- return 10;
- return -player.getUseValue(button, player);
- };
- while (cards.length < 3) {
- canchoose.sort(function (a, b) {
- return getv(b) - getv(a);
- });
- cards.push(canchoose.shift());
- }
- return [cards, canchoose];
- });
- "step 1";
- if (result.bool) {
- event.forceDie = true;
- var cards = result.moved[0];
- event.cards = cards;
- player.storage.xingzuo2 = cards;
- var hs = player.getCards("h");
- var lose = [],
- gain = event.cards2;
- for (var i of cards) {
- if (hs.includes(i)) lose.push(i);
- else gain.remove(i);
- }
- if (lose.length) player.lose(lose, ui.cardPile);
- if (gain.length) player.gain(gain, "draw");
- } else event.finish();
- "step 2";
- for (var i of cards) {
- if (!"hejsdx".includes(get.position(i, true))) {
- i.fix();
- ui.cardPile.appendChild(i);
- }
- }
- game.updateRoundNumber();
- },
- },
- xingzuo2: {
- trigger: { player: "phaseJieshuBegin" },
- direct: true,
- charlotte: true,
- onremove: true,
- filter: function (event, player) {
- return game.hasPlayer(function (target) {
- return target.countCards("h") > 0;
- });
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(function (card, player, target) {
- return target.countCards("h") > 0;
- }, "兴作:是否令一名角色将其手牌与牌堆底的三张牌替换?")
- .set("ai", function (target) {
- var player = _status.event.player,
- att = get.attitude(player, target),
- hs = target.getCards("h"),
- num = hs.length;
- var getv = function (list, target) {
- var num = 0;
- for (var i of list) num += get.value(i, target);
- return num;
- },
- val = getv(hs, target) - getv(player.storage.xingzuo2, target);
- if (num < 3) return att * Math.sqrt(Math.max(0, -val)) * 1.5;
- if (num == 3) return -att * Math.sqrt(Math.max(0, val));
- if (player.hp < (num > 4 ? 3 : 2)) return 0;
- return -att * Math.sqrt(Math.max(0, val));
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("xingzuo", target);
- var cards = get.bottomCards(3);
- game.cardsGotoOrdering(cards);
- var hs = target.getCards("h");
- target.lose(hs, ui.cardPile);
- target.gain(cards, "draw");
- if (hs.length > 3) player.loseHp();
- } else event.finish();
- "step 2";
- game.updateRoundNumber();
- },
- },
- miaoxian: {
- hiddenCard: function (player, name) {
- return get.type(name) == "trick" && !player.hasSkill("miaoxian2") && player.countCards("h", { color: "black" }) == 1;
- },
- enable: "chooseToUse",
- filter: function (event, player) {
- if (player.hasSkill("miaoxian2")) return false;
- var cards = player.getCards("h", { color: "black" });
- if (cards.length != 1) return false;
- var mod2 = game.checkMod(cards[0], player, "unchanged", "cardEnabled2", player);
- if (mod2 === false) return false;
- for (var i of lib.inpile) {
- if (
- get.type(i) == "trick" &&
- event.filterCard(
- {
- name: i,
- cards: cards,
- },
- player,
- event
- )
- )
- return true;
- }
- return false;
- },
- chooseButton: {
- dialog: function (event, player) {
- var cards = player.getCards("h", { color: "black" });
- var list = [];
- for (var i of lib.inpile) {
- if (
- get.type(i) == "trick" &&
- event.filterCard(
- {
- name: i,
- cards: cards,
- },
- player,
- event
- )
- ) {
- list.push(["锦囊", "", i]);
- }
- }
- return ui.create.dialog("妙弦", [list, "vcard"], "hidden");
- },
- check: function (button) {
- var player = _status.event.player;
- return player.getUseValue({ name: button.link[2] }) + 1;
- },
- backup: function (links, player) {
- return {
- audio: "miaoxian",
- popname: true,
- filterCard: { color: "black" },
- selectCard: -1,
- position: "h",
- viewAs: {
- name: links[0][2],
- },
- onuse: function (links, player) {
- player.addTempSkill("miaoxian2");
- },
- };
- },
- prompt: function (links, player) {
- return "将" + get.translation(player.getCards("h", { color: "black" })[0]) + "当做" + get.translation(links[0][2]) + "使用";
- },
- },
- group: "miaoxian_use",
- subfrequent: ["use"],
- subSkill: {
- use: {
- audio: "miaoxian",
- trigger: { player: "loseAfter" },
- frequent: true,
- prompt: "是否发动【妙弦】摸一张牌?",
- filter: function (event, player) {
- var evt = event.getParent();
- if (evt.name != "useCard") return false;
- return event.hs && event.hs.length == 1 && event.cards && event.cards.length == 1 && get.color(event.hs[0], player) == "red" && !player.countCards("h", { color: "red" });
- },
- content: function () {
- player.draw();
- },
- },
- backup: {
- audio: "miaoxian",
- },
- },
- ai: {
- order: 12,
- result: {
- player: 1,
- },
- },
- },
- miaoxian2: {
- charlotte: true,
- },
- //樊玉凤
- bazhan: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- zhuanhuanji: true,
- marktext: "☯",
- mark: true,
- intro: {
- content: function (storage, player) {
- return "出牌阶段限一次," + (storage ? "你可以获得一名其他角色的至多两张手牌。" : "你可以将至多两张手牌交给一名其他角色。") + "若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。";
- },
- },
- filter: function (event, player) {
- if (player.storage.bazhan) {
- return game.hasPlayer(function (current) {
- return current != player && current.countGainableCards(player, "h") > 0;
- });
- }
- return player.countCards("h") > 0;
- },
- filterCard: true,
- discard: false,
- lose: false,
- selectCard: function () {
- if (_status.event.player.storage.bazhan) return 0;
- return [1, 2];
- },
- filterTarget: function (card, player, target) {
- if (player == target) return false;
- if (player.storage.bazhan) return target.countGainableCards(player, "h") > 0;
- return true;
- },
- prompt: function () {
- if (_status.event.player.storage.bazhan) return "获得一名其他角色的至多两张手牌";
- return "将至多两张手牌交给一名其他角色";
- },
- delay: false,
- check: function (card) {
- var player = _status.event.player;
- var bool1 = false,
- bool2 = false;
- for (var i of game.players) {
- if (get.attitude(player, i) <= 0 || player == i) continue;
- bool1 = true;
- if (i.isDamaged() || i.isTurnedOver()) {
- bool2 = true;
- break;
- }
- }
- if (bool2 && !ui.selected.cards.length && (get.suit(card, player) == "heart" || get.name(card, player) == "jiu")) return 10;
- if (bool1) return 9 - get.value(card);
- if (get.color(card) == "red") return 5 - get.value(card);
- return 0;
- },
- content: function () {
- "step 0";
- if (player.storage.bazhan) {
- event.recover = player;
- player.gainPlayerCard(target, "h", true, "visibleMove", [1, 2]);
- } else {
- event.recover = target;
- player.give(cards, target);
- }
- player.changeZhuanhuanji("bazhan");
- "step 1";
- var target = event.recover;
- if (result.bool && result.cards && result.cards.length) {
- cards = result.cards;
- }
- if (
- !cards ||
- !target ||
- !target.getCards("h").filter(function (i) {
- return cards.includes(i);
- }).length ||
- (function () {
- for (var card of cards) {
- if (get.suit(card, target) == "heart" || get.name(card, target) == "jiu") return false;
- }
- return true;
- })()
- ) {
- event.finish();
- return;
- }
- var list = [];
- event.addIndex = 0;
- var str = get.translation(target);
- if (target.isDamaged()) list.push("令" + str + "回复1点体力");
- else event.addIndex++;
- if (target.isLinked() || target.isTurnedOver()) list.push("令" + get.translation(target) + "复原武将牌");
- if (!list.length) event.finish();
- else
- player
- .chooseControl("cancel2")
- .set("choiceList", list)
- .set("ai", function () {
- var evt = _status.event.getParent();
- if (get.attitude(evt.player, evt.target) < 0) return "cancel2";
- if (target.hp > 1 && target.isTurnedOver()) return 1 - evt.addIndex;
- return 0;
- });
- "step 2";
- if (result.control == "cancel2") event.finish();
- else if (result.index + event.addIndex == 0) {
- event.recover.recover();
- event.finish();
- } else if (event.recover.isLinked()) event.recover.link();
- "step 3";
- if (event.recover.isTurnedOver()) event.recover.turnOver();
- },
- ai: {
- order: 7,
- result: {
- target: function (player, target) {
- if (player.storage.bazhan) return -1;
- if (ui.selected.cards.length) {
- var cards = ui.selected.cards,
- card = cards[0];
- if (get.value(cards, target) < 0) return -0.5;
- if (get.attitude(player, target) > 0) {
- if ((target.isDamaged() || target.isTurnedOver()) && (get.suit(card, target) == "heart" || get.name(card, target) == "jiu")) return 3;
- if (target.hasUseTarget(card) && target.getUseValue(card) > player.getUseValue(card, null, true)) return 1.4;
- return 1;
- }
- }
- return 0;
- },
- },
- },
- },
- jiaoying: {
- audio: 2,
- trigger: { source: "gainEnd" },
- forced: true,
- filter: function (event, player) {
- if (player == event.player) return false;
- var evt = event.getl(player);
- return evt && evt.hs && evt.hs.length;
- },
- logTarget: "player",
- content: function () {
- var target = trigger.player;
- if (!target.storage.jiaoying2) target.storage.jiaoying2 = [];
- var cs = trigger.getl(player).hs;
- for (var i of cs) target.storage.jiaoying2.add(get.color(i, player));
- target.addTempSkill("jiaoying2");
- target.markSkill("jiaoying2");
- player.addTempSkill("jiaoying3");
- if (!player.storage.jiaoying3) player.storage.jiaoying3 = [];
- player.storage.jiaoying3.add(target);
- },
- ai: {
- directHit_ai: true,
- skillTagFilter: function (player, tag, arg) {
- var target = arg.target;
- if (target.getStorage("jiaoying2").includes("red") && get.tag(arg.card, "respondShan") && !target.hasSkillTag("respondShan", true, null, true)) return true;
- return false;
- },
- },
- },
- jiaoying2: {
- onremove: true,
- charlotte: true,
- mod: {
- cardEnabled2: function (card, player) {
- if (player.getStorage("jiaoying2").includes(get.color(card))) return false;
- },
- },
- intro: {
- content: "本回合内不能使用或打出$牌",
- },
- },
- jiaoying3: {
- onremove: true,
- trigger: { global: "useCard1" },
- silent: true,
- firstDo: true,
- charlotte: true,
- filter: function (event, player) {
- return player.storage.jiaoying3.includes(event.player);
- },
- content: function () {
- while (player.storage.jiaoying3.includes(trigger.player)) player.storage.jiaoying3.remove(trigger.player);
- if (!player.storage.jiaoying3.length) player.removeSkill("jiaoying3");
- },
- group: "jiaoying3_draw",
- },
- jiaoying3_draw: {
- trigger: { global: "phaseEnd" },
- direct: true,
- charlotte: true,
- filter: function (event, player) {
- return (
- player.getStorage("jiaoying3").length > 0 &&
- game.hasPlayer(function (current) {
- return current.countCards("h") < 5;
- })
- );
- },
- content: function () {
- "step 0";
- player.storage.jiaoying3.shift();
- player
- .chooseTarget("醮影:令一名角色将手牌摸至五张", function (card, player, target) {
- return target.countCards("h") < 5;
- })
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- if (att > 2) {
- return 5 - target.countCards("h");
- }
- return att / 3;
- });
- "step 1";
- if (result.bool) {
- player.logSkill("jiaoying", result.targets);
- for (var i = 0; i < result.targets.length; i++) {
- result.targets[i].drawTo(5);
- }
- if (lib.skill.jiaoying3_draw.filter(null, player)) event.goto(0);
- }
- },
- },
- //郭照
- pianchong: {
- audio: 2,
- trigger: { player: "phaseDrawBegin1" },
- filter: function (event, player) {
- return !event.numFixed;
- },
- content: function () {
- "step 0";
- trigger.changeToZero();
- var cards = [];
- var card1 = get.cardPile2(function (card) {
- return get.color(card, false) == "red";
- });
- if (card1) cards.push(card1);
- var card2 = get.cardPile2(function (card) {
- return get.color(card, false) == "black";
- });
- if (card2) cards.push(card2);
- if (cards.length) player.gain(cards, "gain2");
- "step 1";
- player
- .chooseControl("red", "black")
- .set("prompt", "偏宠:请选择一种颜色。直至你的下回合开始时,失去该颜色的一张牌后,从牌堆获得另一种颜色的一张牌。")
- .set("ai", function () {
- var red = 0,
- black = 0;
- var player = _status.event.player;
- var cards = player.getCards("he");
- for (var i of cards) {
- var add = 1;
- var color = get.color(i, player);
- if (get.position(i) == "e") add = 0.5;
- else if (get.name(i, player) != "sha" && player.hasValueTarget(i)) add = 1.5;
- if (color == "red") red += add;
- else black += add;
- }
- if (black > red) return "black";
- return "red";
- });
- "step 2";
- player.storage.pianchong2 = result.control;
- player.addTempSkill("pianchong2", { player: "phaseBeginStart" });
- player.popup(result.control, result.control == "red" ? "fire" : "thunder");
- game.log(player, "声明了", "#y" + get.translation(result.control));
- },
- ai: {
- threaten: 4.8,
- },
- },
- pianchong2: {
- audio: "pianchong",
- trigger: {
- player: "loseAfter",
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- forced: true,
- charlotte: true,
- onremove: true,
- filter: function (event, player) {
- var evt = event.getl(player);
- if (!evt || !evt.cards2 || !evt.cards2.length) return false;
- for (var i of evt.cards2) {
- if (get.color(i, player) == player.storage.pianchong2) return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- var num = trigger.getl(player).cards2.filter(function (card) {
- return get.color(card, player) == player.storage.pianchong2;
- }).length;
- var cards = [];
- while (num--) {
- var card = get.cardPile2(function (card) {
- return !cards.includes(card) && get.color(card, false) != player.storage.pianchong2;
- });
- if (card) cards.push(card);
- else break;
- }
- if (cards.length) player.gain(cards, "gain2");
- },
- mark: true,
- intro: {
- content: "失去一张$牌后,从牌堆中获得一张与此牌颜色不同的牌",
- },
- },
- zunwei: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- let storage = player.getStorage("zunwei");
- return (
- storage.length < 3 &&
- game.hasPlayer(current => {
- return (player.isDamaged() && current.getHp() > player.getHp() && !storage.includes(0)) || (current.countCards("h") > player.countCards("h") && !storage.includes(1)) || (current.countCards("e") > player.countCards("e") && !storage.includes(2));
- })
- );
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = ["选择体力值大于你的一名角色", "选择手牌数大于你的一名角色", "选择装备数大于你的一名角色"];
- var choiceList = ui.create.dialog("尊位:请选择一项", "forcebutton", "hidden");
- choiceList.add([
- list.map((item, i) => {
- if (player.getStorage("zunwei").includes(i)) item = `${item}`;
- return [i, item];
- }),
- "textbutton",
- ]);
- return choiceList;
- },
- filter: function (button) {
- const player = get.player();
- if (player.getStorage("zunwei").includes(button.link)) return false;
- if (button.link == 0) {
- if (!player.isDamaged()) return false;
- return game.hasPlayer(current => {
- return current.getHp() > player.getHp();
- });
- }
- if (button.link == 1) {
- return game.hasPlayer(current => {
- return current.countCards("h") > player.countCards("h");
- });
- }
- if (button.link == 2) {
- return game.hasPlayer(current => {
- return current.countCards("e") > player.countCards("e");
- });
- }
- },
- backup: function (links) {
- var next = get.copy(lib.skill.zunwei.backups[links[0]]);
- next.audio = "zunwei";
- next.filterCard = function () {
- return false;
- };
- next.selectCard = -1;
- return next;
- },
- check: function (button) {
- var player = _status.event.player;
- switch (button.link) {
- case 0: {
- var target = game.findPlayer(function (current) {
- return current.isMaxHp();
- });
- return (Math.min(target.hp, player.maxHp) - player.hp) * 2;
- }
- case 1: {
- var target = game.findPlayer(function (current) {
- return current.isMaxHandcard();
- });
- return Math.min(5, target.countCards("h") - player.countCards("h")) * 0.8;
- }
- case 2: {
- var target = game.findPlayer(function (current) {
- return current.isMaxEquip();
- });
- return (target.countCards("e") - player.countCards("e")) * 1.4;
- }
- }
- },
- prompt: function (links) {
- return ["选择一名体力值大于你的其他角色,将体力值回复至与其相同", "选择一名手牌数大于你的其他角色,将手牌数摸至与其相同", "选择一名装备区内牌数大于你的其他角色,依次使用牌堆中的装备牌,直到装备数与其相同"][links[0]];
- },
- },
- backups: [
- {
- filterTarget: function (card, player, target) {
- if (player.isHealthy()) return false;
- return target.hp > player.hp;
- },
- content: function () {
- player.recover(target.hp - player.hp);
- if (!player.storage.zunwei) player.storage.zunwei = [];
- player.storage.zunwei.add(0);
- },
- ai: {
- order: 10,
- result: {
- player: function (player, target) {
- return Math.min(target.hp, player.maxHp) - player.hp;
- },
- },
- },
- },
- {
- filterTarget: function (card, player, target) {
- return target.countCards("h") > player.countCards("h");
- },
- content: function () {
- player.draw(Math.min(5, target.countCards("h") - player.countCards("h")));
- if (!player.storage.zunwei) player.storage.zunwei = [];
- player.storage.zunwei.add(1);
- },
- ai: {
- order: 10,
- result: {
- player: function (player, target) {
- return Math.min(5, target.countCards("h") - player.countCards("h"));
- },
- },
- },
- },
- {
- filterTarget: function (card, player, target) {
- return target.countCards("e") > player.countCards("e");
- },
- content: function () {
- "step 0";
- if (!player.storage.zunwei) player.storage.zunwei = [];
- player.storage.zunwei.add(2);
- event.num = 1;
- "step 1";
- var type = "equip" + num;
- if (!player.hasEmptySlot(type)) return;
- var card = get.cardPile2(function (card) {
- return get.subtype(card, false) == type && player.canUse(card, player);
- });
- if (card) player.chooseUseTarget(card, true).nopopup = true;
- "step 2";
- event.num++;
- if (event.num <= 5 && target.isIn() && player.countCards("e") < target.countCards("e")) event.goto(1);
- },
- ai: {
- order: 10,
- result: {
- player: function (player, target) {
- return target.countCards("e") - player.countCards("e");
- },
- },
- },
- },
- ],
- ai: {
- order: 10,
- result: {
- player: 1,
- },
- },
- },
- //辛宪英
- rezhongjian: {
- enable: "phaseUse",
- audio: "zhongjian",
- usable: 2,
- filter: function (event, player) {
- if (player.getStat().skill.rezhongjian && !player.hasSkill("recaishi2")) return false;
- return game.hasPlayer(function (current) {
- return lib.skill.rezhongjian.filterTarget(null, player, current);
- });
- },
- filterTarget: function (card, player, target) {
- if (!player.storage.rezhongjian2) return true;
- return !player.storage.rezhongjian2[0].includes(target) && !player.storage.rezhongjian2[1].includes(target);
- },
- content: function () {
- "step 0";
- player
- .chooseControl()
- .set("prompt", "忠鉴:为" + get.translation(target) + "选择获得一项效果")
- .set("choiceList", ["令其于下回合开始前首次造成伤害后弃置两张牌", "令其于下回合开始前首次受到伤害后摸两张牌"])
- .set("ai", function () {
- return get.attitude(_status.event.player, _status.event.getParent().target) > 0 ? 1 : 0;
- });
- "step 1";
- player.addTempSkill("rezhongjian2", { player: "phaseBeginStart" });
- //var str=['造成伤害弃牌','受到伤害摸牌'][result.index];
- //player.popup(str,['fire','wood'][result.index]);
- //game.log(player,'选择了','#y'+str)
- player.storage.rezhongjian2[result.index].push(target);
- player.markSkill("rezhongjian2");
- },
- ai: {
- order: 10,
- expose: 0,
- result: {
- player: function (player, target) {
- if (get.attitude(player, target) == 0) return false;
- var sgn = get.sgn((get.realAttitude || get.attitude)(player, target));
- if (
- game.countPlayer(function (current) {
- return get.sgn((get.realAttitude || get.attitude)(player, current)) == sgn;
- }) <=
- game.countPlayer(function (current) {
- return get.sgn((get.realAttitude || get.attitude)(player, current)) != sgn;
- })
- )
- return 1;
- return 0.9;
- },
- },
- },
- },
- rezhongjian2: {
- trigger: {
- global: ["damageSource", "damageEnd"],
- },
- forced: true,
- filter: function (event, player, name) {
- var num = name == "damageSource" ? 0 : 1;
- var logTarget = name == "damageSource" ? event.source : event.player;
- return logTarget && logTarget.isIn() && player.storage.rezhongjian2[num].includes(logTarget);
- },
- logTarget: function (event, player, name) {
- return name == "damageSource" ? event.source : event.player;
- },
- content: function () {
- var num = event.triggername == "damageSource" ? 0 : 1;
- var target = event.triggername == "damageSource" ? trigger.source : trigger.player;
- var storage = player.storage.rezhongjian2;
- storage[num].remove(target);
- if (storage[0].length + storage[1].length) player.markSkill("rezhongjian2");
- else player.removeSkill("rezhongjian2");
- target[event.triggername == "damageSource" ? "chooseToDiscard" : "draw"](2, true, "he");
- player.draw();
- },
- init: function (player, skill) {
- if (!player.storage[skill]) player.storage[skill] = [[], []];
- },
- onremove: true,
- intro: {
- markcount: function (storage) {
- return storage[0].length + storage[1].length;
- },
- mark: function (dialog, storage, player) {
- if (player == game.me || player.isUnderControl()) {
- if (storage[0].length) {
- dialog.addText("弃牌");
- dialog.add([storage[0], "player"]);
- }
- if (storage[1].length) {
- dialog.addText("摸牌");
- dialog.add([storage[1], "player"]);
- }
- } else {
- var list = storage[0].concat(storage[1]).sortBySeat(player);
- dialog.add([list, "player"]);
- }
- },
- },
- },
- recaishi: {
- trigger: { player: "phaseDrawEnd" },
- direct: true,
- audio: "caishi",
- isSame: function (event) {
- var cards = [];
- event.player.getHistory("gain", function (evt) {
- if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == event) cards.addArray(evt.cards);
- });
- if (!cards.length) return "nogain";
- var list = [];
- for (var i = 0; i < cards.length; i++) {
- list.add(get.suit(cards[i]));
- }
- if (list.length == 1) return true;
- if (list.length == cards.length) return false;
- return "nogain";
- },
- filter: function (event, player) {
- var isSame = lib.skill.recaishi.isSame(event);
- if (isSame == "nogain") return false;
- return isSame || player.isDamaged();
- },
- content: function () {
- "step 0";
- if (lib.skill.recaishi.isSame(trigger)) {
- player.logSkill("recaishi");
- player.addTempSkill("recaishi2");
- event.finish();
- return;
- }
- player.chooseBool(get.prompt("recaishi"), "回复1点体力,然后本回合内不能对自己使用牌").set("ai", function () {
- if (player.countCards("h", "tao")) return false;
- if (player.hp < 2) return true;
- return (
- player.countCards("h", function (card) {
- var info = get.info(card);
- return info && (info.toself || info.selectTarget == -1) && player.canUse(card, player) && player.getUseValue(card) > 0;
- }) == 0
- );
- });
- "step 1";
- if (result.bool) {
- player.logSkill("recaishi");
- player.recover();
- player.addTempSkill("recaishi3");
- }
- },
- },
- recaishi2: {},
- recaishi3: {
- mod: {
- targetEnabled: function (card, player, target) {
- if (player == target) return false;
- },
- },
- mark: true,
- intro: { content: "本回合内不能对自己使用牌" },
- },
- //刘辩
- shiyuan: {
- audio: 2,
- trigger: { target: "useCardToTargeted" },
- frequent: true,
- filter: function (event, player) {
- var num = 1;
- if (_status.currentPhase && _status.currentPhase != player && _status.currentPhase.group == "qun" && player.hasZhuSkill("yuwei", _status.currentPhase)) num = 2;
- return (
- player != event.player &&
- player.getHistory("gain", function (evt) {
- return evt.getParent(2).name == "shiyuan" && evt.cards.length == 2 + get.sgn(event.player.hp - player.hp);
- }).length < num
- );
- },
- content: function () {
- player.draw(2 + get.sgn(trigger.player.hp - player.hp));
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (get.itemtype(player) !== "player" || player === target) return 1;
- let num = 1,
- ds = 2 + get.sgn(player.hp - target.hp);
- if (player === _status.currentPhase && _status.currentPhase.group === "qun" && target.hasZhuSkill("yuwei", player)) num = 2;
- if (
- target.getHistory("gain", function (evt) {
- return evt.getParent(2).name === "shiyuan" && evt.cards.length === ds;
- }).length >= num
- )
- return 1;
- let name = get.name(card);
- if (get.tag(card, "lose") || name === "huogong" || name === "juedou" || name === "tiesuo") return [1, ds];
- if (!target.hasFriend()) return 1;
- return [1, 0.8 * ds];
- },
- },
- },
- },
- dushi: {
- audio: 2,
- global: "dushi2",
- locked: true,
- trigger: { player: "die" },
- forceDie: true,
- direct: true,
- skillAnimation: true,
- animationColor: "gray",
- filter: function (event, player) {
- return game.hasPlayer(current => current != player);
- },
- content: function () {
- "step 0";
- player
- .chooseTarget("请选择【毒逝】的目标", "选择一名其他角色,令其获得技能【毒逝】", true, lib.filter.notMe)
- .set("forceDie", true)
- .set("ai", function (target) {
- return -get.attitude(_status.event.player, target);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("dushi", target);
- target.markSkill("dushi");
- target.addSkills("dushi");
- }
- },
- intro: { content: "您已经获得弘农王的诅咒" },
- },
- dushi2: {
- mod: {
- cardSavable: function (card, player, target) {
- if (card.name == "tao" && target != player && target.hasSkill("dushi")) return false;
- },
- },
- },
- yuwei: {
- audio: 2,
- trigger: { player: "shiyuanBegin" },
- filter: function (event, player) {
- return _status.currentPhase.group == "qun";
- },
- zhuSkill: true,
- forced: true,
- content: function () {},
- ai: { combo: "shiyuan" },
- },
- //新岩泽(划掉)留赞
- refenyin: {
- audio: 2,
- audioname: ["wufan"],
- trigger: { global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"] },
- forced: true,
- filter: function (event, player) {
- if (player != _status.currentPhase) return false;
- var cards = event.getd();
- if (!cards.length) return false;
- var list = [];
- var num = cards.length;
- for (var i = 0; i < cards.length; i++) {
- var card = cards[i];
- list.add(get.suit(card, false));
- }
- game.getGlobalHistory("cardMove", function (evt) {
- if (evt.name != "lose" && evt.name != "cardsDiscard") return false;
- if (evt.name == "lose" && evt.position != ui.discardPile) return false;
- if (evt == event || evt.getParent() == event) return false;
- num += evt.cards.length;
- for (var i = 0; i < evt.cards.length; i++) {
- var card = evt.cards[i];
- list.remove(get.suit(card, evt.cards2 && evt.cards2.includes(card) ? evt.player : false));
- }
- });
- player.storage.refenyin_mark2 = num;
- return list.length > 0;
- },
- content: function () {
- var list = [];
- var list2 = [];
- var cards = trigger.getd();
- for (var i = 0; i < cards.length; i++) {
- var card = cards[i];
- var suit = get.suit(card, false);
- list.add(suit);
- list2.add(suit);
- }
- game.getGlobalHistory("cardMove", function (evt) {
- if (evt.name != "lose" && evt.name != "cardsDiscard") return false;
- if (evt.name == "lose" && evt.position != ui.discardPile) return false;
- if (evt == trigger || evt.getParent() == trigger) return false;
- for (var i = 0; i < evt.cards.length; i++) {
- var card = evt.cards[i];
- var suit = get.suit(card, false);
- list.remove(suit);
- list2.add(suit);
- }
- });
- list2.sort();
- player.draw(list.length);
- player.storage.refenyin_mark = list2;
- player.addTempSkill("refenyin_mark");
- player.markSkill("refenyin_mark");
- },
- subSkill: {
- mark: {
- onremove: function (player) {
- delete player.storage.refenyin_mark;
- delete player.storage.refenyin_mark2;
- },
- intro: {
- content: function (s, p) {
- var str = "本回合已经进入过弃牌堆的卡牌的花色:";
- for (var i = 0; i < s.length; i++) {
- str += get.translation(s[i]);
- }
- str += "
本回合进入过弃牌堆的牌数:";
- str += p.storage.refenyin_mark2;
- return str;
- },
- },
- },
- },
- },
- liji: {
- enable: "phaseUse",
- audio: 2,
- filter: function (event, player) {
- return (player.getStat().skill.liji || 0) < (event.liji_num || 0);
- },
- onChooseToUse: function (event) {
- if (game.online) return;
- var num = 0;
- var evt2 = event.getParent();
- if (!evt2.liji_all) evt2.liji_all = game.players.length > 4 ? 8 : 4;
- game.getGlobalHistory("cardMove", function (evt) {
- if (evt.name == "cardsDiscard" || (evt.name == "lose" && evt.position == ui.discardPile)) num += evt.cards.length;
- });
- event.set("liji_num", Math.floor(num / evt2.liji_all));
- },
- filterCard: true,
- position: "he",
- check: function (card) {
- var val = get.value(card);
- if (!_status.event.player.getStorage("refenyin_mark").includes(get.suit(card))) return 12 - val;
- return 8 - val;
- },
- filterTarget: lib.filter.notMe,
- content: function () {
- target.damage("nocard");
- },
- ai: {
- order: 1,
- result: {
- target: -1.5,
- },
- tag: {
- damage: 1,
- },
- },
- },
- //文鸯
- xinlvli: {
- audio: "lvli",
- trigger: { player: "damageEnd", source: "damageSource" },
- filter: function (event, player, name) {
- var stat = player.getStat().skill;
- if (!stat.xinlvli) stat.xinlvli = 0;
- if (name == "damageEnd" && !player.storage.beishui) return false;
- if (stat.xinlvli > 1) return false;
- if (stat.xinlvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false;
- if (player.hp == player.countCards("h")) return false;
- if (player.hp < player.countCards("h") && player.isHealthy()) return false;
- return true;
- },
- content: function () {
- var stat = player.getStat().skill;
- stat.xinlvli++;
- var num = player.hp - player.countCards("h");
- if (num > 0) player.draw(num);
- else player.recover(-num);
- },
- //group:'lvli3',
- },
- lvli: {
- audio: 2,
- init: function (player, skill) {
- player.storage[skill] = 0;
- },
- enable: "chooseToUse",
- filter: function (event, player) {
- if (player.storage.lvli > 1) return false;
- if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false;
- return event.type != "wuxie" && event.type != "respondShan";
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = [];
- for (var i = 0; i < lib.inpile.length; i++) {
- var name = lib.inpile[i];
- if (name == "wuxie") continue;
- if (name == "sha") {
- list.push(["基本", "", "sha"]);
- list.push(["基本", "", "sha", "fire"]);
- list.push(["基本", "", "sha", "thunder"]);
- } else if (get.type(name) == "trick") list.push(["锦囊", "", name]);
- else if (get.type(name) == "basic") list.push(["基本", "", name]);
- }
- return ui.create.dialog(event.lvli6 ? get.prompt("lvli") : "膂力", [list, "vcard"]);
- },
- filter: function (button, player) {
- var evt = _status.event.getParent();
- if (evt && typeof evt.filterCard == "function") return evt.filterCard({ name: button.link[2] }, player, evt);
- return lib.filter.filterCard({ name: button.link[2], isCard: true }, player, _status.event.getParent());
- },
- check: function (button) {
- var player = _status.event.player;
- if (player.countCards("h", button.link[2])) return 0;
- if (_status.event.getParent().type != "phase" && !_status.event.getParent().lvli6) return 1;
- return player.getUseValue({ name: button.link[2], isCard: true });
- },
- backup: function (links, player) {
- return {
- filterCard: function () {
- return false;
- },
- audio: "lvli",
- selectCard: -1,
- check: function (card) {
- return 1;
- },
- viewAs: { name: links[0][2], nature: links[0][3], isCard: true },
- };
- },
- prompt: function (links, player) {
- return "请选择" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "的目标";
- },
- },
- ai: {
- order: 4,
- result: {
- player: 1,
- },
- threaten: 2.9,
- fireAttack: true,
- },
- group: ["lvli2", "lvli3", "lvli4", "lvli5", "lvli6"],
- },
- lvli2: {
- trigger: { player: ["useCardBefore", "respondBefore"] },
- forced: true,
- popup: false,
- priority: 35,
- filter: function (event, player) {
- return event.skill == "lvli_backup" || event.skill == "lvli5" || event.skill == "lvli4";
- },
- content: function () {
- "step 0";
- player.logSkill("lvli");
- player.storage.lvli++;
- player.popup(trigger.card.name, trigger.name == "useCard" ? "metal" : "wood");
- "step 1";
- var random = 0.5 + player.countCards("e") * 0.1;
- if (get.isLuckyStar(player)) random = 1;
- if (random >= Math.random()) {
- player.popup("洗具");
- } else {
- player.popup("杯具");
- trigger.cancel();
- if (!trigger.getParent().lvli6) {
- trigger.getParent().goto(0);
- }
- game.broadcastAll(function (str) {
- var dialog = ui.create.dialog(str);
- dialog.classList.add("center");
- setTimeout(function () {
- dialog.close();
- }, 1000);
- }, get.translation(player) + "声明的" + get.translation(trigger.card.name) + "并没有生效");
- game.log("然而什么都没有发生");
- game.delay(2);
- }
- },
- },
- lvli3: {
- trigger: { global: "phaseBefore" },
- forced: true,
- silent: true,
- popup: false,
- content: function () {
- player.storage.lvli = 0;
- },
- },
- lvli4: {
- log: false,
- enable: "chooseToUse",
- viewAsFilter: function (player) {
- if (player.storage.lvli > 1) return false;
- if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false;
- return true;
- },
- filterCard: function () {
- return false;
- },
- selectCard: -1,
- viewAs: { name: "shan" },
- ai: {
- skillTagFilter: function (player) {
- if (player.storage.lvli > 1) return false;
- if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false;
- return true;
- },
- threaten: 1.5,
- respondShan: true,
- },
- },
- lvli5: {
- log: false,
- enable: "chooseToUse",
- viewAsFilter: function (player) {
- if (player.storage.lvli > 1) return false;
- if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false;
- return true;
- },
- filterCard: function () {
- return false;
- },
- selectCard: -1,
- viewAs: { name: "wuxie" },
- },
- lvli6: {
- trigger: { player: "damageEnd" },
- direct: true,
- filter: function (event, player) {
- if (!player.storage.beishui) return false;
- if (player.storage.lvli > 1) return false;
- if (player.storage.lvli > 0 && (player != _status.currentPhase || !player.storage.choujue)) return false;
- return true;
- },
- content: function () {
- var next = player.chooseToUse();
- next.set("norestore", true);
- next.set("_backupevent", "lvli");
- next.backup("lvli");
- next.set("lvli6", true);
- },
- },
- choujue: {
- derivation: ["beishui", "qingjiao"],
- trigger: { global: "phaseAfter" },
- audio: 2,
- skillAnimation: true,
- animationColor: "water",
- unique: true,
- juexingji: true,
- forced: true,
- init: function (player, skill) {
- if (!player.storage[skill]) player.storage[skill] = false;
- },
- filter: function (event, player) {
- if (player.storage.choujue) return false;
- return Math.abs(player.hp - player.countCards("h")) >= 3;
- },
- content: function () {
- player.awakenSkill("choujue");
- player.storage.choujue = true;
- player.loseMaxHp();
- player.addSkills("beishui");
- },
- },
- beishui: {
- trigger: { player: "phaseZhunbeiBegin" },
- audio: 2,
- skillAnimation: "epic",
- animationColor: "thunder",
- unique: true,
- juexingji: true,
- forced: true,
- init: function (player, skill) {
- if (!player.storage[skill]) player.storage[skill] = false;
- },
- filter: function (event, player) {
- if (player.storage.beishui) return false;
- return Math.min(player.hp, player.countCards("h")) < 2;
- },
- content: function () {
- player.awakenSkill("beishui");
- player.storage.beishui = true;
- player.loseMaxHp();
- player.addSkills("qingjiao");
- },
- },
- qingjiao: {
- trigger: { player: "phaseUseBegin" },
- filter: function (event, player) {
- if (!ui.cardPile.hasChildNodes() && !ui.discardPile.hasChildNodes());
- var hs = player.getCards("h");
- if (!hs.length) return false;
- for (var i of hs) {
- if (!lib.filter.cardDiscardable(i, player, "qingjiao")) return false;
- }
- return true;
- },
- //check:function(event,player){
- // return player.countCards('h')<=player.hp;
- //},
- content: function () {
- "step 0";
- player.chooseToDiscard(true, "h", player.countCards("h"));
- "step 1";
- var evt = trigger.getParent();
- if (evt && evt.getParent && !evt.qingjiao) {
- evt.qingjiao = true;
- var next = game.createEvent("qingjiao_discard", false, evt.getParent());
- next.player = player;
- next.setContent(function () {
- var hs = player.getCards("he");
- if (hs.length) player.discard(hs);
- });
- }
- "step 2";
- var list = [];
- var typelist = [];
- var getType = function (card) {
- var sub = get.subtype(card);
- if (sub) return sub;
- return card.name;
- };
- for (var i = 0; i < ui.cardPile.childElementCount; i++) {
- var node = ui.cardPile.childNodes[i];
- var typex = getType(node);
- if (!typelist.includes(typex)) {
- list.push(node);
- typelist.push(typex);
- if (list.length >= 8) break;
- }
- }
- if (list.length < 8) {
- for (var i = 0; i < ui.discardPile.childElementCount; i++) {
- var node = ui.discardPile.childNodes[i];
- var typex = getType(node);
- if (!typelist.includes(typex)) {
- list.push(node);
- typelist.push(typex);
- if (list.length >= 8) break;
- }
- }
- }
- player.gain(list, "gain2");
- },
- },
- //王双
- spzhuilie: {
- mod: {
- targetInRange: function (card) {
- if (card.name == "sha") return true;
- },
- },
- trigger: { player: "useCardToTargeted" },
- filter: function (event, player) {
- return event.card && event.card.name == "sha" && !player.inRange(event.target);
- },
- forced: true,
- logTarget: "target",
- content: function () {
- "step 0";
- player.judge(function (card) {
- var type = get.subtype(card);
- return ["equip1", "equip4", "equip3", "equip6"].includes(type) ? 6 : -6;
- // switch(type){
- // case 'equip':return 4;
- // case 'trick':return -4;
- // default:return 0;
- // }
- }).judge2 = function (result) {
- return result.bool;
- };
- "step 1";
- if (trigger.getParent().addCount !== false) {
- trigger.getParent().addCount = false;
- var stat = player.getStat();
- if (stat && stat.card && stat.card.sha) stat.card.sha--;
- }
- if (result.bool === true) {
- var map = trigger.customArgs;
- var id = trigger.target.playerid;
- if (!map[id]) map[id] = {};
- if (typeof map[id].extraDamage != "number") map[id].extraDamage = 0;
- map[id].extraDamage += trigger.target.hp - 1;
- } else if (result.bool === false) player.loseHp();
- },
- },
- spzhuilie2: {
- onremove: true,
- intro: {
- content: "使用【杀】的次数上限+#",
- },
- mod: {
- cardUsable: function (card, player, num) {
- if (card.name == "sha") return num + player.countMark("spzhuilie2");
- },
- },
- },
- //花鬘
- manyi: {
- audio: 2,
- audioname: ["mengyou", "menghuo", "zhurong"],
- trigger: { target: "useCardToBefore" },
- filter: function (event, player) {
- return event.card.name == "nanman";
- },
- forced: true,
- content: function () {
- trigger.cancel();
- },
- ai: {
- effect: {
- target: function (card) {
- if (card.name == "nanman") return "zerotarget";
- },
- },
- },
- group: "manyi_single",
- subSkill: {
- single: {
- trigger: {
- player: "enterGame",
- global: "gameDrawAfter",
- },
- filter: function (event, player) {
- return get.mode() == "single" && _status.mode == "normal";
- },
- direct: true,
- content: function () {
- player.chooseUseTarget("nanman", get.prompt("manyi"), "视为使用一张【南蛮入侵】").logSkill = "manyi";
- },
- },
- },
- },
- mansi: {
- audio: 2,
- group: "mansi_viewas",
- trigger: { global: "damageEnd" },
- filter: function (event, player) {
- return event.card && event.card.name == "nanman";
- },
- frequent: true,
- content: function () {
- player.draw();
- player.addMark("mansi", 1, false);
- },
- intro: { content: "已因此技能得到了#张牌" },
- },
- mansi_viewas: {
- audio: "mansi",
- position: "h",
- enable: "phaseUse",
- usable: 1,
- filterCard: true,
- selectCard: -1,
- filter: function (event, player) {
- var hs = player.getCards("h");
- if (!hs.length) return false;
- for (var i = 0; i < hs.length; i++) {
- var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player);
- if (mod2 === false) return false;
- }
- return true;
- },
- viewAs: { name: "nanman" },
- ai: {
- order: 0.1,
- nokeep: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat("skill").mansi_viewas && player.hasCard(card => get.name(card) !== "tao", "h");
- },
- },
- },
- souying: {
- audio: 2,
- trigger: {
- player: "useCardToPlayered",
- target: "useCardToTargeted",
- },
- direct: true,
- filter: function (event, player, name) {
- if (!player.countCards("he") || player.hasSkill("souying2")) return false;
- if (!event.targets || event.targets.length != 1 || event.player == event.target) return false;
- if (event.card.name != "sha" && get.type(event.card) != "trick") return false;
- if (name == "useCardToPlayered") {
- if (!event.cards.filterInD().length) return false;
- var target = event.target;
- return (
- player
- .getHistory("useCard", function (evt) {
- return evt.targets && evt.targets.includes(target);
- })
- .indexOf(event.getParent()) > 0
- );
- } else {
- var source = event.player;
- return (
- source
- .getHistory("useCard", function (evt) {
- return evt.targets && evt.targets.includes(player);
- })
- .indexOf(event.getParent()) > 0
- );
- }
- },
- content: function () {
- "step 0";
- var next = player.chooseToDiscard("he");
- var prompt;
- if (event.triggername == "useCardToTargeted") {
- event.target = trigger.player;
- prompt = "令" + get.translation(trigger.card) + "对你无效";
- next.set("goon", -get.effect(player, trigger.card, trigger.player, player));
- } else {
- event.target = trigger.targets[0];
- prompt = "弃置一张牌,并获得" + get.translation(trigger.cards.filterInD());
- next.set("goon", get.value(trigger.cards.filterInD()));
- }
- next.set("prompt", get.prompt("souying", event.target));
- next.set("prompt2", prompt);
- next.set("ai", function (card) {
- return _status.event.goon - get.value(card);
- });
- next.set("logSkill", ["souying", event.target]);
- "step 1";
- if (result.bool) {
- player.addTempSkill("souying2");
- if (event.triggername == "useCardToPlayered") player.gain(trigger.cards.filterInD(), "gain2");
- else trigger.excluded.add(player);
- }
- },
- ai: {
- expose: 0.25,
- },
- },
- souying2: {},
- zhanyuan: {
- unique: true,
- audio: 2,
- derivation: "hmxili",
- skillAnimation: true,
- animationColor: "soil",
- juexingji: true,
- forced: true,
- filter: function (event, player) {
- return player.countMark("mansi") > 7;
- },
- trigger: { player: "phaseZhunbeiBegin" },
- content: function () {
- "step 0";
- player.awakenSkill("zhanyuan");
- player.gainMaxHp();
- player.recover();
- "step 1";
- player.chooseTarget("是否失去〖蛮嗣〗,令一名其他男性角色和自己一同获得技能〖系力〗?", function (card, player, target) {
- return target != player && target.hasSex("male");
- }).ai = function (target) {
- return get.attitude(_status.event.player, target);
- };
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "fire");
- player.changeSkills(["hmxili"], ["mansi"]);
- target.addSkills("hmxili");
- }
- },
- ai: {
- combo: "mansi",
- },
- },
- hmxili: {
- trigger: { global: "damageBegin1" },
- direct: true,
- audio: 2,
- filter: function (event, player) {
- return event.source && event.source != player && event.source == _status.currentPhase && event.source.hasSkill("hmxili") && !event.player.hasSkill("hmxili") && player.countCards("he") > 0 && !player.hasSkill("hmxili2");
- },
- content: function () {
- "step 0";
- player.chooseToDiscard("是否弃置一张牌,令" + get.translation(trigger.source) + "对" + get.translation(trigger.player) + "的伤害+1,且你与其各摸两张牌?", "he").set("logSkill", ["hmxili", trigger.player]).ai = function (card) {
- return 9 - get.value(card);
- };
- "step 1";
- if (result.bool) {
- game.asyncDraw([trigger.source, player], 2);
- trigger.num++;
- player.addTempSkill("hmxili2");
- } else event.finish();
- "step 2";
- game.delayx();
- },
- },
- hmxili2: {},
- //吴兰雷铜
- wlcuorui: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- filter: function (event, player) {
- if (!["identity", "guozhan"].includes(get.mode())) {
- return game.hasPlayer(function (current) {
- return current.isFriendOf(player) && current.countDiscardableCards(player, "hej") > 0;
- });
- }
- return game.hasPlayer(current => {
- return get.distance(player, current) <= 1 && current.countDiscardableCards(player, "hej") > 0;
- });
- },
- content: function () {
- "step 0";
- if (!["identity", "guozhan"].includes(get.mode())) {
- player
- .chooseTarget(function (card, player, target) {
- return target.isFriendOf(player) && target.countDiscardableCards(player, "hej") > 0;
- }, get.prompt2("wlcuorui"))
- .set("ai", function (target) {
- if (
- target.countCards("e", function (card) {
- return card.name != "tengjia" && get.value(card, target) <= 0;
- })
- )
- return 10;
- if (
- target.countCards("j", function (card) {
- return get.effect(target, { name: card.viewAs || card.name }, target, target) < 0;
- })
- )
- return 10;
- return Math.random() + 0.2 - 1 / target.countCards("hej");
- });
- } else {
- player
- .chooseTarget(function (card, player, target) {
- return get.distance(player, target) <= 1 && target.countDiscardableCards(player, "hej") > 0;
- }, get.prompt2("wlcuorui"))
- .set("ai", function (target) {
- if (
- game.hasPlayer(current => {
- return current != target && get.attitude(_status.event.player, current) < 0;
- })
- )
- return get.effect(target, { name: "guohe" }, player, player) + 10;
- return 0;
- });
- }
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("wlcuorui", target);
- player.discardPlayerCard(target, "hej", true);
- if (["identity", "guozhan"].includes(get.mode())) event.goto(7);
- } else event.finish();
- "step 2";
- if (!result.cards || !result.cards.length) {
- event.finish();
- return;
- }
- var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target);
- event.color = color;
- var list = [];
- if (
- game.hasPlayer(function (current) {
- return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("h");
- })
- )
- list.push("展示手牌");
- if (
- game.hasPlayer(function (current) {
- return (get.mode() == "versus" ? current.isEnemyOf(player) : current != player && current != target) && current.countCards("e", { color: color });
- })
- )
- list.push("弃置装备");
- if (!list.length) {
- event.finish();
- return;
- }
- if (list.length == 1) event._result = { control: list[0] };
- else
- player
- .chooseControl(list)
- .set("prompt", "挫锐:展示对手的至多两张手牌,或弃置对手装备区内至多两张" + get.translation(color) + "牌")
- .set("ai", function () {
- var player = _status.event.player;
- var color = _status.event.getParent().color;
- if (
- game.countPlayer(function (current) {
- if (!current.isEnemyOf(player)) return false;
- return current.countCards("e", function (card) {
- return get.color(card) == color && get.value(card) > 0;
- });
- }) > 1
- )
- return 1;
- return 0;
- });
- "step 3";
- if (result.control == "弃置装备") event.goto(5);
- else {
- var dialog = ["请选择要展示的牌"];
- var list = game
- .filterPlayer(function (current) {
- return current.isEnemyOf(player) && current.countCards("h");
- })
- .sortBySeat();
- for (var i of list) {
- dialog.push('' + get.translation(i) + "
");
- if (player.hasSkillTag("viewHandcard", null, i, true)) dialog.push(i.getCards("h"));
- else dialog.push([i.getCards("h"), "blank"]);
- }
- player
- .chooseButton([1, 2], true)
- .set("createDialog", dialog)
- .set("ai", function (button) {
- var color = get.color(button.link) == _status.event.getParent().color;
- return color ? Math.random() : 0.35;
- });
- }
- "step 4";
- player.showCards(result.links);
- var map = {};
- var map2 = {};
- for (var i of result.links) {
- var id = get.owner(i).playerid;
- if (!map[id]) map[id] = [];
- map[id].push(i);
- if (get.color(i) != event.color) continue;
- if (!map2[id]) map2[id] = [];
- map2[id].push(i);
- }
- for (var i in map) {
- var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i];
- if (map2[i]) player.gain(map2[i], source, "bySelf", "give");
- player.line(source);
- game.log(player, "展示了", source, "的", map[i]);
- }
- event.next.sort(function (a, b) {
- return lib.sort.seat(a.source || a.player, b.source || b.player);
- });
- event.finish();
- "step 5";
- var dialog = ["请选择要弃置的牌"];
- var list = game
- .filterPlayer(function (current) {
- return (
- current.isEnemyOf(player) &&
- current.countCards("e", function (card) {
- return get.color(card) == event.color;
- })
- );
- })
- .sortBySeat();
- for (var i of list) {
- dialog.push('' + get.translation(i) + "
");
- dialog.push(
- i.getCards("e", function (card) {
- return get.color(card) == event.color;
- })
- );
- }
- player
- .chooseButton([1, 2], true)
- .set("createDialog", dialog)
- .set("ai", function (button) {
- var owner = get.owner(button.link);
- return get.value(button.link, owner);
- });
- "step 6";
- var map = {};
- for (var i of result.links) {
- if (get.color(i) != event.color) continue;
- var id = get.owner(i).playerid;
- if (!map[id]) map[id] = [];
- map[id].push(i);
- }
- for (var i in map) {
- (_status.connectMode ? lib.playerOL : game.playerMap)[i].discard(map[i], "notBySelf").discarder = player;
- }
- event.next.sort(function (a, b) {
- return lib.sort.seat(a.player, b.player);
- });
- event.finish();
- "step 7";
- if (!result.cards || !result.cards.length) {
- event.finish();
- return;
- }
- if (
- game.hasPlayer(current => {
- return current.countCards("he") > 0 && current != player && current != target;
- })
- ) {
- var color = get.color(result.cards[0], result.cards[0].original == "j" ? false : target);
- event.color = color;
- var next = player.chooseTarget(true, "挫锐:选择另一名其他角色", "弃置该角色装备区里至多两张" + get.translation(event.color) + "牌;或展示该角色的至多两张手牌,然后获得其中的" + get.translation(event.color) + "牌");
- next.set("filterTarget", (card, player, target) => {
- return target.countCards("he") > 0 && target != player && target != _status.event.getParent().target;
- });
- next.set("ai", target => {
- return -get.attitude(_status.event.player, target) * target.countCards("he") + 0.1;
- });
- } else event.finish();
- "step 8";
- if (result.bool) {
- var targetx = result.targets[0];
- event.targetx = targetx;
- player.line(targetx);
- player
- .choosePlayerCard(targetx, "he", true, [1, 2])
- .set("prompt", "展示至多两张手牌,或弃置至多两张" + get.translation(event.color) + "装备")
- .set("filterButton", button => {
- if (ui.selected.buttons.length) {
- var linkx = ui.selected.buttons[0].link;
- if (get.position(button.link) != get.position(linkx)) return false;
- }
- if (get.position(button.link) == "e") return get.color(button.link, _status.event.target) == _status.event.getParent().color;
- return true;
- })
- .set("target", targetx);
- } else event.finish();
- "step 9";
- if (result.bool) {
- var cards = result.links;
- if (get.position(cards[0]) == "e") {
- event.targetx.discard(cards, "notBySelf").discarder = player;
- event.finish();
- } else {
- player.showCards(cards, get.translation(event.targetx) + "因【挫锐】展示的牌");
- var cards2 = cards.filter(card => {
- return get.color(card) == event.color;
- });
- if (cards2.length) player.gain(cards2, event.targetx, "give");
- }
- }
- },
- },
- kuiji: {
- audio: 2,
- usable: 1,
- enable: "phaseUse",
- filter: function (event, player) {
- if (player.hasJudge("bingliang")) return false;
- return (
- player.countCards("hes", function (card) {
- return get.color(card) == "black" && get.type(card) == "basic";
- }) > 0
- );
- },
- position: "hes",
- discard: false,
- lose: false,
- delay: false,
- prepare: function (cards, player) {
- player.$give(cards, player, false);
- },
- filterCard: function (card, player, event) {
- return get.color(card) == "black" && get.type(card) == "basic" && player.canAddJudge({ name: "bingliang", cards: [card] });
- },
- selectTarget: -1,
- filterTarget: function (card, player, target) {
- return player == target;
- },
- check: function (card) {
- return 9 - get.value(card);
- },
- // onuse:function(links,player){
- // var next=game.createEvent('kuiji_content',false,_status.event.getParent());
- // next.player=player;
- // next.setContent(lib.skill.kuiji.kuiji_content);
- // },
- // kuiji_content:function(){
- content: function () {
- "step 0";
- player.addJudge({ name: "bingliang" }, cards);
- player.draw();
- "step 1";
- var next = player.chooseTarget().set("ai", function (target) {
- let player = _status.event.player;
- if (
- target.hasSkillTag(
- "filterDamage",
- null,
- {
- player: player,
- },
- true
- )
- )
- return get.damageEffect(target, player, player);
- return 2 * get.damageEffect(target, player, player);
- });
- if (!["identity", "guozhan"].includes(get.mode())) {
- next.set("prompt", "选择一名体力值最大的敌方角色,对其造成2点伤害");
- next.set("filterTarget", function (card, player, target) {
- return (
- target.isEnemyOf(player) &&
- !game.hasPlayer(function (current) {
- return current.isEnemyOf(player) && current.hp > target.hp;
- })
- );
- });
- } else {
- next.set("prompt", "选择一名除你外体力值最大的角色,对其造成2点伤害");
- next.set("filterTarget", function (card, player, target) {
- return (
- player != target &&
- !game.hasPlayer(function (current) {
- return current != player && current.hp > target.hp;
- })
- );
- });
- }
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target);
- target.damage(2);
- }
- },
- ai: {
- result: {
- target: function (player, target) {
- let es;
- if (["identity", "guozhan"].includes(get.mode()))
- es = game.hasPlayer(i => {
- return (
- i != player &&
- !game.hasPlayer(j => {
- return player !== j && j.hp > i.hp;
- }) &&
- get.attitude(player, i) < 0
- );
- });
- else
- es = game.hasPlayer(i => {
- return (
- i.isEnemyOf(player) &&
- !game.hasPlayer(j => {
- return j.hp > i.hp && j.isEnemyOf(player);
- }) &&
- get.attitude(player, i) < 0
- );
- });
- if (es) return 2;
- return -1.5;
- },
- },
- order: 12,
- },
- group: "kuiji_dying",
- subSkill: {
- dying: {
- trigger: { global: "dying" },
- filter: function (event, player) {
- let evt = event.getParent(2);
- return evt && evt.name == "kuiji";
- },
- locked: true,
- direct: true,
- content: function () {
- "step 0";
- var list;
- if (["identity", "guozhan"].includes(get.mode()))
- list = game
- .filterPlayer(current => {
- return (
- current !== trigger.player &&
- !game.hasPlayer(i => {
- return trigger.player !== i && i.hp < current.hp;
- })
- );
- })
- .filter(i => i.isDamaged());
- else
- list = game
- .filterPlayer(current => {
- return (
- current.isFriendOf(player) &&
- !game.hasPlayer(i => {
- return i.hp < current.hp && i.isFriendOf(player);
- })
- );
- })
- .filter(i => i.isDamaged());
- if (list.length > 1)
- player
- .chooseTarget(
- "溃击:选择一名角色回复1点体力",
- (card, player, target) => {
- return _status.event.list.includes(target);
- },
- true
- )
- .set("list", list)
- .set("ai", target => {
- return get.recoverEffect(target, player, _status.event.player);
- });
- else if (list.length) event._result = { bool: true, targets: list };
- else event._result = { bool: false };
- "step 1";
- if (result.bool) {
- let target = result.targets[0];
- player.logSkill("kuiji", target);
- target.recover();
- }
- },
- },
- },
- },
- //蒲元
- pytianjiang: {
- audio: 2,
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return event.name != "phase" || game.phaseNumber == 0;
- },
- content: function () {
- "step 0";
- var i = 0;
- var list = [];
- while (i++ < 2) {
- var card = get.cardPile(function (card) {
- if (get.type(card) != "equip") return false;
- return list.length == 0 || get.subtype(card) != get.subtype(list[0]);
- });
- if (card) list.push(card);
- }
- if (!list.length) {
- event.finish();
- return;
- }
- event.list = list;
- player.gain(event.list, "gain2");
- "step 1";
- game.delay(1);
- var card = event.list.shift();
- if (player.getCards("h").includes(card)) {
- player.$give(card, player, false);
- player.equip(card);
- }
- if (event.list.length) event.redo();
- },
- group: "pytianjiang_move",
- },
- pytianjiang_move: {
- audio: "pytianjiang",
- prompt: "将装备区里的一张牌移动至其他角色的装备区",
- enable: "phaseUse",
- position: "e",
- filter: function (event, player) {
- return player.countCards("e") > 0;
- },
- check: function () {
- return 1;
- },
- filterCard: true,
- filterTarget: function (event, player, target) {
- return target != player && target.canEquip(ui.selected.cards[0], true);
- },
- prepare: "give",
- discard: false,
- lose: false,
- content: function () {
- "step 0";
- target.equip(cards[0]);
- "step 1";
- if (cards[0].name.indexOf("pyzhuren_") == 0 && !player.getCards("e").includes(cards[0])) player.draw(2);
- },
- ai: {
- order: (item, player) => {
- if (player.hasCard(i => get.subtype(i) === "equip1", "h")) return 11;
- return 1;
- },
- expose: 0.2,
- result: {
- target: function (player, target) {
- if (ui.selected.cards.length) {
- let card = ui.selected.cards[0],
- tv = get.value(card, target),
- sub = get.subtype(card);
- if (sub === "equip1") {
- let ev = Infinity,
- te = target.getEquips(1);
- if (!te.length) return tv;
- te.forEach(i => {
- ev = Math.min(ev, get.value(i));
- });
- if (card.name.indexOf("pyzhuren_") == 0) return 2 + tv - ev;
- return tv - ev;
- }
- if (target.hasCard(i => get.subtype(i) === sub, "he")) return 0;
- let pv = get.value(card, player);
- if (pv > 0 && Math.abs(tv) <= pv) return 0;
- return tv;
- }
- return 0;
- },
- },
- },
- },
- pyzhuren: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterCard: true,
- selectCard: 1,
- check: function (card) {
- var player = _status.event.player;
- var name = "pyzhuren_" + card[card.name == "shandian" ? "name" : "suit"];
- if (!lib.card[name] || (_status.pyzhuren && _status.pyzhuren[name])) {
- if (!player.countCards("h", "sha")) return 4 - get.value(card);
- return 0;
- }
- return 7 - get.value(card);
- },
- content: function () {
- //player.addSkill('pyzhuren_destroy');
- if (!_status.pyzhuren) _status.pyzhuren = {};
- var rand = 0.85;
- var num = get.number(cards[0]);
- if (num > 4) rand = 0.9;
- if (num > 8) rand = 0.95;
- if (num > 12 || cards[0].name == "shandian" || get.isLuckyStar(player)) rand = 1;
- var name = "pyzhuren_" + cards[0][cards[0].name == "shandian" ? "name" : "suit"];
- if (!lib.card[name] || _status.pyzhuren[name] || Math.random() > rand) {
- player.popup("杯具");
- game.log(player, "锻造失败");
- var card = get.cardPile(function (card) {
- return card.name == "sha";
- });
- if (card) player.gain(card, "gain2");
- } else {
- _status.pyzhuren[name] = true;
- var card = game.createCard(name, cards[0].name == "shandian" ? "spade" : cards[0].suit, 1);
- card.destroyed = "discardPile";
- player.gain(card, "gain2");
- }
- },
- ai: {
- order: 10,
- result: {
- player: 1,
- },
- },
- },
- pyzhuren_heart: {
- audio: true,
- trigger: { source: "damageSource" },
- usable: 1,
- equipSkill: true,
- filter: function (event, player) {
- return event.getParent().name == "sha";
- },
- content: function () {
- "step 0";
- player.judge(function (card) {
- var player = _status.event.getParent("pyzhuren_heart").player;
- if (player.isHealthy() && get.color(card) == "red") return 0;
- return 2;
- });
- "step 1";
- if (result.color == "red") player.recover();
- else player.draw(2);
- },
- ai: {
- equipValue: function (card, player) {
- if (player.isDamaged()) return 4.5;
- return 6;
- },
- basic: {
- equipValue: 4.5,
- },
- },
- },
- pyzhuren_diamond: {
- audio: true,
- trigger: { source: "damageBegin1" },
- direct: true,
- usable: 2,
- equipSkill: true,
- mod: {
- cardUsable: function (card, player, num) {
- var cardx = player.getEquip("pyzhuren_diamond");
- if (card.name == "sha" && (!cardx || player.hasSkill("pyzhuren_diamond", null, false) || (!_status.pyzhuren_diamond_temp && !ui.selected.cards.includes(cardx)))) {
- return num + 1;
- }
- },
- cardEnabled2: function (card, player) {
- if (!_status.event.addCount_extra || player.hasSkill("pyzhuren_diamond", null, false)) return;
- if (card && card == player.getEquip("pyzhuren_diamond")) {
- _status.pyzhuren_diamond_temp = true;
- var bool = lib.filter.cardUsable(get.autoViewAs({ name: "sha" }, ui.selected.cards.concat([card])), player);
- delete _status.pyzhuren_diamond_temp;
- if (!bool) return false;
- }
- },
- },
- filter: function (event, player) {
- if (event.getParent().name != "sha") return false;
- return (
- player.countCards("he", function (card) {
- return card != player.getEquip("pyzhuren_diamond");
- }) > 0
- );
- },
- content: function () {
- "step 0";
- var next = player.chooseToDiscard(
- "he",
- function (card, player) {
- return card != player.getEquip("pyzhuren_diamond");
- },
- get.prompt(event.name, trigger.player),
- "弃置一张牌,令即将对其造成的伤害+1"
- );
- next.set("target", trigger.player);
- next.ai = function (card) {
- if (_status.event.goon) return 30 / (1 + _status.event.target.hp) - get.value(card);
- return -1;
- };
- next.set(
- "goon",
- get.attitude(player, trigger.player) < 0 &&
- !trigger.player.hasSkillTag("filterDamage", null, {
- player: player,
- card: trigger.card,
- }) &&
- get.damageEffect(trigger.player, player, player, get.natureList(trigger)) > 0
- );
- next.logSkill = [event.name, trigger.player];
- "step 1";
- if (result.bool) trigger.num++;
- else player.storage.counttrigger.pyzhuren_diamond--;
- },
- ai: {
- expose: 0.25,
- equipValue: function (card, player) {
- return Math.min(7, 3.6 + player.countCards("h") / 2);
- },
- basic: {
- equipValue: 4.5,
- },
- },
- },
- pyzhuren_club: {
- audio: true,
- trigger: { player: "useCard2" },
- direct: true,
- equipSkill: true,
- filter: function (event, player) {
- if (event.card.name != "sha" && get.type(event.card) != "trick") return false;
- var info = get.info(event.card);
- if (info.allowMultiple == false) return false;
- var num = player.getHistory("useSkill", function (evt) {
- return evt.skill == "pyzhuren_club";
- }).length;
- if (num >= 2) return false;
- if (event.targets && !info.multitarget) {
- if (
- game.hasPlayer(function (current) {
- return lib.filter.targetEnabled2(event.card, player, current) && !event.targets.includes(current);
- })
- ) {
- return true;
- }
- }
- return false;
- },
- content: function () {
- "step 0";
- var prompt2 = "为" + get.translation(trigger.card) + "额外指定一个目标";
- player
- .chooseTarget([1, player.storage.fumian_red], get.prompt(event.name), function (card, player, target) {
- var player = _status.event.player;
- if (_status.event.targets.includes(target)) return false;
- return lib.filter.targetEnabled2(_status.event.card, player, target);
- })
- .set("prompt2", prompt2)
- .set("ai", function (target) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.player;
- return get.effect(target, trigger.card, player, player);
- })
- .set("targets", trigger.targets)
- .set("card", trigger.card);
- "step 1";
- if (result.bool) {
- if (!event.isMine() && !event.isOnline()) game.delayx();
- event.targets = result.targets;
- }
- "step 2";
- if (event.targets) {
- player.logSkill(event.name, event.targets);
- trigger.targets.addArray(event.targets);
- }
- },
- ai: {
- equipValue: function (card, player) {
- if (player.getEnemies().length < 2) {
- if (player.isDamaged()) return 0;
- return 1;
- }
- return 4.5;
- },
- basic: {
- equipValue: 4.5,
- },
- },
- },
- pyzhuren_spade: {
- audio: true,
- trigger: { player: "useCardToPlayered" },
- filter: function (event, player) {
- return event.card.name == "sha"; //&&event.targets.length==1&&get.color(event.card)=='black';
- },
- check: function (event, player) {
- return get.attitude(player, event.target) <= 0;
- },
- equipSkill: true,
- logTarget: "target",
- content: function () {
- var num = player.getHistory("useSkill", function (evt) {
- return evt.skill == "pyzhuren_spade";
- }).length;
- trigger.target.loseHp(Math.min(num, 5)); //.set('source',player);
- },
- ai: {
- equipValue: function (card, player) {
- return 1 + 4 * Math.min(5, player.getCardUsable("sha"));
- },
- basic: {
- equipValue: 5,
- },
- jueqing: true,
- unequip_ai: true,
- skillTagFilter: function (player, tag, arg) {
- if (tag == "unequip_ai") return arg && arg.name === "sha";
- },
- },
- },
- pyzhuren_shandian: {
- audio: true,
- trigger: { player: "useCardToPlayered" },
- filter: function (event, player) {
- return event.card.name == "sha"; //&&event.targets.length==1;
- },
- check: function (event, player) {
- return get.attitude(player, event.target) <= 0;
- },
- equipSkill: true,
- logTarget: "target",
- content: function () {
- "step 0";
- trigger.target.judge(function (card) {
- var suit = get.suit(card);
- if (suit == "spade") return -10;
- if (suit == "club") return -5;
- return 0;
- }).judge2 = function (result) {
- return result.color == "black" ? true : false;
- };
- "step 1";
- if (result.suit == "spade") {
- trigger.target.damage(3, "thunder");
- //trigger.getParent().excluded.add(trigger.target);
- } else if (result.suit == "club") {
- trigger.target.damage("thunder");
- player.recover();
- player.draw();
- }
- },
- ai: {
- equipValue: function (card, player) {
- if (player.isDamaged()) return 6;
- return 4.8;
- },
- basic: {
- equipValue: 5,
- },
- },
- },
- //管辂和葛玄
- gxlianhua: {
- derivation: ["reyingzi", "reguanxing", "xinzhiyan", "gongxin"],
- audio: 2,
- init: function (player, skill) {
- if (!player.storage[skill])
- player.storage[skill] = {
- red: 0,
- black: 0,
- };
- },
- marktext: "丹",
- intro: {
- name: "丹血",
- markcount: function (storage) {
- return storage.red + storage.black;
- },
- content: function (storage) {
- return "共有" + (storage.red + storage.black) + "个标记";
- },
- },
- trigger: { global: "damageEnd" },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return event.player != player && event.player.isIn() && _status.currentPhase != player;
- },
- content: function () {
- player.storage.gxlianhua[player.getFriends().includes(trigger.player) ? "red" : "black"]++;
- player.markSkill("gxlianhua");
- },
- group: "gxlianhua_harmonia",
- subSkill: {
- harmonia: {
- forced: true,
- audio: "gxlianhua",
- sub: true,
- trigger: { player: "phaseZhunbeiBegin" },
- //filter:function(event,player){
- // return player.storage.gxlianhua&&player.storage.gxlianhua.red+player.storage.gxlianhua.black>0;
- //},
- content: function () {
- var cards = [];
- var cards2 = [];
- var skill = "";
- var red = player.storage.gxlianhua.red;
- var black = player.storage.gxlianhua.black;
- player.storage.gxlianhua = { red: 0, black: 0 };
- player.unmarkSkill("gxlianhua");
- if (red + black < 4) {
- cards = ["tao"];
- skill = "reyingzi";
- } else if (red > black) {
- cards = ["wuzhong"];
- skill = "reguanxing";
- } else if (red < black) {
- cards = ["shunshou"];
- skill = "xinzhiyan";
- } else {
- cards = ["sha", "juedou"];
- skill = "gongxin";
- }
- for (var i = 0; i < cards.length; i++) {
- var card = get.cardPile(function (shiona) {
- return shiona.name == cards[i];
- });
- if (card) cards2.push(card);
- }
- player.addTempSkills(skill);
- if (cards2.length) player.gain(cards2, "gain2", "log");
- },
- },
- },
- },
- zhafu: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- skillAnimation: true,
- animationColor: "wood",
- filterTarget: lib.filter.notMe,
- content: function () {
- player.awakenSkill("zhafu");
- player.addSkill("zhafu_hf");
- target.addMark("zhafu_hf", 1);
- },
- ai: {
- order: 1,
- result: {
- player: function (player, target) {
- return Math.max(
- 0,
- 1 +
- target.countCards("h") -
- game.countPlayer(current => {
- if (get.attitude(target, current) > 0) return 0.3;
- if (target.hasJudge("lebu")) return 0.6;
- if (target.inRange(current)) return 1.5;
- return 1;
- })
- );
- },
- target: function (player, target) {
- return -Math.max(
- 0,
- 1 +
- target.countCards("h") -
- game.countPlayer(current => {
- if (get.attitude(target, current) > 0) return 0.3;
- if (target.hasJudge("lebu")) return 0.6;
- if (target.inRange(current)) return 1.5;
- return 1;
- })
- );
- },
- },
- },
- subSkill: {
- hf: {
- trigger: {
- global: "phaseDiscardBegin",
- },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- return event.player != player && event.player.hasMark("zhafu_hf");
- },
- content: function () {
- "step 0";
- var target = trigger.player;
- event.target = target;
- target.removeMark("zhafu_hf", 1);
- if (target.countCards("h") <= 1) event.finish();
- "step 1";
- target.chooseCard("h", true, "选择保留一张手牌,将其余的手牌交给" + get.translation(player)).set("ai", get.value);
- "step 2";
- var cards = target.getCards("h");
- cards.remove(result.cards[0]);
- target.give(cards, player);
- },
- intro: {
- content: "mark",
- onunmark: true,
- },
- },
- },
- },
- tuiyan: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- frequent: true,
- content: function () {
- "step 0";
- var cards = get.cards(3);
- event.cards = cards;
- game.log(player, "观看了牌堆顶的" + get.cnNumber(cards.length) + "张牌");
- player.chooseControl("ok").set("dialog", ["推演", cards]);
- "step 1";
- while (cards.length) {
- ui.cardPile.insertBefore(cards.pop(), ui.cardPile.firstChild);
- }
- game.updateRoundNumber();
- },
- },
- busuan: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filterTarget: lib.filter.notMe,
- content: function () {
- "step 0";
- var list = [];
- for (var i = 0; i < lib.inpile.length; i++) {
- var name = lib.inpile[i];
- var type = get.type(name, "trick");
- if (["basic", "trick"].includes(type)) list.push([type, "", name]);
- }
- player.chooseButton(["选择至多两种牌", [list, "vcard"]], true, [1, 2]).set("ai", function (button) {
- var target = _status.event.getParent().target;
- var card = { name: button.link[2] };
- if (get.type(card) == "basic" || !target.hasUseTarget(card)) return false;
- return get.attitude(_status.event.player, target) * (target.getUseValue(card) - 0.1);
- });
- "step 1";
- target.storage.busuan_angelbeats = result.links.slice(0);
- target.addSkill("busuan_angelbeats");
- },
- ai: {
- order: 1,
- result: {
- target: function (player, target) {
- var att = get.attitude(player, target);
- if (att > 0) return 1;
- return -5 / (target.countCards("h") + 1);
- },
- },
- },
- },
- busuan_angelbeats: {
- mark: true,
- intro: {
- mark: function (dialog, content, player) {
- if (content && content.length) dialog.add([content, "vcard"]);
- },
- },
- trigger: { player: "drawBefore" },
- forced: true,
- filter: function (event, player) {
- return event.getParent().name == "phaseDraw";
- },
- onremove: true,
- content: function () {
- "step 0";
- var list = player.storage["busuan_angelbeats"];
- var cards = [];
- for (var i = 0; i < Math.min(trigger.num, list.length); i++) {
- var card = get.cardPile(function (cardx) {
- return !cards.includes(cardx) && cardx.name == list[Math.min(i, list.length - 1)][2];
- });
- if (card) {
- player.storage.busuan_angelbeats.splice(i--, 1);
- trigger.num--;
- cards.push(card);
- }
- }
- if (cards.length) {
- player.gain(cards, "gain2", "log");
- }
- "step 1";
- if (!trigger.num) trigger.cancel();
- if (!player.storage.busuan_angelbeats.length) player.removeSkill("busuan_angelbeats");
- },
- },
- mingjie: {
- audio: 1,
- trigger: { player: "phaseJieshuBegin" },
- check: function () {
- return ui.cardPile.hasChildNodes() && get.color(ui.cardPile.firstChild) != "black";
- },
- content: function () {
- "step 0";
- event.count = 0;
- "step 1";
- player.draw("visible");
- "step 2";
- if (Array.isArray(result)) {
- event.count += result.length;
- if (get.color(result) != "red") {
- if (player.hp > 1) player.loseHp();
- event.finish();
- } else if (event.count < 3)
- player.chooseBool("是否继续发动【命戒】?").ai = function () {
- if (event.count == 2) return Math.random() < 0.5;
- return lib.skill.mingjie.check();
- };
- } else event.finish();
- "step 3";
- if (result.bool) event.goto(1);
- },
- },
- },
- card: {
- //武关羽的兵临城下水淹七军
- shuiyanqijuny: {
- audio: "shuiyanqijun",
- fullskin: true,
- cardimage: "shuiyanqijunx",
- enable: true,
- filterTarget: true,
- type: "trick",
- selectTarget: [1, 2],
- targetprompt: ["受伤弃牌", "受伤摸牌"],
- contentBefore() {
- var evt = event.getParent(),
- target = evt.stocktargets[0];
- evt.shuiyanqijun_target = target;
- },
- content() {
- target.damage("thunder");
- if (target != event.getParent().shuiyanqijun_target) target.draw();
- else target.chooseToDiscard("he", true);
- },
- ai: {
- order: 6,
- value: 4,
- useful: 2,
- tag: {
- damage: 1,
- thunderDamage: 1,
- natureDamage: 1,
- loseCard: 1,
- },
- result: {
- target: function (player, target) {
- if (!ui.selected.targets.length) return -1.5;
- return -0.5;
- },
- },
- },
- },
- pyzhuren_heart: {
- fullskin: true,
- derivation: "puyuan",
- cardcolor: "heart",
- type: "equip",
- subtype: "equip1",
- distance: { attackFrom: -2 },
- skills: ["pyzhuren_heart"],
- onDestroy(card) {
- if (_status.pyzhuren && _status.pyzhuren[card.name]) {
- delete _status.pyzhuren[card.name];
- }
- },
- ai: {
- basic: {
- equipValue: 4,
- },
- },
- },
- pyzhuren_diamond: {
- fullskin: true,
- derivation: "puyuan",
- cardcolor: "diamond",
- type: "equip",
- subtype: "equip1",
- distance: { attackFrom: -1 },
- skills: ["pyzhuren_diamond"],
- onDestroy(card) {
- if (_status.pyzhuren && _status.pyzhuren[card.name]) {
- delete _status.pyzhuren[card.name];
- }
- },
- ai: {
- basic: {
- equipValue: 3,
- },
- },
- },
- pyzhuren_club: {
- fullskin: true,
- derivation: "puyuan",
- cardcolor: "club",
- type: "equip",
- subtype: "equip1",
- distance: { attackFrom: -1 },
- skills: ["pyzhuren_club"],
- onDestroy(card) {
- if (_status.pyzhuren && _status.pyzhuren[card.name]) {
- delete _status.pyzhuren[card.name];
- }
- },
- ai: {
- basic: {
- equipValue: 5,
- },
- },
- loseDelay: false,
- onLose: function () {
- var next = game.createEvent("baiyin_recover");
- event.next.remove(next);
- var evt = event.getParent();
- if (evt.getlx === false) evt = evt.getParent();
- evt.after.push(next);
- next.player = player;
- next.setContent(function () {
- if (player.isDamaged()) player.logSkill("pyzhuren_club");
- player.recover();
- });
- },
- },
- pyzhuren_spade: {
- fullskin: true,
- derivation: "puyuan",
- cardcolor: "spade",
- type: "equip",
- subtype: "equip1",
- skills: ["pyzhuren_spade"],
- onDestroy(card) {
- if (_status.pyzhuren && _status.pyzhuren[card.name]) {
- delete _status.pyzhuren[card.name];
- }
- },
- ai: {
- basic: {
- equipValue: 3,
- },
- },
- },
- pyzhuren_shandian: {
- fullskin: true,
- derivation: "puyuan",
- cardcolor: "spade",
- type: "equip",
- subtype: "equip1",
- distance: { attackFrom: -3 },
- skills: ["pyzhuren_shandian"],
- onDestroy(card) {
- if (_status.pyzhuren && _status.pyzhuren[card.name]) {
- delete _status.pyzhuren[card.name];
- }
- },
- ai: {
- basic: {
- equipValue: 3,
- },
- },
- },
- dagongche: {
- fullskin: true,
- derivation: "zhangfen",
- cardcolor: "spade",
- type: "equip",
- subtype: "equip5",
- skills: ["dagongche_skill"],
- cardPrompt: function (card) {
- if (!card.storage) return "出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。";
- var str = "出牌阶段开始时,你可以视为使用一张";
- if (card.storage.大攻车选项一) str += "无距离限制且无视防具的";
- str += "【杀】";
- if (card.storage.大攻车选项二) str += "(此【杀】的目标上限+" + card.storage.大攻车选项二 + ")";
- str += ",且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其";
- var num = 1;
- if (card.storage.大攻车选项三) num += card.storage.大攻车选项三;
- str += get.cnNumber(num);
- str += "张牌。当此牌离开你的装备区后,销毁之。";
- return str;
- },
- destroy: true,
- ai: {
- basic: {
- equipValue: 3,
- },
- },
- },
- pilitoushiche: {
- fullskin: true,
- derivation: "dc_liuye",
- cardimage: "ly_piliche",
- cardcolor: "diamond",
- type: "equip",
- subtype: "equip5",
- skills: ["pilitoushiche"],
- destroy: true,
- ai: {
- basic: {
- equipValue: 3,
- },
- },
- },
- },
- characterIntro: {
- cuimao: "请分别查看「崔琰」和「毛玠」的武将介绍。",
- bailingyun: "柏灵筠,女,是电视剧《大军师司马懿之军师联盟》、《虎啸龙吟》中的主要角色之一,由张钧甯饰演。20岁,是曹丕赏赐司马懿的美人,也是曹丕的眼线,被送入司马府中为妾室。柔弱美貌、心机极深。",
- caoxian: "曹宪(生卒年不详),女,沛国谯县(今安徽省亳州市)人。东汉末年历史人物,汉献帝刘协嫔妃,魏武帝曹操女儿。建安十八年,嫁给汉献帝刘协,受封为贵人。黄初元年(220年),兄弟曹丕称帝后,汉献帝成为山阳公,不知所终。",
- zhangjian: "张臶(136年-240年),字子明,钜鹿人。汉末三国时期隐士、音乐家,精通谶纬之学。张臶生活的年代从东汉一直到曹魏齐王时期,受到朝廷多次征召,一直回避,不愿做官。他活了一百零五岁,是三国时期有可靠记载的最长寿的人之一。",
- puyuan: "蒲元是三国时蜀汉杰出的工匠。为诸葛亮造刀三千口,并且制作木牛流马。后来姜维为他写过两部传记《蒲元传》《蒲元别传》。",
- guanlu: "管辂(209年-256年),字公明,平原(今山东德州平原县)人。三国时期曹魏术士。年八九岁,便喜仰观星辰。成人后,精通《周易》,善于卜筮、相术,习鸟语,相传每言辄中,出神入化。体性宽大,常以德报怨。正元初,为少府丞。北宋时被追封为平原子。管辂是历史上著名的术士,被后世奉为卜卦观相的祖师。",
- gexuan: "葛玄(164年-244年),汉族,吴丹阳郡句容县都乡吉阳里人(今句容市),祖籍山东琅琊,三国著名高道,道教灵宝派祖师。字孝先,号仙翁,被尊称为“葛天师”。道教尊为葛仙翁,又称太极仙翁,与张道陵、许逊、萨守坚共为四大天师。为汉下邳僮侯葛艾后裔,祖葛矩,安平太守,黄门郎;从祖葛弥,豫章第五郡太守。父葛焉,字德儒,州主簿,山阴令,散骑常侍,大尚书。随左慈学道,得《太清丹经》、《黄帝九鼎神丹经》、《金液丹经》等道经。曾采药海山,吴嘉禾二年(233年),在閤皂山修道建庵,筑坛立炉,修炼九转金丹。喜好遨游山川,去过括苍山、南岳山、罗浮山。编撰《灵宝经诰》,精研上清、灵宝等道家真经,并嘱弟子世世箓传。",
- wulan: "吴兰(?~218年),青州(今山东潍坊市)人。东汉末年将领。初为益州牧刘璋部将,后来归降刘备。汉中之战中,与马超、张飞各领一军,驻扎于下辩。建安二十三年,为曹操将领曹洪、张郃所败,退回汉中。途中,为阴平氐族首领强端所杀。",
- leitong: "雷铜(?-218年),阴平(今甘肃文县)人,氐族,东汉末年益州名将。本属益州牧刘璋麾下。刘备攻取益州后,归刘备麾下。参加汉中之战,为魏将张郃所杀。",
- huaman: "花鬘,古典戏曲《龙凤巾》(一名《化外奇缘》)中的人物,身份为三国时期南蛮王孟获与祝融夫人的女儿,关索的夫人之一。在关于关三小姐·关银屏的民间传说中,其名字为“花中秀”,与关索其他几位夫人鲍三娘、王桃、王悦都被关索之姐关银屏编入自己的女兵营中。花鬘在《三国志》,《三国演义》均未有提及,只是戏曲中的虚构人物。其形象并非一般君主家中闺秀,而是与其母祝融相似,是一个可以披甲上阵,善于刀枪作战的女武将。戏曲中在诸葛亮平定南蛮时,花鬘曾与关索作战,失败被俘,两人互生爱意,南蛮王孟获降服后二人成婚。近些年,花鬘接连在各类三国题材的游戏中登场,更广被人知晓。",
- wangshuang: "王双(?-228年),三国时期曹魏将领。蜀汉建兴六年(228年)冬,诸葛亮出散关,攻陈仓,后粮尽而退。王双率领骑兵追击蜀军,但在与蜀军的交战中被击败,王双也被蜀军所斩。在《三国演义》中,王双字子全,是陇西郡狄道县(今甘肃临洮县)人,有万夫不当之勇。在诸葛亮北伐期间,被魏延所斩。",
- wenyang: "文俶(238年—291年),一作文淑,字次骞,小名阿鸯,世称文鸯,谯郡(今安徽亳州市)人。魏末晋初名将,曹魏扬州刺史文钦之子。骁勇善战,依附大将军曹爽,效忠于王室。司马师废黜皇帝曹芳后,随父联合毌丘俭于淮南起兵勤王。兵败之后,向南投奔吴国。诸葛诞发动淮南叛乱,奉命率军驰援。双方发生内讧,父亲为诸葛诞所害,遂降于司马昭,封关内侯。西晋建立后,任平虏护军。咸宁三年(277年),拜平西将军、都督凉秦雍州三州军事,大破鲜卑首领秃发树机能,名震天下,迁使持节、护东夷校尉、监辽东军事。八王之乱中,为诸葛诞外孙、东安王司马繇所诬杀,惨遭灭族,时年五十四岁。",
- liubian: "刘辩(176年-190年3月6日),是汉灵帝刘宏与何皇后的嫡长子。刘辩在灵帝驾崩后继位为帝,史称少帝,由于年幼,实权掌握在临朝称制的母亲何太后和母舅大将军何进手中。少帝在位时期,东汉政权已经名存实亡,他即位后不久即遭遇以何进为首的外戚集团和以十常侍为首的内廷宦官集团这两大敌对政治集团的火并,被迫出宫,回宫后又受制于以“勤王”为名进京的凉州军阀董卓,终于被废为弘农王,成为东汉唯一被废黜的皇帝,其同父异母弟陈留王刘协继位为帝,是为汉献帝。被废黜一年之后,刘辩在董卓胁迫下自尽,时年仅十五岁(一说十八岁),其弟献帝追谥他为怀王。中国古代的史书中称刘辩为皇子辩、少帝和弘农王等。因为在位不逾年,传统上称东汉共十二帝,刘辩与东汉另一位少帝刘懿都不在其中,亦皆无本纪;不过,现代史学界也有观点承认两位少帝均是汉朝皇帝,则刘辩为东汉第十三位皇帝。",
- guozhao: "郭照,电视剧《军师联盟》中的女主角之一,由唐艺昕饰演。原型为文德皇后郭氏(字女王),魏国皇后,张春华的义妹,深爱曹丕,替甄宓抚育曹叡,因甄宓之死被曹叡记恨,曹丕死后,成为皇太后,被曹叡逼上死路。自尽身亡。",
- fanyufeng: "樊夫人,东汉末年人物,昔桂阳太守赵范寡嫂。赵云随刘备平定江南四郡后,刘备以赵云为桂阳太守。赵范居心叵测,要将自己的嫂嫂樊氏嫁给赵云,但遭到赵云的拒绝。后来,赵范逃走,樊氏也下落不明。2001年,应日本日中青少年文化中心成立50周年之邀,北京京剧院赴日进行40场巡回演出,这次访日的剧目都不同程度地进行了加工改编,以符合日本观众的需求。《取桂阳》是根据老本重新排演的,叶金援饰赵云,王怡饰樊玉凤。剧中的樊玉凤成为文武双全的巾帼英雄,被赵云收降,后来在《龙凤呈祥》中也参与堵截东吴的追兵。",
- ruanyu: "阮瑀(约165—212年),字元瑜,陈留尉氏(今河南开封市尉氏县)人,是东汉末年文学家,建安七子之一。阮瑀所作章表书记很出色,当时军国书檄文字,多为阮瑀与陈琳所拟。名作有《为曹公作书与孙权》。诗有《驾出北郭门行》,描写孤儿受后母虐待的苦难遭遇,比较生动形象。年轻时曾受学于蔡邕,蔡邕称他为“奇才”。后徙为丞相仓曹掾属。诗歌语言朴素,往往能反映出一般的社会问题。阮瑀的音乐修养颇高,他的儿子阮籍,孙子阮咸皆当时名人,位列“竹林七贤”,妙于音律。明人辑有《阮元瑜集》。",
- yangwan: "杨氏(婉字出自小说,史书无记载),生卒年不详,东汉末年凉州人。早年嫁于东汉前将军、槐里侯马腾之子马超,追随马超转战并州、雍州、凉州,为马超生下子嗣。公元212年,马超联军在渭南战败后,杨婉随马超逃亡凉州,很快马超反攻吞并陇上诸郡县。公元213年,杨婉为了帮助马超,结识王异,了解马超这些投降部下。可惜被王异蛊惑,遭致马超大败。自己和孩子都被赵衢、梁宽杀害。",
- zhouyi: "周夷,游卡桌游旗下产品《三国杀》自行杜撰的人物。设定为周瑜的妹妹,和周瑜一同征战。",
- caojinyu: "金乡公主,本姓曹氏,名字不详,沛国谯县(今安徽省亳州市)人。魏武帝曹操的女儿,母为杜夫人。适婚的时候,嫁给曹操的养子何晏。高平陵之变,何晏作为大将军曹爽的党羽,遭到太傅司马懿处死。在何晏母亲尹夫人苦苦哀求下,何晏的儿子得以保全。",
- wufan: "吴范(?-226年),字文则,会稽上虞(今浙江绍兴上虞区)人。三国时期孙吴官员,擅长术数。与刘惇、赵达、严武、曹不兴、皇象、宋寿和郑妪合称“吴中八绝”。吴范以推算天象节气和观察气候闻名于郡中。孙权起于东南,他委身事奉,每推算灾祥多应验,遂显名。孙权委以骑都尉,领太史令。初,孙权为将军时,他曾说江南有王气。及孙权立为吴王,论功行封,欲以为都亭侯,但因不愿将其术要诀告知孙权,为权所怨恨,被除名。黄武中,病死。",
- caomao: "曹髦(241年11月15日-260年6月2日),字彦士,沛国谯县(今安徽省亳州市)人,魏文帝曹丕之孙,东海王曹霖之子,曹魏第四位皇帝(254年11月1日-260年6月2日)。正始二年(241年),生于东海王宫,自幼聪明好学,才慧早成,正始五年(244年),封为高贵乡公,嘉平六年(254年),大将军司马师废除齐王曹芳后,拥立为帝,年号正元,曹髦文才武略,崇拜少康,不满司马氏专权秉政,甘露五年(260年),亲自讨伐司马昭,为太子舍人成济所弑,年仅十九岁,以王礼葬于洛阳西北。曹髦擅长诗文,创制了九言诗,传世文章有《伤魂赋并序》《颜子论》等。爱好儒学,亲赴太学论道,著有《春秋左氏传音》(失传)。精通绘画,一说为中国第一位成为画家的皇帝,唐张彦远《历代名画记》目曹髦为中品。",
- laiyinger: "来莺儿,是个传说中的人物,正史及古代典籍并无记载。相传来莺儿是东汉歌妓,建安年间洛阳名妓,后爱上曹操的侍卫王图,王图因延误军机而押赴刑场,当时来莺儿奋不顾身以己命换王图一死。新编古装潮剧《曹营恋歌》,秦腔《雀台歌女》讲述了歌女来莺儿与情人王图及曹操三人之间催人泪下的故事。",
- caohua: "曹华,东汉末年人物,曹操之女,为汉献帝妃嫔。建安十八年(213年),曹操进为魏公,把曹宪、曹节、曹华三个女儿,一齐都送给汉献帝刘协做了妃子,皆封为夫人,聘以束帛五万匹,年龄尚小者在魏公国待年长而聘。",
- zhaoang: "赵昂,字伟章(一作伟璋),天水冀人。汉末时曹操部下。初为羌道令,建安中转参军事徒居州治冀城。建安十八年,马超围冀城多天,城中饥困,凉州刺史韦康不愿百姓再受苦而打算投降,赵昂进劝但不为所纳。后马超背信弃义杀韦康并劫其子赵月为人质,把他送至南郑。欲以此要迫使赵昂为己所用。后与梁宽、赵衢、庞恭、杨阜等结谋为康报仇,并举兵讨伐马超。马超兵败遂弃城,投奔张鲁。得张鲁之援后马超于建安十九年复寇,赵昂与妻子王异坚守祁山三十天至夏侯渊的救兵解围,其子赵月终为马超斩杀。自冀城之难,至于祁山,赵昂出九奇策。",
- liuhui: "刘徽(约225年—约295年),汉族,山东滨州邹平市人,魏晋期间伟大的数学家,中国古典数学理论的奠基人之一。在中国数学史上作出了极大的贡献,他的杰作《九章算术注》和《海岛算经》,是中国最宝贵的数学遗产。刘徽思想敏捷,方法灵活,既提倡推理又主张直观。他是中国最早明确主张用逻辑推理的方式来论证数学命题的人。刘徽的一生是为数学刻苦探求的一生。他虽然地位低下,但人格高尚。他不是沽名钓誉的庸人,而是学而不厌的伟人,他给我们中华民族留下了宝贵的财富。2021年5月,国际天文学联合会(IAU)批准中国在嫦娥五号降落地点附近月球地貌的命名,刘徽(liuhui)为八个地貌地名之一。",
- zhangfen: "张奋,徐州彭城(今江苏徐州)人。三国时期孙吴将领,辅吴将军张昭的侄子。善于制作攻城器械。在步骘举荐下,担任将军,累迁平州都督,册封乐乡亭侯,病逝于任上。",
- dukui: "杜夔,字公良,河南人,擅长音律,聪明过人。管弦等各种乐器,他无所不能。他长期总管歌舞音乐,精心研究,继承复兴了前代古乐,并有所创新。仕于曹操、曹丕之世,以通晓音乐称于世。早年任雅乐郎,汉中平五年(188年),因病离职。州郡的司徒以礼相请,他因时世混乱而奔荆州。荆州牧刘表的儿子刘琮投降曹操后,曹操以杜夔为军谋祭酒 ,参与太乐署之事,令他创制雅乐。魏文帝曹丕黄初年间,任太乐令、协律都尉。",
- quanhuijie: "全皇后(244年-301年),吴郡钱塘(今浙江杭州)人,吴废帝孙亮的皇后,全尚之女,母孙恭之女。吴大帝长女全公主的侄孙女。赤乌十三年(250年),因全公主推荐全氏被册为孙亮的太子妃,建兴二年(253年),全氏被立为皇后。太平三年(258年),孙亮被权臣孙綝贬为会稽王,全皇后也一同贬为会稽王夫人。永安三年(260年),全皇后随夫到侯官,孙亮在途中死去,全皇后在侯官居住二十余年,吴亡后返回吴郡,永宁元年(301年)去世。",
- dingshangwan: "丁尚涴,又名丁夫人。东汉末年权臣曹操的原配夫人。丁尚涴嫁给曹操时,曹操另有刘夫人,生长子曹昂和清河长公主。后刘夫人早亡,曹昂便由丁尚涴抚养,丁尚涴视其为己出。
建安二年(公元197年),曹昂随军出征宛城,战死沙场。丁尚涴悲痛欲绝,口出怨言数落曹操,又悲啼不止。曹操恼羞成怒,将其打发回了娘家。不久之后,心生悔意的曹操亲自前往丁家,打算将丁尚涴接回。然而丁尚涴却只是闷头织布。曹操手抚其背,说:“顾我共载归乎!”丁尚涴依旧不理不睬。曹操走到门口,又回过头:“得无尚可邪!”然而依旧得不到回应,只得感叹:“真诀矣。”于是与之和离,并让丁家允许她改嫁,丁家不敢为之。
丁尚涴去世后,卞夫人请求曹操安葬她,于是葬在许城以南。后来曹操病重,知道自己时日无多,临终前叹道:“我前后行意,于心未曾有所负也。假令死而有灵,子修若问‘我母所在’,我将何辞以答!”",
- luyi: "卢弈,游卡桌游《三国杀》中虚构的人物。设定为卢植之女。至情至孝。其人虽体弱多病,然而却天资聪颖,有过目不忘、出口成章之才。先后拜蔡邕、王允等人为师,纳诸家之长融会贯通。又善弈棋,曾与当时国手山子道、王九真、郭凯对弈,不分胜负,一时之间名动京华,被太学征辟为女博士,世人皆称其为“女先生”。董卓之乱后,卢弈随父亲隐居乡野,创办上谷学宫,邀天下士子论道。相传诸葛亮、曹植、荀彧、张昭等人都参加过。各学派在卢弈主持下论道,成为一时佳话。后上谷学宫遭曹魏所忌,卢弈为请求曹叡赦免学宫,与司马懿对无棋之弈。卢弈破指凝血,以血为棋,终胜司马懿半子。但却旧伤复发,局终而陨。",
- zhaozhi: "赵直,豫章人,生于公元175年左右,死年不详,字不详。为蜀汉官方占梦者。曾预言蒋琬位极人臣、何祗48岁去世、魏延离死期不远,后果一一应验。",
- dongguiren: "董贵人(?—200年),父董承,汉献帝刘协妃嫔之一。董贵人父亲被曹操所杀,自己也受牵连。董贵人虽有身孕,汉献帝数次为她向曹操求情,仍被杀。",
- zhujianping: "朱建平(生卒年不详),汉末三国时期沛国(今安徽省)人。精通相术,于街巷之间为人相面,效果非常灵验。三国时,他在街头巷尾给人们看相。曹丕做五官将时,请他看相,朱建平说:将军寿命80,40会有小难,愿您多多保护。 又说曹彪:您居于自己的封国,到57当遭兵灾,要好好提防此事。 结果曹丕40去世,曹彪57岁时,犯了与王凌合谋罪,被赐死。他的妙算,都这么准确,即使是唐举,许负也比不上。时人将他与平原郡相士管公明并称为“朱”、“管”。",
- yuanji: "袁氏(生卒年不详),汝南郡汝阳县(今河南商水)人,袁术之女,孙权妃嫔。袁夫人出身世家大族汝南袁氏,其父袁术败亡后,入吴宫拜为夫人,以节操品行着称。",
- chengbing: "程秉(生卒年不详),字德枢,汝南南顿(今河南项城西)人。三国时期吴国官员、儒学家。起初跟随郑玄,后来北方荒乱而到交州避难,期间与刘熙考究五经大义,因此通绕五经。后来交趾太守士燮任命程秉为长史。吴大帝孙权听闻程秉的名声,于是以礼征召他,程秉到后,被任命为太子太傅。黄武四年(225年),孙权为太子孙登娶周瑜之女为妃,程秉以太常身份于吴郡迎候,孙权亲身上程秉的船,可见孙权对他的极为礼待。程秉又教诲孙登对婚后相处要尊重儒家礼教。后来因病在任职期间逝世。著有《周易摘》、《尚书驳》、《论语弼》,凡三万余言。",
- dc_zhouxuān: "周宣,生卒年不详,字孔和,乐安(治今山东高苑西北)人,擅长解梦,在郡做官时曾为太守解过梦,后又给曹丕解梦,都灵验。官至中郎,死于魏明帝末年。",
- xuelingyun: "薛灵芸,东晋王嘉志怪小说《拾遗记》中的人物,魏文帝曹丕的宫人,妙于针工,虽处于深帷之内,不用灯烛之光,裁制立成。凡不是薛灵芸缝制的衣服,文帝一概不穿,宫中号为针神。薛灵芸的故事在正史中虽无记载,却由于许多野史笔记偶尔提及,如《拾遗记》、《太平广记》、《艳异编》等,渐于后世成为中国古代著名美女形象。",
- yanghong: "杨弘,东汉末年袁术部将。袁术死后,杨弘等将其众欲归孙策,后庐江太守刘勋截击,转归于勋。",
- xielingyu: "谢夫人,会稽山阴(今浙江省绍兴市)人,东汉尚书郎、徐令谢煚之女,吴大帝孙权的原配发妻,又称谢妃。深受孙权宠爱,爱幸有宠。后来孙权为了巩固江东政权,又纳徐氏,欲让谢夫人屈居其下。谢夫人不同意,失志早卒。谢夫人的弟弟是三国著名史学家、武陵太守谢承。豫章太守谢斐与谢夫人同宗同族。",
- zerong: "笮融(?—195年),丹杨(治今安徽宣城)人,东汉末年豪强,生性残暴却笃信佛教,为佛教在中国的发展做出了很大贡献。东汉末年投奔徐州刺史陶谦,督管下邳、彭城、广陵三郡运粮。将其中大量物资占为己有累积财力,遂在徐州一带大规模崇佛,修建豪华佛寺,铸造金铜大佛,衣以锦彩,并举行浴佛节,招揽信徒万余人。其崇佛活动奠定了中国大型佛事活动的基础。后又投奔赵昱、薛礼、朱皓并将他们杀害,扬州牧刘繇因此兴兵讨伐笮融。笮融兵败后逃入深山,由于当地山民同样对他恨之入骨,便联手搜捕、杀死笮融,并将他的首级献给刘繇。",
- huanfan: "桓范(?~249年),字元则,沛郡龙亢县(今安徽省怀远县龙亢镇)人。三国时期曹魏大臣、文学家、画家。建安末年,担任丞相府掾,联合王象等共同撰写《皇览》。延康元年,担任羽林左监。魏明帝时,历任中领军、尚书,出任征虏将军、东中郎将、兖州刺史等。正始年间,授大司农,为大将军曹爽出谋划策,号称“智囊 ”。高平陵政变(249年)发生后,力劝曹爽挟带皇帝曹芳进入许昌,没有得到采纳,最终被太傅司马懿诛杀。桓范颇有文才,著有《世要论》(《桓范新书》)。善于画画,唐朝张彦远《历代名画记》目为中品。",
- sunyu: "孙瑜(177年-215年),字仲异,吴郡富春(今浙江富阳)人,孙坚之弟孙静的次子,孙权的堂兄。官至奋威将军、丹杨太守。孙瑜初以恭义校尉的身份统领士兵,曾跟随周瑜、孙权等人征战,擅于安抚部下、招降纳顺。孙瑜爱读古籍,又请学者马普来为将领官员的子弟讲学,于是东吴开始设立学官。215年,孙瑜去世,时年三十九岁。",
- xizheng: "郤正(?-278年),本名郤纂,字令先,司州河南郡偃师县(今河南省偃师市)人,三国蜀汉至西晋时期学者、官员。少好学,广读古籍。弱冠即善写文章,为蜀汉朝廷征为秘书吏,官至秘书令。公元263年(景耀六年),曹魏攻伐蜀汉,后主刘禅投降,郤正为之撰写投降书。后随刘禅前往洛阳,受封关内侯,又得到晋武帝司马炎赏识,任巴西郡太守,公元278年(咸宁四年)去世。郤正为人不重名利,曾作《释讥》,表明自己淡泊之心境;又醉心于文学,共作诗歌、论著、辞赋等近百篇,但多散佚于后世。",
- zhangjinyun: "张瑾云,张星彩的妹妹,刘禅的第二任皇后,238年正月立为皇后。景耀六年(263年),蜀汉灭亡,刘禅被俘,此后,受封为安乐公。张皇后也随之成为安乐公夫人,咸熙元年(264年),随刘禅到洛阳。",
- duanqiaoxiao: "段巧笑,三国时代魏国魏文帝时的宫人,甚受到魏文帝的宠爱。传说她以原有的化妆品中的米粉和胡粉,再加入葵花子汁,发明了女性化妆用的脂粉。",
- ruanji: "阮籍(公元210年~263年),字嗣宗,陈留尉氏(今河南省开封市)人,三国时期魏国诗人、竹林七贤之一。阮瑀之子,门荫入仕,累迁步兵校尉,世称阮步兵。崇奉老庄之学,政治上则采取谨慎避祸的态度。景元四年(公元263年),阮籍去世,享年五十三岁。作为“正始之音”的代表,著有《咏怀八十二首》、《大人先生传》等,其著作收录在《阮籍集》中。",
- ganfurenmifuren: "甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。",
- sunlingluan: "孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。",
- zhoubuyi: "周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。",
- tianshangyi: "田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。",
- malingli: "马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。",
- zhugeruoxue: "诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。",
- zhugemengxue: "诸葛氏(“梦雪”为网络小说虚构),诸葛亮的大姐。",
- caoyi: "曹轶,游卡桌游旗下产品《三国杀》原创角色。设定上为曹纯所收养的孙女,从小受到曹纯的教导,在军营中长大,性情坚毅有担当,军事谋略丰富,战斗能力超强。曹轶喜欢美食,特别是甜食,并且擅长制作各种点心。她身边跟随的雪白小老虎是曹纯在她及笄时送的生辰礼物,希望她如小老虎一样,英勇无畏。曹轶与曹婴交好,两人以姐妹相称。曹轶成年后继承祖父衣钵,接手精锐部队“虎豹骑”,成为新的虎豹骑的统领者。",
- huzun: "胡遵(?~256年),安定临泾(今甘肃省镇原县)人,三国时期曹魏大臣,官至卫将军,封阴密侯。出身安定胡氏。历任征东将军、征东大将军、卫将军等职。早年由张既征辟。后追随司马懿,参与平定匈奴胡薄居姿职叛乱、抵御诸葛亮北伐、平定公孙渊叛乱。嘉平四年(252年),作为曹魏三征之一的征东将军,主持征讨东吴,被诸葛恪击败。正元元年(255年)参与平定淮南三叛的第二叛毌丘俭、文钦之乱,事后升任卫将军。甘露元年(256年)秋七月己卯去世,追赠车骑将军。",
- guanyue: "关樾,传说记载之人物,声称是关羽之孙,关平长子。未见载于正史,仅记载于清朝地方志以及传说。清·《江陵县志》:“娶镇东将军女赵氏。生子樾,世居江陵。”。清·《关氏宗谱·江陵县儒学册结》:“平子樾,因守祖、父陵墓遂家于荆州焉,此荆州之关氏所由来也。”",
- },
- characterTitle: {
- // wulan:'#b对决限定武将',
- // leitong:'#b对决限定武将',
- },
- perfectPair: {},
- characterFilter: {
- // leitong:function(mode){
- // return mode!='identity'&&mode!='guozhan';
- // },
- // wulan:function(mode){
- // return mode!='identity'&&mode!='guozhan';
- // },
- },
- dynamicTranslate: {
- xinlvli: function (player) {
- var str = "每回合限一次";
- if (player.storage.choujue) str += "(自己的回合内则改为限两次)";
- str += ",当你造成";
- if (player.storage.beishui) str += "或受到";
- str += "伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。";
- return str;
- },
- lvli: function (player) {
- var str = "每名角色的回合限一次";
- if (player.storage.choujue) str += "(自己的回合内则改为限两次)";
- str += ",你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)";
- if (player.storage.beishui) str += "。当你受到伤害后,你也可以以此法使用一张牌。";
- return str;
- },
- rezhongjian: function (player) {
- return "出牌阶段限" + (player.hasSkill("recaishi2") ? "两" : "一") + "次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。";
- },
- bazhan: function (player) {
- if (player.storage.bazhan) return '转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到此牌的角色执行一项:①回复1点体力。②复原武将牌。';
- return '转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到此牌的角色执行一项:①回复1点体力。②复原武将牌。';
- },
- zhiren: function (player) {
- return "当你于" + (player.hasSkill("yaner_zhiren") ? "一" : "你的") + "回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)";
- },
- yuqi: function (player) {
- var info = lib.skill.yuqi.getInfo(player);
- return "每回合限两次。当有角色受到伤害后,若你至其的距离不大于" + info[0] + ",则你可以观看牌堆顶的" + info[1] + "张牌。你将其中至多" + info[2] + "张牌交给受伤角色,然后可以获得剩余牌中的至多" + info[3] + "张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)";
- },
- caiyi: function (player) {
- var current = player.storage.caiyi,
- list = player.storage.caiyi_info || [[], []];
- var str = "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。";
- var list1 = ["⒈回复X点体力。", "⒉摸X张牌。", "⒊复原武将牌。", "⒋随机执行一个已经移除过的阴选项;"],
- list2 = ["⒈受到X点伤害。", "⒉弃置X张牌。", "⒊翻面并横置。", "⒋随机执行一个已经移除过的阳选项。"],
- str1 = "阴:",
- str2 = "阳:";
- for (var i = 0; i < 4; i++) {
- var clip1 = list1[i],
- clip2 = list2[i];
- if (list[0].includes(i)) clip1 = '' + clip1 + "";
- if (list[1].includes(i)) clip2 = '' + clip2 + "";
- str1 += clip1;
- str2 += clip2;
- }
- if (current) str2 = '' + str2 + "";
- else str1 = '' + str1 + "";
- return str + str1 + str2 + "(X为该阴阳态剩余选项的数量)。";
- },
- dchuishu: function (player) {
- var list = lib.skill.dchuishu.getList(player);
- return "摸牌阶段结束时,你可以摸[" + list[0] + "]张牌。若如此做:你弃置[" + list[1] + "]张手牌,且当你于本回合内弃置第[" + list[2] + "]+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。";
- },
- dcshoutan: function (player) {
- if (player.storage.dcshoutan) return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。';
- return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。';
- },
- dcluochong: function (player) {
- return "一轮游戏开始时,你可以弃置任意名角色区域里的共计至多[" + (4 - player.countMark("dcluochong")) + "]张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。";
- },
- dczhangcai: function (player) {
- return "当你使用或打出" + (player.hasSkill("dczhangcai_all") ? "" : "点数为8的") + "牌时,你可以摸X张牌(X为你手牌区里" + (player.hasSkill("dczhangcai_all") ? "与此牌点数相同" : "点数为8") + "的牌数且至少为1)。";
- },
- dcsbmengmou: function (player) {
- var storage = player.storage.dcsbmengmou;
- var str = "转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:";
- if (!storage) str += '';
- str += "阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;";
- if (!storage) str += "";
- if (storage) str += '';
- str += "阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。";
- if (storage) str += "";
- str += "(X为你的体力上限,Y为X-其打出【杀】数)";
- return str;
- },
- dcsbyingmou: function (player) {
- var storage = player.storage.dcsbyingmou;
- var str = "转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:";
- if (!storage) str += '';
- str += "阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;";
- if (!storage) str += "";
- if (storage) str += '';
- str += "阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。";
- if (storage) str += "";
- return str;
- },
- dcsbquanmou: function (player) {
- if (player.storage.dcsbquanmou) return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。';
- return '转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。';
- },
- dcshouzhi(player) {
- let skillName = "dcshouzhi";
- if (player.storage.dcshouzhi_modified) skillName += "_modified";
- return lib.translate[`${skillName}_info`];
- },
- },
- characterReplace: {
- wenyang: ["wenyang", "db_wenyang", "diy_wenyang"],
- gexuan: ["gexuan", "tw_gexuan"],
- panshu: ["panshu", "re_panshu"],
- yangwan: ["yangwan", "sp_yangwan"],
- sunyi: ["re_sunyi", "sunyi", "tw_sunyi"],
- fengfangnv: ["fengfangnv", "re_fengfangnv"],
- luotong: ["dc_luotong", "luotong"],
- dc_wangchang: ["dc_wangchang", "tw_wangchang"],
- guozhao: ["guozhao", "xin_guozhao", "jsrg_guozhao"],
- dingshangwan: ["dingshangwan", "ol_dingshangwan"],
- qinghegongzhu: ["qinghegongzhu", "dc_qinghegongzhu"],
- caofang: ["caofang", "jsrg_caofang"],
- caomao: ["caomao", "mb_caomao"],
- sp_zhenji: ["sp_zhenji", "jsrg_zhenji"],
- },
- translate: {
- puyuan: "蒲元",
- pytianjiang: "天匠",
- pytianjiang_info: "游戏开始时,你随机获得两张不同副类别的装备牌,并置入你的装备区。出牌阶段,你可以将装备区的牌移动至其他角色的装备区(可替换原装备)。若你以此法移动了〖铸刃〗的衍生装备,你摸两张牌。",
- pytianjiang_move: "天匠",
- pyzhuren: "铸刃",
- pyzhuren_info: "出牌阶段限一次,你可以弃置一张手牌。根据此牌的花色点数,你有一定概率打造成功并获得一张武器牌(若打造失败或武器已有则改为摸一张【杀】,花色决定武器名称,点数决定成功率)。此武器牌进入弃牌堆时,将其移出游戏。",
- pyzhuren_destroy: "铸刃",
- pyzhuren_heart: "红缎枪",
- pyzhuren_heart_info: "每回合限一次,当你使用【杀】造成伤害后,你可以进行判定,若结果为:红色,你回复1点体力;黑色:你摸两张牌。",
- pyzhuren_diamond: "烈淬刀",
- pyzhuren_diamond_info: "每回合限两次,当你使用【杀】对目标角色造成伤害时,你可以弃置一张牌,令此伤害+1。你使用【杀】的次数上限+1。",
- pyzhuren_club: "水波剑",
- pyzhuren_club_info: "每回合限两次,当你使用普通锦囊牌或【杀】时,你可以为此牌增加一个目标。当你失去装备区里的【水波剑】后,你回复1点体力。",
- pyzhuren_spade: "混毒弯匕",
- pyzhuren_spade_info: "当你使用【杀】指定目标后,你可令其失去X点体力(X为此技能本回合内发动过的次数且至多为5)。",
- pyzhuren_shandian: "天雷刃",
- pyzhuren_shandian_info: "当你使用【杀】指定目标后,可令其进行判定,若结果为:黑桃,其受到3点雷属性伤害;梅花,其受到1点雷属性伤害,你回复1点体力并摸一张牌。",
- guanlu: "管辂",
- tuiyan: "推演",
- tuiyan_info: "出牌阶段开始时,你可以观看牌堆顶的三张牌。",
- busuan: "卜算",
- busuan_info: "出牌阶段限一次,你可以选择一名其他角色,然后选择至多两张不同的卡牌名称(限基本牌或锦囊牌)。该角色下次摸牌阶段摸牌时,改为从牌堆或弃牌堆中获得你选择的牌。",
- busuan_angelbeats: "卜算",
- mingjie: "命戒",
- mingjie_info: "结束阶段,你可以摸一张牌,若此牌为红色,你可以重复此流程直到摸到黑色牌或摸到第三张牌。当你以此法摸到黑色牌时,若你的体力值大于1,则你失去1点体力。",
- gexuan: "葛玄",
- gxlianhua: "炼化",
- gxlianhua_info: "你的回合外,每当有其他角色受到伤害后,你获得一个“丹血”标记(该角色与你阵营一致时为红色,不一致为黑色,此颜色对所有玩家均不可见)直到你的准备阶段开始。准备阶段,根据你获得的“丹血”标记的数量和颜色,你从牌堆/弃牌堆中获得相应的牌以及相应技能直到回合结束。3枚或以下:〖英姿〗和【桃】;超过3枚且红色“丹血”较多:〖观星〗和【无中生有】;超过3枚且黑色“丹血”较多:〖直言〗和【顺手牵羊】;超过3枚且红色和黑色一样多:【杀】、【决斗】和〖攻心〗。",
- zhafu: "札符",
- zhafu_info: "限定技,出牌阶段,你可以选择一名其他角色,令其获得一枚「札」。有「札」的角色弃牌阶段开始时,若其手牌数大于1,其移去「札」并选择保留一张手牌,然后将其余的手牌交给你。",
- leitong: "雷铜",
- kuiji: "溃击",
- kuiji_info: "出牌阶段限一次。你可以将一张黑色基本牌当作【兵粮寸断】置于你的判定区,然后摸一张牌。若如此做,你可以对体力值最多的一名对手造成2点伤害。对手因此进入濒死状态时,你或队友体力值最少的一方回复1点体力。",
- kuiji_info_identity: "出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。",
- kuiji_info_guozhan: "出牌阶段限一次。你可以将一张黑色基本牌当做【兵粮寸断】置于你的判定区,摸一张牌,然后你可以对体力值最多的一名其他角色造成2点伤害。该角色因此进入濒死状态时,你可令一名除其外体力值最少的角色回复1点体力。",
- wulan: "吴兰",
- wlcuorui: "挫锐",
- wlcuorui_info: "出牌阶段开始时,你可以弃置你或队友区域里的一张牌。若如此做,你选择一项:1.弃置对手装备区里至多两张与此牌颜色相同的牌;2.展示对手的共计两张手牌,然后获得其中与此牌颜色相同的牌。",
- wlcuorui_info_identity: "出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。",
- wlcuorui_info_guozhan: "出牌阶段开始时,你可以弃置一名你至其的距离不大于1的角色区域里的一张牌,然后你选择一项:1.弃置另一名其他角色装备区里至多两张与此牌颜色相同的牌;2.展示另一名其他角色的至多两张手牌,然后获得其中与此牌颜色相同的牌。",
- huaman: "花鬘",
- manyi: "蛮裔",
- manyi_info: "锁定技,【南蛮入侵】对你无效。",
- manyi_info_single_normal: "锁定技,【南蛮入侵】对你无效。当你登场时,你可以视为使用一张【南蛮入侵】。",
- mansi_viewas: "蛮嗣",
- mansi: "蛮嗣",
- mansi_info: "出牌阶段限一次,你可以将所有手牌当做【南蛮入侵】使用;当有角色受到【南蛮入侵】的伤害后,你摸一张牌。",
- souying: "薮影",
- souying_info: "每回合限一次,当你对其他角色(或其他角色对你)使用【杀】或普通锦囊牌指定唯一目标后,若此牌不是本回合你对其(或其对你)使用的第一张【杀】或普通锦囊牌,你可以弃置一张牌,获得此牌对应的所有实体牌(或令此牌对你无效)。",
- zhanyuan: "战缘",
- zhanyuan_info: "觉醒技,准备阶段,若你已因蛮嗣累计获得超过七张牌,你加1点体力上限并回复1点体力,并可以选择一名男性角色,你与其获得技能〖系力〗,然后你失去技能〖蛮嗣〗。",
- hmxili: "系力",
- hmxili_info: "每回合限一次,你的回合外,当其他拥有【系力】技能的角色在其回合内对没有【系力】技能的角色造成伤害时,你可以弃置一张牌,令此伤害+1,然后你与其各摸两张牌。",
- wangshuang: "王双",
- spzhuilie: "追猎",
- spzhuilie2: "追猎",
- spzhuilie_info: "锁定技,你使用【杀】无距离限制;当你使用【杀】指定目标后,若其不在你的攻击范围内,此【杀】不计入使用次数限制且你判定。若判定结果为武器牌或坐骑牌,此【杀】的伤害基数改为X(X为其体力值)。否则你失去1点体力。",
- wenyang: "文鸯",
- xinlvli: "膂力",
- xinlvli_info: "每回合限一次,当你造成伤害后,你可选择:1,若你的体力值大于你的手牌数,你摸X张牌;2,若你的手牌数大于你的体力值且你已受伤,你回复X点体力(X为你的手牌数与体力值之差)。",
- lvli: "膂力",
- lvli4: "膂力",
- lvli5: "膂力",
- lvli_info: "每名角色的回合限一次,你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)。",
- choujue: "仇决",
- choujue_info: "觉醒技,一名角色的回合结束时,若你的手牌数和体力值相差3或更多,你减1点体力上限并获得技能〖背水〗,然后将〖膂力〗改为“在自己的回合时每回合限两次”。",
- beishui: "背水",
- beishui_info: "觉醒技,准备阶段,若你的手牌数或体力值小于2,你减1点体力上限并获得技能〖清剿〗,然后将〖膂力〗改为受到伤害后也可以发动。",
- qingjiao: "清剿",
- qingjiao_info: "出牌阶段开始时,你可以弃置所有手牌,然后从牌堆或弃牌堆中随机获得八张牌名各不相同且副类别不同的牌。若如此做,结束阶段,你弃置所有牌。",
- re_liuzan: "留赞",
- refenyin: "奋音",
- refenyin_info: "锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。",
- liji: "力激",
- liji_info: "出牌阶段限X次,你可以弃置一张牌并对一名其他角色造成1点伤害。(X为本回合内进入过弃牌堆的卡牌数除以8,若场上人数小于5则改为除以4,向下取整)",
- liubian: "刘辩",
- shiyuan: "诗怨",
- shiyuan_info: "每回合每项限一次,当你成为其他角色使用牌的目标后:①若其体力值大于你,你摸三张牌。②若其体力值等于你,你摸两张牌。③若其体力值小于你,你摸一张牌。",
- dushi: "毒逝",
- dushi_info: "锁定技,你处于濒死状态时,其他角色不能对你使用【桃】。你死亡时,你选择一名其他角色获得〖毒逝〗。",
- yuwei: "余威",
- yuwei_info: "主公技,锁定技,其他群雄角色的回合内,你将〖诗怨〗改为“每回合每项限两次”。",
- re_xinxianying: "新杀辛宪英",
- re_xinxianying_prefix: "新杀",
- rezhongjian: "忠鉴",
- rezhongjian2: "忠鉴",
- rezhongjian_info: "出牌阶段限一次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。",
- recaishi: "才识",
- recaishi3: "才识",
- recaishi_info: "摸牌阶段结束时,若你于本阶段内因摸牌而获得的所有的牌:花色均相同,你将〖忠鉴〗于本回合内改为“出牌阶段限两次”。不均相同,你可回复1点体力。若如此做,你本回合内不能对自己使用牌。",
- guozhao: "郭照",
- pianchong: "偏宠",
- pianchong2: "偏宠",
- pianchong_info: "摸牌阶段开始时,你可放弃摸牌。若如此做,你从牌堆中获得一张红色牌和一张黑色牌。然后你选择一种颜色。你的下回合开始前,当你失去该颜色的一张牌后,你从牌堆中获得另一种颜色的一张牌。",
- zunwei: "尊位",
- zunwei_backup: "尊位",
- zunwei_info: "出牌阶段限一次,你可选择本局游戏内未选择过的一项:①若你已受伤,则你可以选择一名体力值大于你的其他角色,你将体力值回复至X(X为你的体力上限与其体力值中的较小值)②选择一名手牌数大于你的其他角色,你将手牌数摸至与其相同(至多摸五张)③选择一名装备区内牌数大于你的其他角色。你令X=1。若你装备区内的('equip'+X)栏为空,则你使用牌堆中的一张副类别为('equip'+X),且能对自己使用的装备牌。你令X+1。若X不大于5,且你装备区内的牌数仍小于目标角色,则你重复此流程。",
- fanyufeng: "樊玉凤",
- bazhan: "把盏",
- bazhan_info: "转换技,出牌阶段限一次,阴:你可以将至多两张手牌交给一名其他角色。阳:你可以获得一名其他角色的至多两张手牌。若以此法移动的牌包含【酒】或♥牌,则你可令得到牌的角色执行一项:①回复1点体力。②复原武将牌。",
- jiaoying: "醮影",
- jiaoying2: "醮影",
- jiaoying3: "醮影",
- jiaoying3_draw: "醮影",
- jiaoying_info: "锁定技,其他角色得到你的手牌后,该角色本回合不能使用或打出与此牌颜色相同的牌。然后此回合结束时,若其本回合没有再使用牌,你令一名角色将手牌摸至五张。",
- ruanyu: "阮瑀",
- xingzuo: "兴作",
- xingzuo2: "兴作",
- xingzuo_info: "出牌阶段开始时,你可观看牌堆底的三张牌并用任意张手牌替换其中等量的牌。若如此做,结束阶段,你可令一名有手牌的角色用所有手牌替换牌堆底的三张牌。若其因此法失去的牌多于三张,则你失去1点体力。",
- miaoxian: "妙弦",
- miaoxian_info: "若你的手牌中仅有一张黑色牌,你可将此牌当作任意一张普通锦囊牌使用(每回合限一次);若你的手牌中仅有一张红色牌,你使用此牌时摸一张牌。",
- yangwan: "杨婉",
- youyan: "诱言",
- youyan_info: "出牌阶段/弃牌阶段各限一次。当有牌进入弃牌堆后,若其中有你不因使用或打出而失去的牌,你可以从牌堆中获得你本次失去的牌中没有的花色的牌各一张。",
- zhuihuan: "追还",
- zhuihuan2: "追还",
- zhuihuan2_new: "追还",
- zhuihuan_info: "结束阶段开始时,你可以选择一名角色(对其他角色不可见)。记录所有对该角色造成过伤害的角色。该角色的下个准备阶段开始时停止记录,且所有记录过的角色:若体力值大于该角色,则受到其造成的2点伤害;若体力值小于等于该角色,则随机弃置两张手牌。",
- re_panshu: "潘淑",
- zhiren: "织纴",
- zhiren_info: "当你于你的回合内使用第一张非转化牌时,你可依次执行以下选项中的前X项:①卜算X。②可弃置场上的一张装备牌和延时锦囊牌。③回复1点体力。④摸三张牌。(X为此牌的名称的字数)",
- yaner: "燕尔",
- yaner_info: "每回合限一次。当有其他角色于其出牌阶段内失去手牌后,若其没有手牌,则你可以与其各摸两张牌。若其以此法摸得的两张牌类型相同,则其回复1点体力。若你以此法摸得的两张牌类型相同,则你将〖织纴〗中的“你的回合内”改为“一回合内”直至你下回合开始。",
- zhouyi: "周夷",
- zhukou: "逐寇",
- zhukou_info: "①当你于一名角色的出牌阶段第一次造成伤害后,你可以摸X张牌(X为本回合你已使用的牌数)。②你的结束阶段,若你本回合没有造成伤害,你可以对两名其他角色各造成1点伤害。",
- mengqing: "氓情",
- mengqing_info: "觉醒技。准备阶段,若场上已受伤的角色数大于你的体力值,你加3点体力上限并回复3点体力,失去〖逐寇〗,获得〖玉殒〗。",
- yuyun: "玉殒",
- yuyun_info: "锁定技,出牌阶段开始时,你失去1点体力或体力上限(不能减至1以下),然后选择X+1项(X为你已损失的体力值):①摸两张牌;②对一名其他角色造成1点伤害,然后本回合对其使用【杀】无距离和次数限制;③本回合的手牌上限视为无限;④获得一名其他角色区域内的一张牌;⑤令一名其他角色将手牌摸至体力上限(最多摸至5)。",
- caojinyu: "曹金玉",
- yuqi: "隅泣",
- yuqi_info: "每回合限两次。当有角色受到伤害后,若你至其的距离不大于0,则你可以观看牌堆顶的3张牌。你将其中至多1张牌交给受伤角色,然后可以获得剩余牌中的至多1张牌,并将其余牌以原顺序放回牌堆顶。(所有具有颜色的数字至多为5)",
- shanshen: "善身",
- shanshen_info: "当有角色死亡时,你可令你的〖隅泣〗中的一个具有颜色的数字+2。然后若你未对该角色造成过伤害,则你回复1点体力。",
- xianjing: "娴静",
- xianjing_info: "准备阶段,你可令你的〖隅泣〗中的一个具有颜色的数字+1。若你的体力值等于体力上限,则你可以重复一次此流程。",
- re_sunyi: "孙翊",
- syjiqiao: "激峭",
- syjiqiao_info: "出牌阶段开始时,你可将牌堆顶的X张牌置于你的武将牌上(X为你的体力上限)。当你于此出牌阶段内使用的牌结算结束后,你可以获得其中的一张牌,然后若剩余牌中红色牌和黑色牌的数量:不相等,你失去1点体力;相等,你回复1点体力。出牌阶段结束时,你将这些牌置入弃牌堆。",
- syxiongyi: "凶疑",
- syxiongyi_info: "限定技。当你处于濒死状态时,若剩余武将牌堆中:有“徐氏”,则你可以将体力值回复至3点,并将此武将牌替换为“徐氏”;没有“徐氏”,则你可以将体力值回复至1点并获得〖魂姿〗。",
- re_zhangbao: "新杀张宝",
- re_zhangbao_prefix: "新杀",
- xinzhoufu: "咒缚",
- xinzhoufu2: "咒缚",
- xinzhoufu_info: "出牌阶段限一次。你可以将一张手牌置于一名其他角色的武将牌上并称为“咒”,且当其判定时,将其“咒”作为判定牌。",
- xinyingbing: "影兵",
- xinyingbing_info: "锁定技。每回合每名角色限一次,当你使用牌指定有“咒”的角色为目标后,你摸两张牌。",
- wufan: "吴范",
- tianyun: "天运",
- tianyun_info: "①游戏的第一个回合开始前,你从牌堆中获得手牌区内没有的花色的各一张牌。②一名角色的回合开始时,若其座位号等于游戏轮数,则你可观看牌堆顶的X张牌并以任意顺序置于牌堆顶或牌堆底。若你将所有的牌均置于了牌堆底,则你可以令一名角色摸X张牌,然后失去1点体力。(X为你手牌中包含的花色数)",
- wfyuyan: "预言",
- wfyuyan_info: "一轮游戏开始时,你选择一名角色(对其他角色不可见):当第一次有角色于本轮内进入濒死状态时,若其是你选择的角色,则你获得〖奋音〗直到你的回合结束;当第一次有角色于本轮内造成伤害后,若其是你选择的角色,则你摸两张牌。",
- re_fengfangnv: "冯妤",
- tiqi: "涕泣",
- tiqi_info: "其他角色的摸牌阶段结束时/被跳过时,若其于本阶段内因摸牌而得到的牌数X不等于2,则你可以摸|X-2|张牌,并可令其本回合的手牌上限±|X-2|。",
- baoshu: "宝梳",
- baoshu_info: "①准备阶段,你可选择Y名角色,这些角色重置武将牌并获得(X-Y+1)个“梳”(X为你的体力上限,Y∈[1, X])。②一名角色的摸牌阶段开始时,若其有“梳”,则其本阶段的额定摸牌数+Z且移去Z个“梳”(Z为其“梳”的数量)。",
- dc_luotong: "骆统",
- renzheng: "仁政",
- renzheng_info: "锁定技。当有伤害被防止时,或伤害值发生过减少的伤害事件结算结束后,你摸两张牌。",
- jinjian: "进谏",
- jinjian_info: "①当你造成伤害时,你可令此伤害+1,然后你本回合内下一次造成的伤害-1且不触发〖进谏①〗。②当你受到伤害时,你可令此伤害-1。然后你于本回合内下一次受到的伤害+1且不触发〖进谏②〗。",
- caomao: "曹髦",
- qianlong: "潜龙",
- qianlong_info: "当你受到伤害后,你可以亮出牌堆顶的三张牌并获得其中的至多X张牌(X为你已损失的体力值),然后将剩余的牌置于牌堆底。",
- fensi: "忿肆",
- fensi_info: "锁定技。准备阶段,你须选择一名体力值不小于你的角色并对其造成1点伤害,然后若你选择的角色不为你自己,则其视为对你使用一张【杀】。",
- juetao: "决讨",
- juetao_info: "限定技。出牌阶段开始时,若你的体力值为1,则你可以选择一名其他角色。你亮出牌堆底的一张牌,若此牌能被你使用,则你使用此牌并重复此流程直到出现不可使用的牌或其死亡(你与其以外的角色不是此牌的合法目标)。",
- zhushi: "助势",
- zhushi_info: "主公技。每回合限一次,其他魏势力角色于回合内回复体力时,其可令你摸一张牌。",
- laiyinger: "来莺儿",
- xiaowu: "绡舞",
- xiaowu_info: "出牌阶段限一次,你可以选择任意名座位连续且包含你的上家/下家的其他角色。这些角色依次选择一项:⒈令你摸一张牌;⒉其摸一张牌。然后若选择选项一的角色数大于选项二的角色数,则你获得一枚“沙”;若选择选项二的角色数大于选项一的角色数,则你对这些角色依次造成1点伤害。",
- huaping: "化萍",
- huaping_info: "限定技。①一名其他角色死亡时,你可获得其当前拥有的所有不带有「Charlotte」标签的技能,然后你失去〖绡舞〗,移去所有“沙”并摸等量的牌。②当你死亡时,你可令一名其他角色获得〖沙舞〗和你的所有“沙”。",
- shawu: "沙舞",
- shawu_info: "当你使用【杀】指定目标后,你可选择一项:⒈弃置两张手牌;⒉移去一枚“沙”并摸两张牌。然后你对目标角色造成1点伤害。",
- dc_huangzu: "黄祖",
- dcjinggong: "精弓",
- dcjinggong_info: "你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此杀的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。",
- dcxiaojuan: "骁隽",
- dcxiaojuan_info: "当你使用牌指定其他角色为唯一目标后,你可以弃置其一半的手牌(向下取整)。若这些牌中有与你使用牌花色相同的牌,则你弃置一张手牌。",
- dc_liuyu: "新杀刘虞",
- dc_liuyu_prefix: "新杀",
- dcsuifu: "绥抚",
- dcsuifu_info: "其他角色的结束阶段开始时,若你和一号位本回合内累计受到过的伤害值大于1,则你可以将该角色的所有手牌置于牌堆顶,然后视为使用一张【五谷丰登】。",
- dcpijing: "辟境",
- dcpijing_info: "结束阶段开始时,你可以选择任意名角色。你令所有未选择的角色失去〖自牧〗,然后你和这些角色获得〖自牧〗。",
- dczimu: "自牧",
- dczimu_info: "锁定技。当你受到伤害后,你令所有拥有〖自牧〗的角色各摸一张牌,然后你失去〖自牧〗。",
- caohua: "曹华",
- caiyi: "彩翼",
- caiyi_info: "转换技。结束阶段,你可令一名角色选择并执行一项,然后移除此选项。阴:⒈回复X点体力。⒉摸X张牌,⒊复原武将牌。⒋随机执行一个已经移除过的阴选项;阳:⒈受到X点伤害。⒉弃置X张牌。⒊翻面并横置。⒋随机执行一个已经移除过的阳选项。(X为该阴阳态剩余选项的数量)。",
- guili: "归离",
- guili_info: "你的第一个回合开始时,你须选择一名其他角色。该角色每轮的第一个回合结束后,若其本回合内未造成过伤害,则你执行一个额外的回合。",
- zhaoang: "赵昂",
- dczhongjie: "忠节",
- dczhongjie_info: "每轮限一次。当有角色因失去体力而进入濒死状态时,你可令其回复1点体力并摸一张牌。",
- dcsushou: "夙守",
- dcsushou_tag: "对方手牌",
- dcsushou_info: "一名角色的出牌阶段开始时,若其手牌数为全场唯一最多,则你可以失去1点体力并摸X张牌。然后若该角色不是你,则你可以观看其一半的手牌(向下取整),且用至多X张手牌替换其中等量的牌。(X为你已损失的体力值)",
- dc_wangchang: "王昶",
- dckaiji: "开济",
- dckaiji_info: "转换技。出牌阶段限一次,你可以:阴:摸X张牌;阳:弃置至多X张牌(X为你的体力上限且至多为5)。",
- dcpingxi: "平袭",
- dcpingxi_info: "结束阶段,若X大于0,则你可以选择至多X名其他角色(X为本回合内因弃置而进入弃牌堆的牌数)。你依次弃置这些角色的各一张牌,然后视为对这些角色使用一张【杀】。",
- liuhui: "刘徽",
- dcgeyuan: "割圆",
- dcgeyuan_info: "锁定技。①游戏开始时,你将从A至K的所有整数排列为一个环形链表,称为“圆环之理”。②当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你从“圆环之理”中移除“圆环之弧”记录的第一个和最后一个数字A和B(当“圆环之理”长度不大于3时则不移除),清空“圆环之弧”,获得场上和牌堆中所有点数为A和B的牌。",
- dcjieshu: "解术",
- dcjieshu_info: "锁定技。①所有点数不在“圆环之理”中的牌不计入你的手牌上限。②当你使用牌时,若“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你摸一张牌。",
- dcgusuan: "股算",
- dcgusuan_info: "觉醒技。一名角色的回合结束时,若你的“圆环之理”长度为3,则你减1点体力上限并修改〖割圆〗。",
- dcgeyuan_magica: "割圆·改",
- dcgeyuan_magica_info: "锁定技。当有一张牌进入弃牌堆后,若此牌的点数在“圆环之理”内,且“圆环之弧”为空或此牌的点数与“圆环之弧”两端的点数相邻,则你将此牌的点数记录进“圆环之弧”;然后若“圆环之弧”与“圆环之理”长度相同,则你清空“圆环之弧”并选择至多三名角色,这些角色中的第一名角色摸三张牌,第二名角色弃置四张牌,第三名角色将其手牌与牌堆底的五张牌交换。",
- zhangfen: "张奋",
- dcwanglu: "望橹",
- dcwanglu_info: "锁定技。准备阶段开始时,若你的装备区内:有【大攻车】,则你获得一个额外的出牌阶段;没有【大攻车】,则你将一张【大攻车】置入装备区。",
- dcxianzhu: "陷筑",
- dcxianzhu_info: "当你造成渠道为【杀】伤害后,你可以为你装备区内的【大攻车】选择一项强化(每张【大攻车】最多被强化五次):⒈通过【大攻车】使用【杀】无视距离和防具;⒉通过此【大攻车】使用的【杀】可以额外选择1个目标(可叠加);⒊通过此【大攻车】使用的【杀】造成伤害后的弃置牌数+1(可叠加)。",
- dcchaixie: "拆械",
- dcchaixie_info: "锁定技。当你的【大攻车】被销毁后,你摸X张牌(X为此【大攻车】被强化过的次数)。",
- dagongche: "大攻车",
- dagongche_skill: "大攻车",
- dagongche_info: "出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。",
- dukui: "杜夔",
- dcfanyin: "泛音",
- dcfanyin_info: "出牌阶段开始时,你可以亮出牌堆中点数最小的一张牌。然后你选择一项,并可以亮出一张点数为此牌二倍的牌且重复此流程:⒈使用此牌(无距离限制);⒉你于本回合内使用的下一张基本牌或普通锦囊牌选择目标后,可以增加一个目标。",
- dcpeiqi: "配器",
- dcpeiqi_info: "当你受到伤害后,你可以移动场上的一张牌。然后若场上所有角色均在彼此的攻击范围内,则你可以再移动场上的一张牌。",
- quanhuijie: "全惠解",
- dchuishu: "慧淑",
- dchuishu_info: "摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中随机获得〖慧淑〗第三个括号数字张非基本牌。",
- dcyishu: "易数",
- dcyishu_info: "锁定技。当你不因出牌阶段而失去牌后,你同时令{〖慧淑〗的中括号内最小的一个数字+2}且{〖慧淑〗的中括号内最大的一个数字-1}。",
- dcligong: "离宫",
- dcligong_info: "觉醒技。准备阶段,若〖慧淑〗的中括号内有不小于5的数字,则你加1点体力上限,回复1点体力并失去〖易数〗。系统随机检索四张吴势力的女性武将牌,然后你选择一项:⒈摸三张牌。⒉失去〖慧淑〗,然后获得这些武将牌上的任意两个非Charlotte技能。",
- dingshangwan: "丁尚涴",
- dcfengyan: "讽言",
- dcfengyan_info: "出牌阶段每项各限一次。你可以:⒈令一名体力值不大于你的其他角色交给你一张手牌。⒉视为对一名手牌数不大于你的角色使用一张【杀】(无距离和次数限制)。",
- dcfudao: "抚悼",
- dcfudao_info: "游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用牌的目标后,其本回合内不能再使用牌。",
- luyi: "卢弈",
- dcyaoyi: "邀弈",
- dcyaoyi_info: "锁定技。①游戏开始时,你令所有存活且未拥有转换技的角色获得〖手谈〗。②你发动〖手谈〗时无需弃置牌,且无次数限制。③所有拥有转换技的角色不能使用牌指定其他拥有转换技且双方所有转换技状态均相同的角色为目标。",
- dcfuxue: "复学",
- dcfuxue_info: "①准备阶段,你可以从弃牌堆中选择获得至多X张不因使用而进入弃牌堆的牌。②结束阶段,若你的手牌区中没有因〖复学①〗得到的牌,则你摸X张牌(X为你的体力值)。",
- dcshoutan: "手谈",
- dcshoutan_info: "转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。",
- dc_liuye: "刘晔",
- dcpoyuan: "破垣",
- dcpoyuan_info: "游戏开始时或准备阶段开始时,若你的装备区内:没有【霹雳投石车】,则你可以将一张【霹雳投石车】置入装备区;有【霹雳投石车】,则你可以弃置一名其他角色至多两张牌。",
- dchuace: "画策",
- dchuace_info: "出牌阶段限一次。你可以将一张手牌当做上一轮内未被使用过的普通锦囊牌使用。",
- pilitoushiche: "霹雳投石车",
- pilitoushiche_info: "锁定技。①你于回合内使用基本牌无距离限制,且当你于回合内使用基本牌时,你令此牌的牌面数值+1。②当你于回合外使用或打出基本牌时,你摸一张牌。③当此牌离开你的装备区时,销毁之。",
- zhaozhi: "赵直",
- dctongguan: "统观",
- dctongguan_info: "一名角色的第一个回合开始时,你为其选择一项属性(每个属性至多选两次,且仅对你可见)。",
- dcmengjie: "梦解",
- dcmengjie_info: "一名角色的回合结束时,若其本回合完成了其〖统观〗属性,你执行对应效果:「武勇」造成伤害:对一名其他角色造成1点伤害;「刚硬」回复体力,或于得到牌后手牌数大于体力值:令一名角色回复1点体力;「多谋」于摸牌阶段外摸牌:摸两张牌;「果决」弃置或获得其他角色的牌:弃置一名角色区域内至多两张牌;「仁智」交给其他角色牌:令一名其他角色将手牌补至体力上限(至多摸五张)。",
- dctongguan_wuyong: "武勇",
- dctongguan_wuyong_info: "任务目标:造成伤害。",
- dctongguan_gangying: "刚硬",
- dctongguan_gangying_info: "任务目标:回复体力,或于得到牌后手牌数大于体力值。",
- dctongguan_duomou: "多谋",
- dctongguan_duomou_info: "任务目标:于摸牌阶段外摸牌。",
- dctongguan_guojue: "果决",
- dctongguan_guojue_info: "任务目标:弃置或获得其他角色的牌。",
- dctongguan_renzhi: "仁智",
- dctongguan_renzhi_info: "任务目标:交给其他角色牌。",
- zhujianping: "朱建平",
- olddcxiangmian: "相面",
- olddcxiangmian_info: "其他角色的结束阶段,你可以判定。然后你不能再对其发动此技能,其获得以下效果:当其使用第X张结果的花色的牌后(X为结果的点数),其失去等同于其体力值的体力。",
- dcxiangmian: "相面",
- dcxiangmian_info: "出牌阶段限一次。你可以令一名其他角色判定,然后你不能再对其发动此技能,其获得以下效果:当其使用结果的花色的牌后,或当其使用X张牌后(X为结果的点数),其失去等同于其体力值的体力。",
- dctianji: "天机",
- dctianji_info: "锁定技。当判定牌进入弃牌堆后,你从牌堆随机获得分别与该牌类型、花色和点数相同的牌各一张。",
- yuanji: "袁姬",
- dcmengchi: "蒙斥",
- dcmengchi_info: "锁定技。若你未于当前回合得到过牌:你不能使用牌;当你横置前,取消之;当你受到无属性伤害后,回复1点体力。",
- dcfangdu: "芳妒",
- dcfangdu_info: "锁定技。当你于回合外受到伤害后,若此次伤害为你于本回合受到的:第一次无属性伤害,你回复1点体力;第一次属性伤害,你随机获得伤害来源的一张手牌。",
- dcjiexing: "节行",
- dcjiexing_info: "当你受到伤害后、失去体力后或回复体力后,你可以摸一张牌,且此牌不计入本回合的手牌上限。",
- dongguiren: "董贵人",
- dclianzhi: "连枝",
- dclianzhi_info: "①游戏开始时,你选择一名其他角色(仅你可见)。②每回合限一次。当你进入濒死状态时,若〖连枝①〗角色存活,你回复1点体力并与其各摸一张牌。③当〖连枝①〗角色死亡后,你可以与一名其他角色各获得〖受责〗,且其获得与你拥有的等量枚“绞”标记(至少获得1枚)。",
- dclingfang: "凌芳",
- dclingfang_info: "锁定技。准备阶段,或当其他角色使用黑色牌结算结束后,若你是此牌的目标,或你使用黑色牌结算结束后,若你不是此牌目标,你获得1枚“绞”。",
- dcfengying: "风影",
- dcfengying_info: "①一名角色的回合开始时,你记录弃牌堆中所有黑色基本牌或黑色普通锦囊牌的牌名。②每回合每种牌名各限一次。你可以将一张点数不大于“绞”数的手牌当做任意一张〖风影①〗记录中的牌使用(无距离和次数限制)。",
- dcshouze: "受责",
- dcshouze_info: "锁定技。结束阶段,若你有“绞”,你弃1枚“绞”,随机获得弃牌堆中的一张黑色牌,失去1点体力。",
- chengbing: "程秉",
- dcjingzao: "经造",
- dcjingzao_info: "出牌阶段每名角色限一次,你可以选择一名其他角色并亮出牌堆顶三张牌,其选择一项:1.弃置一张牌名与这些牌的其中一张牌名相同的牌,然后你本回合发动〖经造〗亮出的牌数+1;2.令你随机获得这些牌中每种牌名的牌各一张,然后你本回合发动〖经造〗亮出的牌数-X(X为你获得的牌数)。",
- dcenyu: "恩遇",
- dcenyu_info: "锁定技。当你成为其他角色使用【杀】或普通锦囊牌的目标后,若你本回合成为过此牌名的牌的目标,此牌对你无效。",
- dc_zhouxuān: "周宣",
- dcwumei: "寤寐",
- dcwumei_info: "每轮限一次。回合开始时,你可以令一名角色记录场上所有角色的体力值并进行一个额外的回合,并将你的回合移至该回合后进行。该角色以此法进行的回合的结束阶段,将场上所有角色的体力值改为记录内的对应数值。",
- dczhanmeng: "占梦",
- dczhanmeng_info: "当你使用牌时,你可以选择本回合未选择过的一项:1.上一回合内,若没有同名牌被使用过,你获得一张非伤害牌;2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌;3.令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害。",
- dc_wangyun: "新杀王允",
- dc_wangyun_prefix: "新杀",
- dclianji: "连计",
- dclianji_info: "出牌阶段限一次。你可以弃置一张手牌并选择一名其他角色,其随机使用牌堆中的一张武器牌,然后其选择一项:1.对另一名其他角色使用一张【杀】,并将武器牌交给其中一个目标;2.令你视为对其使用一张【杀】,并将武器牌交给你。",
- dcmoucheng: "谋逞",
- dcmoucheng_info: "觉醒技。准备阶段,若你发动过〖连计〗且两个选项均被选择过,你失去〖连计〗,然后获得〖矜功〗。",
- xuelingyun: "薛灵芸",
- dcxialei: "霞泪",
- dcxialei_info: "当你的红色牌进入弃牌堆后,或当你使用或打出的红色牌经由处理区进入弃牌堆后,你可以观看牌堆顶的三张牌,获得其中的一张牌,且可以将其余牌置于牌堆底。然后你本回合以此法观看的牌数-1。",
- dcanzhi: "暗织",
- dcanzhi_info: "出牌阶段或当你受到伤害后,你可以判定,若结果为红色,你重置〖霞泪〗的观看牌数;若结果为黑色,〖暗织〗于本回合失效,然后你可以令一名非当前回合角色获得本回合进入弃牌堆的两张牌。",
- yanghong: "杨弘",
- dcjianji: "间计",
- dcjianji_info: "出牌阶段限一次。你可以令至多X名座位连续的角色依次弃置一张牌。然后其中手牌数最多的角色可以视为对一名其他以此法弃置过牌的角色使用一张【杀】(X为你的攻击范围)。",
- dcyuanmo: "远谟",
- dcyuanmo_info: "①准备阶段或当你受到伤害后,你可以选择一项:1.攻击范围+1,然后若你攻击范围内的角色数因此增加,你可以获得任意名本次进入你攻击范围的角色各一张牌;2.攻击范围-1,然后摸两张牌。②结束阶段,若你的攻击范围内没有角色,你可以令你的攻击范围+1。",
- dc_yangbiao: "杨彪",
- dczhaohan: "昭汉",
- dczhaohan_info: "摸牌阶段,你可以多摸两张牌,然后你于得到牌后选择一项:1.将两张手牌交给一名没有手牌的角色;2.弃置两张手牌。",
- oldjinjie: "尽节",
- oldjinjie_info: "当一名角色进入濒死状态时,你可以令其摸一张牌。然后若你本轮未进行过回合,你可以弃置X张手牌令其回复1点体力(X为本轮你发动过〖尽节〗的次数)。",
- dcjinjie: "尽节",
- dcjinjie_info: "每轮限一次。当一名角色进入濒死状态时,你可以声明一个整数X(X∈[0,3]),令其摸X张牌,然后你可以弃置X张牌令其回复1点体力(若X为0则跳过摸牌和弃牌的步骤)。",
- oldjue: "举讹",
- oldjue_info: "准备阶段,你可以视为对一名体力值或手牌数大于你的角色使用一张【杀】。",
- dcjue: "举讹",
- dcjue_info: "每轮限一次。一名角色的结束阶段,你可以视为对其随机使用【杀】/【过河拆桥】/【五谷丰登】,直到你以此法使用的牌数不小于Y(Y为本回合因弃置进入弃牌堆的牌数,且至多为其体力上限)。若此时是你的回合,改为你选择一名其他角色。",
- dc_tengfanglan: "滕芳兰",
- dcluochong: "落宠",
- dcluochong_info: "一轮游戏开始时,你可以弃置任意名角色区域里的共计至多[4]张牌,然后若你以此法弃置了一名角色的至少三张牌,则你方括号内的数字-1。",
- dcaichen: "哀尘",
- dcaichen_info: "锁定技。若牌堆剩余数:大于80,当你因〖落宠〗弃置你区域内的牌后,你摸两张牌;大于40,你跳过弃牌阶段;小于40,你不能响应♠牌。",
- xielingyu: "谢灵毓",
- dcyuandi: "元嫡",
- dcyuandi_info: "当其他角色于其出牌阶段使用第一张牌时,若此牌仅指定其为目标,你可以选择一项:1.弃置其一张手牌;2.你与其各摸一张牌。",
- dcxinyou: "心幽",
- dcxinyou_info: "出牌阶段限一次。你可以将体力回复至上限并将手牌补至体力上限。若你以此法:获得了至少三张牌,你于结束阶段失去1点体力;回复了体力,你于结束阶段弃置一张牌。",
- zerong: "笮融",
- dccansi: "残肆",
- dccansi_info: "锁定技。准备阶段,你回复1点体力,然后选择一名其他角色,其回复1点体力,你视为对其依次使用以下能使用的牌:【杀】(无距离限制)、【决斗】、【火攻】。当其以此法受到1点伤害后,你摸两张牌。",
- dcfozong: "佛宗",
- dcfozong_info: "锁定技。出牌阶段开始时,若你的手牌数大于7,你将X张手牌置于武将牌上(X为你的手牌数-7)。然后若你的武将牌上有至少七张牌,其他角色依次选择一项:1.获得其中的一张牌并令你回复1点体力;2.令你失去1点体力。",
- dc_ruiji: "芮姬",
- dcwangyuan: "妄缘",
- dcwangyuan_info: "当你于回合外失去牌后,或于回合内发动〖俐影〗后,你可以随机将牌堆里的一张与你所有“妄”牌名均不同的基本牌或锦囊牌置于武将牌上,称为“妄”(不超过游戏人数)。",
- dclingyin: "铃音",
- // dclingyin_info:'出牌阶段开始时,你可以获得至多X张“妄”(X为游戏轮数)然后若你的“妄”颜色均相同,你于本回合对其他角色造成的伤害+1,且可以将一张武器牌或防具牌当【决斗】使用。',
- dclingyin_info: "出牌阶段开始时,你可以选择至多X张“妄”(X为游戏轮数),若这些牌以外的“妄”中不存在颜色不同的牌,则你于本回合对其他角色造成的伤害+1,且可以将一张武器牌或防具牌当【决斗】使用。你获得这些牌。",
- dcliying: "俐影",
- dcliying_info: "每回合限一次。当你于摸牌阶段外得到牌后,你可以将这些牌中的任意张交给一名其他角色,然后摸一张牌。",
- huanfan: "桓范",
- dcjianzheng: "谏诤",
- dcjianzheng_info: "出牌阶段限一次。你可以观看一名其他角色的手牌,然后若其中有你可以使用的手牌,你获得并使用其中一张。若你以此法使用牌指定了其为目标,你令你与其横置,然后其观看你的手牌。",
- dcfumou: "腹谋",
- dcfumou_info: "当你受到伤害后,你可以令至多X名角色从你开始逆时针依次选择一项:1.移动场上的一张牌;2.弃置所有手牌并摸两张牌;3.弃置装备区里的所有牌并回复1点体力(X为你已损失的体力值)。",
- chentai: "陈泰",
- dcctjiuxian: "救陷",
- dcctjiuxian_info: "出牌阶段限一次。你可以重铸一半数量的手牌(向上取整),然后视为使用一张【决斗】。当此牌对目标角色造成伤害后,你可以令其攻击范围内的一名其他角色回复1点体力。",
- dcchenyong: "沉勇",
- dcchenyong_info: "结束阶段,你可以摸X张牌(X为本回合你使用过的牌的类型数)。",
- sunyu: "孙瑜",
- dcquanshou: "劝守",
- dcquanshou_info: "一名角色的回合开始时,若其手牌数不大于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。",
- dcshexue: "设学",
- dcshexue_info: "①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。",
- xizheng: "郤正",
- dcdanyi: "耽意",
- dcdanyi_info: "当你使用牌指定第一个目标后,你可以摸X张牌(X为此牌目标数与你使用的上一张牌相同的目标数)。",
- dcwencan: "文灿",
- dcwencan_info: "出牌阶段限一次。你可以选择至多两名体力值不同的其他角色,这些角色依次选择一项:1.弃置两张花色不同的牌;2.本回合你对其使用牌无距离和次数限制。",
- zhangjinyun: "张瑾云",
- dchuizhi: "蕙质",
- dchuizhi_info: "准备阶段,你可以选择是否弃置任意张手牌,然后将手牌摸至与全场手牌数最多的角色相同(至少摸一张,至多摸五张)。",
- dcjijiao: "继椒",
- dcjijiao_info: "限定技。出牌阶段,你可以令一名角色获得所有弃牌堆中你于本局游戏内使用或弃置过的普通锦囊牌,且这些牌不能被【无懈可击】响应。一名角色的回合结束后,若本回合牌堆洗过牌或有角色死亡,你重置〖继椒〗。",
- duanqiaoxiao: "段巧笑",
- dccaizhuang: "彩妆",
- dccaizhuang_info: "出牌阶段限一次,你可以弃置任意张牌。然后若你手牌中的花色数小于你以此法弃置的牌的花色数,你摸一张牌并重复此流程。",
- dchuayi: "华衣",
- dchuayi_info: "结束阶段,你可以判定,然后你获得如下效果直到你下回合开始时:红色,一名角色的回合结束时,你摸一张牌;黑色,当你受到伤害后,你摸两张牌。",
- wu_zhugeliang: "武诸葛亮",
- wu_zhugeliang_prefix: "武",
- dcjincui: "尽瘁",
- dcjincui_info: "锁定技。①游戏开始时,你将手牌摸至七张。②准备阶段,你将体力值回复或失去至等同于牌堆中点数为7的牌数(你的体力值最低因此调整至1)。然后你观看牌堆顶X张牌,将这些牌以任意顺序置于牌堆顶或牌堆底(X为你的体力值)。",
- dcqingshi: "情势",
- dcqingshi_info: "当你于出牌阶段使用牌时,若你手牌中有同名牌且你本回合未因此牌名的牌发动过该技能,你可以选择一项:1.令此牌对其中一个目标角色造成的伤害+1;2.令任意名其他角色各摸一张牌;3.摸三张牌,然后〖情势〗于本回合无效。",
- dczhizhe: "智哲",
- dczhizhe_clear: "invisible",
- dczhizhe_info: "限定技。出牌阶段,你可以选择一张手牌并复制之。当你使用或打出此复制牌结算结束后,你获得之,然后你本回合不能再使用或打出此牌。",
- ruanji: "阮籍",
- dczhaowen: "昭文",
- dczhaowen_tag: "昭文",
- dczhaowen_info: "出牌阶段开始时,你可以展示所有手牌。然后你于本回合获得如下效果:1.你可以将其中一张黑色牌当做任意一张普通锦囊牌使用(每回合每种牌名限一次);2.当你使用其中的一张红色牌时,你摸一张牌。",
- dcjiudun: "酒遁",
- dcjiudun_info: "①以你为目标的【酒】(使用方法①)的作用效果改为“目标对应的角色使用的下一张【杀】的伤害基数+1”。②当你成为其他角色使用黑色牌的目标后,若你:未处于【酒】状态,你可以摸一张牌并视为使用一张【酒】;处于【酒】状态,你可以弃置一张手牌令此牌对你无效。",
- ganfurenmifuren: "甘夫人糜夫人",
- dcchanjuan: "婵娟",
- dcchanjuan_info: "每种牌名限两次。当你使用手牌中仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。",
- dcxunbie: "殉别",
- dcxunbie_info: "限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到你的下一个回合结束。",
- dc_mifuren: "糜夫人",
- dcguixiu: "闺秀",
- dcguixiu_info: "锁定技。①回合开始时,若你于本局游戏未发动过〖闺秀①〗,你摸两张牌。②当你发动〖存嗣〗后,你回复1点体力。",
- dccunsi: "存嗣",
- dccunsi_info: "限定技。出牌阶段,你可以令一名角色获得〖勇决〗。若该角色不为你,你摸两张牌。",
- dcyongjue: "勇决",
- dcyongjue_info: "当你于出牌阶段使用第一张【杀】时,你可以选择一项:1.令此【杀】不计入次数;2.获得此牌。",
- dc_ganfuren: "甘夫人",
- dcshushen: "淑慎",
- dcshushen_info: "当你回复1点体力后,你可以选择一名其他角色并选择一项:1.令其回复1点体力;2.你与其各摸一张牌。",
- dcshenzhi: "神智",
- dcshenzhi_info: "准备阶段,若你的手牌数大于体力值,你可以弃置一张手牌,然后回复1点体力。",
- dc_duyu: "杜预",
- dcjianguo: "谏国",
- dcjianguo_info: "出牌阶段各限一次。你可以选择一名角色并选择一项:1.令其摸一张牌,然后其弃置一半的手牌;2.令其弃置一张牌,然后其摸等同于手牌数一半的牌(均向上取整)。",
- dcdyqingshi: "倾势",
- dcdyqingshi_info: "当你于回合内使用【杀】或普通锦囊牌指定第一个目标后,若目标角色包括其他角色且此牌为你本回合使用的第X张牌,你可以对其中一名不为你的目标角色造成1点伤害(X为你的手牌数)。",
- sunlingluan: "孙翎鸾",
- dclingyue: "聆乐",
- dclingyue_info: "锁定技。一名角色于一轮内首次造成伤害后,你摸一张牌。若此时是该角色回合外,则改为摸X张牌(X为本回合全场造成的伤害值)。",
- dcpandi: "盻睇",
- dcpandi_info: "出牌阶段,你可以选择一名本回合内未造成过伤害的角色。你本阶段内使用的下一张牌改为以该角色为基准判断使用目标合法性,且使用者改为该角色。",
- zhoubuyi: "周不疑",
- dcshiji: "十计",
- dcshiji_info: "一名角色的结束阶段,若其本回合未造成过伤害,你可以声明一种本轮未以此法声明过的普通锦囊牌,然后其可以将一张牌当你声明的牌使用(其不是此牌的合法目标)。",
- dcsilun: "四论",
- dcsilun_info: "准备阶段或当你受到伤害后,你可以摸四张牌,然后将四张牌依次置于场上或牌堆两端(对所有角色可见)。装备区牌数因此变化的角色复原其武将牌。",
- dc_wangjun: "王濬",
- dcmianyao: "免徭",
- dcmianyao_info: "摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。",
- dcchangqu: "长驱",
- dcchangqu_info: "出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。",
- dctongye: "统业",
- dctongye_info: "锁定技。游戏开始时或一名角色死亡后,若场上势力数:不大于4,你的手牌上限+3;不大于3,你的攻击范围+3;不大于2,你使用【杀】的次数上限+3;不大于1,你摸牌阶段额定摸牌数+3。",
- tianshangyi: "田尚衣",
- dcposuo: "婆娑",
- dcposuo_info: "出牌阶段,若你本阶段未对其他角色造成过伤害,则你可以将一张你本阶段未以此法使用过的花色的手牌当作任意一张存在于游戏的同花色伤害牌使用。",
- dcxiaoren: "绡刃",
- dcxiaoren_info: "每回合限一次,当你造成伤害后,你可以进行判定,若结果为:红色,你可以令一名角色回复1点体力,然后若其满体力,其摸一张牌;黑色,你对受伤角色的上家或下家造成1点伤害,然后你可以重复此流程直到未能执行此项或有角色进入濒死状态。",
- dc_daxiaoqiao: "新杀大乔小乔",
- dc_daxiaoqiao_prefix: "新杀",
- dcxingwu: "星舞",
- dcxingwu_info: "弃牌阶段开始时,你可以将一张手牌置于武将牌上,称为“星舞”。若你的“星舞”牌达到三张,则你可移去三张“星舞”,弃置一名其他角色装备区里的所有牌,然后对其造成X点伤害(X为移去的“星舞”牌的花色数,若为女性角色则改为1点伤害)。",
- dcluoyan: "落雁",
- dcluoyan_info: "锁定技,若你有“星舞”牌,你视为拥有技能〖天香〗和〖流离〗。",
- dc_xiahouba: "新杀夏侯霸",
- dc_xiahouba_prefix: "新杀",
- old_huangfusong: "新杀皇甫嵩",
- old_huangfusong_prefix: "新杀",
- dc_sp_machao: "群马超",
- dc_sp_machao_prefix: "群",
- dc_shixie: "新杀士燮",
- dc_shixie_prefix: "新杀",
- dc_guansuo: "新杀关索",
- dc_guansuo_prefix: "新杀",
- dc_zhaoxiang: "新杀赵襄",
- dc_zhaoxiang_prefix: "新杀",
- dc_xujing: "许靖",
- dcshangyu: "赏誉",
- dcshangyu_tag: "赏誉",
- dcshangyu_info: "锁定技。游戏开始时,你获得一张【杀】并记录之,并可以将此牌交给一名角色。然后你获得如下效果:1.当一名角色使用此牌造成伤害后,你与其各摸一张牌;2.当此牌进入弃牌堆后,你将此牌交给一名本回合未以此法得到过此牌的角色。",
- dccaixia: "才瑕",
- dccaixia_info: "当你造成或受到伤害后,若你没有“瑕”,你可以摸至多X张牌并获得X枚“瑕”,然后当你使用牌时,移去1枚“瑕”(X为本局游戏总角色数且至多为5)。",
- wu_luxun: "武陆逊",
- wu_luxun_prefix: "武",
- dcxiongmu: "雄幕",
- dcxiongmu_tag: "雄幕",
- dcxiongmu_info: "①一轮游戏开始时,你可以将手牌摸至体力上限(若手牌数不小于体力上限则跳过),然后将任意张牌随机置入牌堆,从牌堆或弃牌堆中获得等量的点数为8的牌,且这些牌不计入手牌上限。②当你于一回合首次受到伤害时,若你的手牌数不大于你的体力值,此伤害-1。",
- dczhangcai: "彰才",
- dczhangcai_info: "当你使用或打出点数为8的牌时,你可以摸X张牌(X为你手牌区里点数为8的牌数且至少为1)。",
- dcruxian: "儒贤",
- dcruxian_info: "限定技。出牌阶段,你可以令你〖彰才〗的点数限制取消,且摸牌数改为等同于你手牌区内与此牌点数相同的牌数且至少为1,直到你的下回合开始。",
- malingli: "马伶俐",
- dclima: "骊马",
- dclima_info: "锁定技。你计算至其他角色的距离-X(X为场上的坐骑牌数且至少为1)。",
- dcxiaoyin: "硝引",
- dcxiaoyin_info: "①准备阶段,你可以亮出牌堆顶的Y张牌(Y为你距离1以内的角色数),获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上,称为“硝引”。②当一名有“硝引”牌的角色受到伤害时,若此伤害为:火焰伤害,来源可以弃置其“硝引”牌包含的类型的牌,将一张对应的“硝引”置入弃牌堆,令此伤害+1;非火焰伤害,来源可以获得一张“硝引”牌,将此伤害改为火焰伤害。",
- dchuahuo: "花火",
- dchuahuo_info: "出牌阶段限一次。你可以将一张红色手牌当不计入次数的火【杀】使用。然后当你使用此牌指定第一个目标后,若目标角色有“硝引”牌,你可以将此【杀】的目标改为所有有“硝引”牌的角色。",
- caoyi: "曹轶",
- dcmiyi: "蜜饴",
- dcmiyi_info: "准备阶段,你可以选择一项:1.回复1点体力;2.受到你造成的1点伤害。然后你令任意名角色执行该项。若如此做,这些角色于结束阶段执行另一项。",
- dcyinjun: "寅君",
- dcyinjun_info: "当你使用对应实体牌均为你的手牌的【杀】或锦囊牌结算结束后,若此牌目标为1,你可以视为对该目标使用一张无伤害来源的【杀】。然后若你本回合发动〖寅君〗的次数大于你的体力值,〖寅君〗失效直到回合结束。",
- zhugeruoxue: "诸葛若雪",
- dcqiongying: "琼英",
- dcqiongying_info: "出牌阶段限一次。你可以移动场上的一张牌,然后你弃置一张与此牌花色相同的手牌(若没有该花色的手牌则改为展示所有手牌)。",
- dcnuanhui: "暖惠",
- dcnuanhui_info: "结束阶段,你可以选择一名装备区有牌的角色,其可以视为依次使用X张基本牌(X为其装备区牌数且至少为1)。若其此次以此法使用了同名牌,其弃置装备区里的所有牌。",
- zhangjian: "张臶",
- dc_zj_a: "技能",
- dc_zj_a_info: "锁定技。当你受到牌造成的伤害时,若此牌有点数,则你将此伤害值改为此牌点数,否则你防止此伤害。",
- dc_zj_b: "技能",
- dc_zj_b_info: "结束阶段,你可以弃置所有牌并令一名其他角色获得〖技能〗直到你的下个回合开始。",
- dc_sb_lusu: "新杀谋鲁肃",
- dc_sb_lusu_prefix: "新杀谋",
- dcsbmingshi: "明势",
- dcsbmingshi_info: "摸牌阶段,你可以多摸两张牌,然后展示三张牌并令一名其他角色选择获得其中的一张牌。",
- dcsbmengmou: "盟谋",
- dcsbmengmou_info: "转换技,每回合每项各限一次,当你得到其他角色的牌后,或其他角色得到你的牌后:阴,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力;阳,你可令该角色打出至多X张【杀】,然后其失去Y点体力。(X为你的体力上限,Y为X-其打出【杀】数)",
- dc_sb_zhouyu: "新杀谋周瑜",
- dc_sb_zhouyu_prefix: "新杀谋",
- dcsbronghuo: "融火",
- dcsbronghuo_info: "锁定技,当你使用火【杀】或【火攻】时,此牌伤害基值改为场上势力数。",
- dcsbyingmou: "英谋",
- dcsbyingmou_info: "转换技,每回合限一次,当你使用牌指定其他角色为目标后,你可以选择一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。",
- caoxian: "曹宪",
- dclingxi: "灵犀",
- dclingxi_info: "出牌阶段开始和结束时,你可以将至多X张牌称为“翼”置于你的武将牌上(X为你的体力上限)。当你失去武将牌上的“翼”时,你将手牌数调整至Y张(Y为你武将牌上的“翼”所含有的花色数的两倍)。",
- dczhifou: "知否",
- dczhifou_info: "当你使用牌结算完毕后,你可以移去至少X张武将牌上的“翼”(X为本回合此前发动此技能的次数+1),然后选择一名角色并选择一项令其执行(每个选项每回合限选择一次):①将一张牌称为“翼”置于你的武将牌上;②弃置两张牌;③失去1点体力。",
- dc_qinghegongzhu: "新杀清河公主",
- dc_qinghegongzhu_prefix: "新杀",
- dczhangji: "长姬",
- dczhangji_info: "锁定技,一名角色使用多目标牌时,若你是此牌的目标之一,则你先结算此牌的效果,然后你摸X张牌(X为此牌的其他目标数)。",
- dczengou: "谮构",
- dczengou_info: "出牌阶段限一次,你可以将至多体力上限张牌称为“谮构”交给一名其他角色并摸等量张牌。若如此做,其下次体力值增加或使用牌结算完毕后,其展示所有手牌,然后失去Y点体力(Y为其手牌中的“谮构”牌数)。",
- bailingyun: "柏灵筠",
- dclinghui: "灵慧",
- dclinghui_info: "一名角色的结束阶段,若当前回合角色为你或本回合有角色进入过濒死状态,则你可以观看牌堆顶的三张牌,然后你可以使用其中一张牌并随机获得其中一张剩余牌。",
- dcxiace: "黠策",
- dcxiace_info: "每回合每项各限一次。当你造成/受到伤害后,你可以弃置一张牌并回复1点体力/令一名其他角色的非锁定技于本回合失效。",
- dcyuxin: "御心",
- dcyuxin_info: "限定技,一名角色进入濒死状态时,你可以令其将体力回复至X点(X为1,若该角色不为你则X为你的体力值)。",
- zhugemengxue: "诸葛梦雪",
- dcjichun: "寄春",
- dcjichun_info: "出牌阶段限一次,你可以展示一张牌并选择一项:①将此牌交给一名手牌数小于你的角色,然后摸X张牌。②弃置此牌并弃置一名手牌数大于你的角色区域里至多X张牌。(X为此牌牌名字数)",
- dchanying: "寒英",
- dchanying_info: "准备阶段,你可以亮出牌堆里的一张非赠物装备牌,然后令一名手牌数等于你的角色使用此牌。",
- huzun: "胡遵",
- dczhantao: "斩涛",
- dczhantao_info: "当你或你攻击范围内的角色受到伤害后,若你不为伤害来源,你可以判定,若造成此伤害的渠道为牌且此牌有点数且判定结果点数大于此牌的点数,你视为对来源使用一张【杀】。",
- dcanjing: "安境",
- dcanjing_info: "每回合限一次。当你造成伤害后,你可以令至多X名已受伤的角色各摸一张牌,然后其中体力值最少的角色回复1点体力(X为你本局游戏发动〖安境〗的次数)。",
- cuimao: "崔琰毛玠",
- zhengbi: "征辟",
- zhengbi_info: "出牌阶段开始时,你可以选择一名其他角色并选择一项:①本阶段结束时,若其本阶段得到过牌,则你获得其手牌区和装备区各一张牌;②将一张基本牌交给该角色,然后其交给你一张非基本牌或两张基本牌。",
- fengying: "奉迎",
- fengying_info: "限定技,出牌阶段,你可以弃置所有手牌。若如此做,你于本回合结束后进行一个额外回合,此额外回合开始时,若你的体力值为全场最低,则你将手牌数摸至体力上限。",
- lvfan: "吕范",
- diaodu: "调度",
- diaodu_info: "出牌阶段开始时,或当你发动〖典财〗后,你可以获得一名距离不大于1的一名角色A装备区里的一张牌,然后你将此牌交给另一名角色B,然后B选择是否使用此牌,若B使用/不使用,则你/B摸一张牌。",
- diancai: "典财",
- diancai_info: "其他角色的出牌阶段结束时,若你于此阶段失去了至少X张牌,则你可以将手牌摸至体力上限(X为你的体力值且X至多为5)。",
- chendong: "陈武董袭",
- dcduanxie: "断绁",
- dcduanxie_info: "出牌阶段限一次,你可以令一名其他角色横置,然后你横置。",
- dc_sb_simayi: "新杀谋司马懿",
- dc_sb_simayi_prefix: "新杀谋",
- dcsbquanmou: "权谋",
- dcsbquanmou_info: "转换技。出牌阶段每名角色限一次,你可以令一名攻击范围内的其他角色交给你一张牌。阴:当你于本阶段内下次对其造成伤害时,取消之;阳:当你于本阶段内下次对其造成伤害后,你可以选择除其外的至多三名其他角色,对这些角色依次造成1点伤害。",
- dcsbpingliao: "平辽",
- dcsbpingliao_info: "锁定技。当你声明使用【杀】时,你令此【杀】的目标对其他角色不可见,且你令攻击范围内的其他角色依次选择是否打出一张红色基本牌。所有角色选择完成后,此牌的目标角色中没有以此法打出牌的角色本回合内无法使用或打出手牌;若有不为此牌目标的角色以此法打出了牌,则你摸两张牌,且你本回合使用【杀】的次数上限+1。",
- caofang: "曹芳",
- dczhimin: "置民",
- dczhimin_tag: "民",
- dczhimin_info: "锁定技。①一轮游戏开始时,你选择至多X名其他角色(X为你的体力值),获得这些角色各自手牌中的随机一张点数最小的牌。②当你于你的回合外得到牌后,你将这些牌标记为“民”。③当你失去“民”后,你将手牌补至体力上限。",
- dcjujian: "拒谏",
- dcjujian_info: "主公技。出牌阶段限一次,你可以令一名其他魏势力角色摸一张牌,然后你令其于本轮内使用的普通锦囊牌对你无效。",
- wu_guanyu: "武关羽",
- wu_guanyu_prefix: "武",
- dcjuewu: "绝武",
- dcjuewu_two: "2点",
- dcjuewu_info: "①每回合每种牌名限一次。你可以将一张点数为2的牌当任意伤害类牌使用(包括【水淹七军】)。②当你得到其他角色区域内的牌后,你令这些牌的点数均视为2直到你失去这些牌。",
- dcwuyou: "武佑",
- dcwuyou_info: "①出牌阶段限一次。你可以选择一张手牌,从系统随机生成的五个非装备牌牌名中选择一个,令此牌的牌名与属性视为与你选择的相同。②其他角色的出牌阶段限一次。其可以交给你一张手牌,你从系统随机生成的五个非装备牌牌名中选择一个,然后可以交给其一张手牌,令此牌的牌名与属性视为与你选择的相同(一名角色使用〖武佑〗转化的牌无距离且无任何次数限制)。",
- dcyixian: "义贤",
- dcyixian_info: "限定技。出牌阶段,你可以选择一项:⒈获得场上的所有装备牌;⒉获得弃牌堆中的所有装备牌。然后你依次选择是否令被你以此法获得牌的角色摸X张牌并回复1点体力(X为其以此法失去的牌数)。",
- shuiyanqijuny: "水淹七军",
- shuiyanqijuny_info: "出牌阶段,对至多两名角色使用。目标角色受到1点雷属性伤害,然后若其:是此牌的使用者选择的第一个目标,其弃置一张牌;不是第一个目标,其摸一张牌。",
- sp_zhenji: "SP甄宓",
- sp_zhenji_prefix: "SP",
- dcjijie: "己诫",
- dcjijie_info: "锁定技。每回合每项各限一次,其他角色于其回合外得到牌后/回复体力后,你摸等量的牌/回复等量的体力。",
- dchuiji: "惠济",
- dchuiji_info: "出牌阶段限一次。你可以令一名角色摸两张牌或从牌堆中随机使用一张不为赠物的装备牌,然后若其手牌数不小于存活角色数,其视为使用一张【五谷丰登】。系统不于此牌使用准备工作结束时执行亮出牌堆顶的牌的动作,改为你令其将所有手牌置于处理区,然后令所有目标角色依次获得其中一张牌。当这些牌因执行【五谷丰登】的执行动作而置于弃牌堆后,你令其获得这些牌。",
- guanyue: "关樾",
- dcshouzhi: "守执",
- dcshouzhi_info: "锁定技。一名角色的回合结束时,若你的手牌数:大于本回合开始时的手牌数,你弃置一张手牌;小于本回合开始时的手牌数,你摸两张牌。",
- dcshouzhi_modified: "守执·改",
- dcshouzhi_modified_info: "一名角色的回合结束时,若你的手牌数:大于本回合开始时的手牌数,你可以弃置一张手牌;小于本回合开始时的手牌数,你可以摸两张牌。",
- dcfenhui: "奋恚",
- dcfenhui_info: "限定技。出牌阶段,你可以令一名角色获得X枚“恨”标记,你摸等量的牌(X为本局游戏你使用黑色牌指定其为目标的次数,至多为5)。你获得如下效果:⒈当你对其造成伤害时,你移去其1枚“恨”,令此伤害+1;⒉当其死亡时,若其有“恨”,你减1点体力上限,修改〖守执〗并获得〖兴门〗。",
- dcxingmen: "兴门",
- dcxingmen_info: "①当你因〖守执〗弃置而失去牌后,你可以回复1点体力。②当你因摸牌而得到牌后,若这些牌均为红色且牌数不小于2,则你使用这些牌时不能被响应。",
-
- sp2_yinyu: "隐山之玉",
- sp2_huben: "百战虎贲",
- sp2_shengun: "奇人异士",
- sp2_huangjia: "皇家贵胄",
- sp2_zhangtai: "章台春望",
- sp2_jinse: "锦瑟良缘",
- sp2_bizhe: "笔舌如椽",
- sp2_wangzhe: "往者可荐",
- sp2_doukou: "豆蔻梢头",
- sp2_jichu: "计将安出",
- sp2_yuxiu: "钟灵毓秀",
- sp2_wumiao: "武庙",
- sp2_gaoshan: "高山仰止",
- sp2_qifu: "祈福",
- sp2_mouding: "谋定天下",
- },
- };
-});
diff --git a/character/xianding/characterFilter.js b/character/xianding/characterFilter.js
index 85add03e9..5b103a2e9 100644
--- a/character/xianding/characterFilter.js
+++ b/character/xianding/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {
// leitong(mode) {
// return mode != "identity" && mode != "guozhan";
diff --git a/character/xinghuoliaoyuan/characterFilter.js b/character/xinghuoliaoyuan/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/xinghuoliaoyuan/characterFilter.js
+++ b/character/xinghuoliaoyuan/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/yijiang/characterFilter.js b/character/yijiang/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/yijiang/characterFilter.js
+++ b/character/yijiang/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/character/yijiang/characterReplace.js b/character/yijiang/characterReplace.js
index 171d751e4..b46b85660 100644
--- a/character/yijiang/characterReplace.js
+++ b/character/yijiang/characterReplace.js
@@ -32,7 +32,7 @@ const characterReplaces = {
chenqun: ["chenqun", "dc_chenqun", "re_chenqun", "old_chenqun"],
hanhaoshihuan: ["hanhaoshihuan", "re_hanhaoshihuan"],
caozhen: ["caozhen", "re_caozhen", "xin_caozhen", "old_caozhen"],
- wuyi: ["wuyi", "re_wuyi", "xin_wuyi"],
+ wuyi: ["wuyi", "re_wuyi", "xin_wuyi", "dc_wuyi"],
sunluban: ["re_sunluban", "xin_sunluban", "sunluban"],
zhuhuan: ["re_zhuhuan", "xin_zhuhuan", "zhuhuan", "old_zhuhuan"],
caoxiu: ["caoxiu", "re_caoxiu", "xin_caoxiu", "tw_caoxiu", "old_caoxiu"],
diff --git a/character/yingbian/characterFilter.js b/character/yingbian/characterFilter.js
index dfc3d193c..6d63d130c 100644
--- a/character/yingbian/characterFilter.js
+++ b/character/yingbian/characterFilter.js
@@ -1,3 +1,5 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
const characterFilters = {};
export default characterFilters;
diff --git a/image/character/dc_wuyi.jpg b/image/character/dc_wuyi.jpg
new file mode 100644
index 000000000..07f2812a8
Binary files /dev/null and b/image/character/dc_wuyi.jpg differ
diff --git a/noname/game/index.js b/noname/game/index.js
index 1661ceb90..13c0d8608 100644
--- a/noname/game/index.js
+++ b/noname/game/index.js
@@ -1450,7 +1450,32 @@ export class Game {
* //如果key中包含发动技能的角色名player,则直接改用info.audioname2[player]来播放语音
* ```
*/
- parseSkillAudio(skill, player, skillInfo, useRawAudio) {
+ parseSkillAudio(skill, player, skillInfo) {
+ return game.parseSkillTextMap(skill, player, skillInfo).map(data => data.file);
+ }
+ /**
+ * 根据skill中的audio,audioname,audioname2和player来获取技能台词列表
+ * @param { string } skill 技能名
+ * @param { Player | Object | string } [player] 角色/角色名
+ * @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo),覆盖lib.skill[skill]
+ * @returns { string[] } 语音地址列表
+ */
+ parseSkillText(skill, player, skillInfo) {
+ const audios = game.parseSkillTextMap(skill, player, skillInfo);
+ const voiceMap = [];
+ audios.forEach(audioname => {
+ if(audioname.text) voiceMap.push(audioname.text);
+ });
+ return voiceMap;
+ }
+ /**
+ * 根据skill中的audio,audioname,audioname2和player来获取技能台词列表及其对应的源文件名
+ * @param { string } skill 技能名
+ * @param { Player | Object | string } [player] 角色/角色名
+ * @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo),覆盖lib.skill[skill]
+ * @returns { any[] } 语音地址列表
+ */
+ parseSkillTextMap(skill, player, skillInfo) {
if (typeof player === "string") player = { name: player };
else if (typeof player !== "object" || player === null) player = {};
@@ -1483,12 +1508,6 @@ export class Game {
);
};
- /**
- * @param {string} skill
- * @param {{audioname:string[],history:string[]}} options
- * @param {skillInfo} [skillInfo]
- * @returns {string[]}
- */
function getAudioList(skill, options, skillInfo) {
const info = skillInfo || lib.skill[skill];
if (!info) {
@@ -1506,12 +1525,6 @@ export class Game {
return parseAudio(skill, options, audioInfo);
}
- /**
- * @param {string} skill
- * @param {{audioname:string[],history:string[]}} options
- * @param {audioInfo} audioInfo info.audio
- * @returns {string[]}
- */
function parseAudio(skill, options, audioInfo) {
const audioname = options.audioname.slice();
const history = options.history.slice();
@@ -1537,57 +1550,36 @@ export class Game {
if (!/^db:|^ext:|\//.test(audioInfo)) path = "skill/";
if (!/\.\w+$/.test(audioInfo) && !["data:", "blob:"].some(name => audioInfo.startsWith(name))) format = ".mp3";
if (path && format) return parseAudio(audioInfo, options, [true, 2]);
- return [useRawAudio ? audioInfo : `${path}${audioInfo}${format}`];
+
+ const key = audioInfo, file = `${path}${audioInfo}${format}`;
+ const data = {key, file};
+ if(lib.translate[`#${key}`]) data.text = lib.translate[`#${key}`];
+ return [data];
}
let _audioname = getName(i => audioname.includes(i));
_audioname = _audioname ? `_${_audioname}` : "";
- if (list[2] === "true") return [`${list[1] || "skill"}/${skill}${_audioname}.${list[3] || "mp3"}`];
+ if (list[2] === "true") {
+ const key = `${skill}${_audioname}`, file = `${list[1] || "skill"}/${skill}${_audioname}.${list[3] || "mp3"}`;
+ const data = {key, file};
+ if(lib.translate[`#${key}`]) data.text = lib.translate[`#${key}`];
+ return [data];
+ }
- const audioList = [];
+ const audioList = []
list[2] = parseInt(list[2]);
for (let i = 1; i <= list[2]; i++) {
- if (useRawAudio) audioList.push(`${skill}${_audioname}${i}`);
- else audioList.push(`${list[1] || "skill"}/${skill}${_audioname}${i}.${list[3] || "mp3"}`);
+ const key = `${skill}${_audioname}${i}`, file = `${list[1] || "skill"}/${skill}${_audioname}${i}.${list[3] || "mp3"}`;
+ const data = {key, file};
+ if(lib.translate[`#${key}`]) data.text = lib.translate[`#${key}`];
+ audioList.push(data);
}
return audioList;
}
return getAudioList(skill, { audioname: [], history: [] }, skillInfo);
}
- /**
- * 根据skill中的audio,audioname,audioname2和player来获取技能台词列表
- * @param { string } skill 技能名
- * @param { Player | Object | string } [player] 角色/角色名
- * @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo),覆盖lib.skill[skill]
- * @returns { string[] } 语音地址列表
- */
- parseSkillText(skill, player, skillInfo) {
- const audios = game.parseSkillAudio(skill, player, skillInfo, true);
- const voiceMap = [];
- audios.forEach(audioname => {
- const voiceText = lib.translate[`#${audioname}`];
- if (voiceText) voiceMap.push(voiceText);
- });
- return voiceMap;
- }
- /**
- * 根据skill中的audio,audioname,audioname2和player来获取技能台词列表及其对应的源文件名
- * @param { string } skill 技能名
- * @param { Player | Object | string } [player] 角色/角色名
- * @param { skillInfo | audioInfo } [skillInfo] 预设的skillInfo/audioInfo(转为skillInfo),覆盖lib.skill[skill]
- * @returns { Object } 语音地址列表
- */
- parseSkillTextMap(skill, player, skillInfo) {
- const audios = game.parseSkillAudio(skill, player, skillInfo, true);
- const voiceMap = {};
- audios.forEach(audioname => {
- const voiceText = lib.translate[`#${audioname}`];
- if (voiceText) voiceMap[audioname] = voiceText;
- });
- return voiceMap;
- }
/**
*
* @param { string } skill