diff --git a/character/huicui/character.js b/character/huicui/character.js index 10f3103d7..ef4a78ab2 100644 --- a/character/huicui/character.js +++ b/character/huicui/character.js @@ -1,12 +1,8 @@ const characters = { dc_sp_zhurong: ["female", "qun", 4, ["dcmanhou"]], - matie: ["male", "qun", 4, ["dczhuiwang", "dcquxian"]], - hansong: ["male", "qun", 3, ["dcyinbi", "dcshuaiyan"]], yue_zhugeguo: ["female", "shu", 3, ["dcxidi", "dcchengyan"]], yue_zoushi: ["female", "qun", 3, ["dcyunzheng", "dchuoxin"]], - zhupeilan: ["female", "wu", 3, ["dccilv", "dctongdao"]], yue_miheng: ["male", "qun", 3, ["dcjigu", "dcsirui"]], - chezhou: ["male", "wei", 4, ["dcshefu", "dcpigua"]], dc_lifeng: ["male", "shu", 3, ["dctunchu", "dcshuliang"]], wupu: ["male", "qun", 4, ["dcduanti", "dcshicao"]], zangba: ["male", "wei", 4, ["rehengjiang"]], diff --git a/character/huicui/skill.js b/character/huicui/skill.js index 7b8d81602..b5f530cc0 100644 --- a/character/huicui/skill.js +++ b/character/huicui/skill.js @@ -143,120 +143,6 @@ const skills = { }, }, }, - //马铁 - dczhuiwang: { - mod: { - globalFrom(from, to) { - if (from.hp >= to.hp) return -Infinity; - }, - }, - }, - dcquxian: { - audio: 2, - trigger: { - player: "phaseUseBegin", - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt("dcquxian"), "选择一名角色,攻击范围内包含其的角色可以对其使用【杀】") - .set("ai", target => { - const player = get.player(); - return -get.attitude(player, target); - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0], - targets = game.filterPlayer(current => current.inRange(target)).sortBySeat(); - if (!targets.length) return; - const sha = [], - nosha = []; - while (targets.length) { - const current = targets.shift(); - const bool = await current - .chooseToUse(function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, "驱险:是否对" + get.translation(target) + "使用一张杀?") - .set("targetRequired", true) - .set("complexSelect", true) - .set("filterTarget", function (card, player, target) { - if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this, arguments); - }) - .set("sourcex", target) - .set("addCount", false) - .forResultBool(); - if (bool) sha.push(current); - else nosha.push(current); - } - if (!target.hasHistory("damage", evt => evt.getParent().type == "card" && evt.getParent(4) == event) && sha.length && nosha.length) { - for (const i of nosha) await i.loseHp(sha.length); - } - }, - }, - //韩嵩 - dcyinbi: { - mod: { - targetInRange(card, player) { - if (!game.hasPlayer(current => current != player && current.countCards("h") == player.countCards("h"))) return true; - }, - cardUsable(card, player) { - if (!game.hasPlayer(current => current != player && current.countCards("h") == player.countCards("h"))) return Infinity; - }, - maxHandcardBase(player) { - if (_status.dcyinbi) return; - _status.dcyinbi = true; - const num = Math.max(...game.filterPlayer().map(target => target.getHandcardLimit())); - delete _status.dcyinbi; - return num; - }, - }, - }, - dcshuaiyan: { - audio: 2, - trigger: { - global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - filter(event, player, name, target) { - return target && target.countCards("h") == player.countCards("h"); - }, - getIndex(event, player) { - return game - .filterPlayer(target => { - if (target == player) return false; - if (event.getg && event.getg(target) && event.getg(target).length && target.countCards("h") == player.countCards("h")) return true; - const evt = event.getl(target); - if (evt && evt.hs && evt.hs.length && target.countCards("h") == player.countCards("h")) return true; - return false; - }) - .sortBySeat(); - }, - logTarget(event, player, triggername, target) { - return target; - }, - forced: true, - async content(event, trigger, player) { - const target = event.targets[0], - goon = target.countDiscardableCards(player, "he"); - let result; - if (goon) - result = await player - .chooseControl() - .set("choiceList", ["弃置" + get.translation(target) + "的一张牌", "摸一张牌"]) - .set("ai", () => { - const player = get.player(); - const eff1 = get.effect(get.event("target"), { name: "guohe_copy2" }, player, player); - const eff2 = get.effect(player, { name: "draw" }, player, player); - return eff1 > eff2 ? 0 : 1; - }) - .set("target", target) - .forResult(); - else result = { index: 1 }; - if (result.index == 0) player.discardPlayerCard(target, "he", true); - else player.draw(); - }, - }, //乐诸葛果 dcxidi: { audio: 2, @@ -492,155 +378,6 @@ const skills = { } }, }, - //朱佩兰 - dccilv: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter(event, player) { - return get.type(event.card) == "trick" && player.getStorage("dccilv").length < 3; - }, - async content(event, trigger, player) { - await player.draw(3 - player.getStorage("dccilv").length); - if (player.countCards("h") > player.maxHp) { - let result, - list = ["无效", "防伤", "获得"].filter(i => !player.getStorage("dccilv").includes(i)); - if (list.length == 1) result = { control: list[0] }; - else - result = await player - .chooseControl(list) - .set("prompt", "辞虑:选择执行并移去一项") - .set("ai", () => { - const player = get.event("player"), - trigger = get.event().getTrigger(); - let controls = get.event("controls").slice(); - if (controls.includes("防伤")) { - if (get.tag(card, "damage")) return "防伤"; - else controls.remove("防伤"); - } - if (get.effect(player, trigger.card, trigger.player, player) < 0 && controls.includes("无效")) return "无效"; - return controls[controls.length - 1]; - }) - .forResult(); - const choice = result.control; - player.popup(choice); - game.log(player, "选择了", "#y" + choice); - switch (choice) { - case "无效": - trigger.getParent().excluded.add(player); - game.log(trigger.card, "对", player, "无效"); - break; - case "防伤": - player.addTempSkill("dccilv_effect"); - player.markAuto("dccilv_effect", [trigger.card]); - break; - case "获得": - player - .when({ global: "useCardAfter" }) - .filter(evt => evt == trigger.getParent()) - .then(() => { - const cards = (trigger.cards || []).filterInD(); - if (cards.length) player.gain(cards, "gain2"); - }); - break; - } - player.markAuto("dccilv", [choice]); - } - }, - mark: true, - intro: { - markcount: storage => 3 - (storage || []).length, - content: storage => ((storage || []).length ? "已移去了$项" : "暂未移去任何项"), - }, - subSkill: { - effect: { - charlotte: true, - trigger: { player: "damageBegin4" }, - filter(event, player) { - const evt = event.getParent(2); - return evt && evt.name == "useCard" && player.getStorage("dccilv_effect").includes(evt.card); - }, - forced: true, - content() { - trigger.cancel(); - }, - ai: { - effect: { - target(card, player, target) { - if (player.getStorage("dccilv_effect").includes(card)) return "zeroplayertarget"; - }, - }, - }, - }, - }, - }, - dctongdao: { - unique: true, - limited: true, - trigger: { player: "dying" }, - skillAnimation: true, - animationColor: "fire", - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt2("dctongdao")) - .set("ai", target => { - const player = get.event("player"); - if (player.hp + player.countCards("hs", card => player.canSaveCard(card, player)) > 0) return target == player ? 1 : 0; - return target.hp + 114514; - }) - .forResult(); - }, - async content(event, trigger, player) { - const target = event.targets[0]; - player.awakenSkill("dctongdao"); - const removeSkills = target.getSkills(null, false, false).filter(i => { - const info = get.info(i); - return !info || !info.charlotte; - }); - if (removeSkills.length) target.removeSkill(removeSkills); - const gainSkills = target.getStockSkills(true, true).filter(i => { - const info = get.info(i); - if (info && info.zhuSkill && !player.isZhu2()) return false; - return !info || !info.charlotte; - }); - if (gainSkills.length) { - //抽象 - //混沌初开——牢戏 - Object.keys(target.storage) - .filter(i => gainSkills.some(skill => i.startsWith(skill))) - .forEach(storage => delete target.storage[storage]); - target.addSkill(gainSkills); - const suffixs = ["used", "round", "block", "blocker"]; - for (const skill of gainSkills) { - const info = get.info(skill); - if (typeof info.usable == "number") { - if (target.hasSkill("counttrigger") && target.storage.counttrigger[skill] && target.storage.counttrigger[skill] >= 1) { - delete target.storage.counttrigger[skill]; - } - if (typeof get.skillCount(skill) == "number" && get.skillCount(skill) >= 1) { - delete target.getStat("skill")[skill]; - } - } - if (info.round && target.storage[skill + "_roundcount"]) { - delete target.storage[skill + "_roundcount"]; - } - if (target.storage[`temp_ban_${skill}`]) { - delete target.storage[`temp_ban_${skill}`]; - } - if (target.awakenedSkills.includes(skill)) { - target.restoreSkill(skill); - } - for (const suffix of suffixs) { - if (target.hasSkill(skill + "_" + suffix)) { - target.removeSkill(skill + "_" + suffix); - } - } - } - } - if (target != player && target.hp > player.hp) { - await player.recoverTo(target.hp); - } - }, - }, //乐祢衡 dcjigu: { audio: 2, @@ -772,90 +509,6 @@ const skills = { backup: { audio: "dcsirui" }, }, }, - //侧肘 - dcshefu: { - audio: 2, - trigger: { - player: "damageBegin2", - source: "damageBegin1", - }, - filter(event, player) { - if (!event.source || event.source == event.player) return false; - const evt = event.getParent(2); - return evt && evt.name == "useCard"; - }, - forced: true, - logTarget(event, player) { - return event.source == player ? event.player : event.source; - }, - content() { - const evt = trigger.getParent(2); - const cards = evt.cards.filter(card => { - if (trigger.source._start_cards.includes(card)) return true; - return trigger.source.getAllHistory("gain", evt => { - return evt.cards.includes(card); - }).length; - }); - trigger.num = - cards.length + - cards.reduce((sum, card) => { - let num = 0, - history = trigger.source.actionHistory; - for (let i = history.length - 1; i >= 0; i--) { - if (history[i].gain.some(evtx => evtx.cards.includes(card))) break; - if (history[i].isRound) num++; - if (i == 0 && trigger.source._start_cards.includes(card)) num--; - } - return sum + num; - }, 0); - }, - ai: { - effect: { - target(card, player, target) { - if (target == player || !get.tag(card, "damage")) return; - if (!(card.cards || []).length) return "zeroplayertarget"; - }, - player: function () { - return lib.skill.dcshefu.ai.effect.target.apply(this, arguments); - }, - }, - }, - }, - dcpigua: { - audio: 2, - trigger: { source: "damageSource" }, - filter(event, player) { - if (event.player == player) return false; - return event.num > 1 && event.player.isIn() && event.player.countCards("he") && game.roundNumber > 0; - }, - async cost(event, trigger, player) { - const target = trigger.player; - let result = await player.gainPlayerCard(target, "he", [1, game.roundNumber]).set("prompt", get.prompt2("dcpigua", target)).set("logSkill", ["dcpigua", target]).forResult(); - result.bool = Boolean((result.cards || []).length); - event.result = result; - }, - popup: false, - async content(event, trigger, player) { - player.addTempSkill("dcpigua_effect"); - player.addGaintag(event.cards, "dcpigua_effect"); - }, - subSkill: { - effect: { - charlotte: true, - onremove(player, skill) { - player.removeGaintag(skill); - }, - mod: { - ignoredHandcard(card) { - if (card.hasGaintag("dcpigua_effect")) return true; - }, - cardDiscardable(card, _, name) { - if (name == "phaseDiscard" && card.hasGaintag("dcpigua_effect")) return false; - }, - }, - }, - }, - }, //李丰 dctunchu: { audio: 2, diff --git a/character/huicui/sort.js b/character/huicui/sort.js index ecb9fd0d6..3a247da76 100644 --- a/character/huicui/sort.js +++ b/character/huicui/sort.js @@ -12,7 +12,7 @@ const characterSort = { sp_raoting: ["dc_huanghao", "dc_sunziliufang", "dc_sunchen", "dc_jiachong"], sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu", "dc_sp_zhurong"], sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao", "yue_miheng", "yue_zoushi", "yue_zhugeguo"], - huicui_waitforsort: ["chezhou", "zhupeilan", "hansong", "matie"], + huicui_waitforsort: [], }; const characterSortTranslate = { diff --git a/character/huicui/translate.js b/character/huicui/translate.js index dc247de37..0b9d2133f 100644 --- a/character/huicui/translate.js +++ b/character/huicui/translate.js @@ -532,22 +532,12 @@ const translates = { dctunchu_info: "锁定技。①游戏开始时,你将手牌数摸至游戏人数的四倍。②你的手牌不能被弃置。③准备阶段,若你的手牌数大于你的体力值,则你本回合至多使用三张牌。", dcshuliang: "输粮", dcshuliang_info: "一名角色的回合结束时,你可以将任意张手牌交给任意名没有手牌的角色各一张,然后本次获得可以指定自己为目标的牌的角色可以依次选择是否使用本次获得的牌。", - chezhou: "车胄", - dcshefu: "慑伏", - dcshefu_info: "锁定技。你对其他角色/其他角色对你使用牌造成的伤害改为X(X为此牌对应的所有实体牌最近一次被伤害来源获得后至现在经过的轮次数之和)。", - dcpigua: "披挂", - dcpigua_info: "当你对一名其他角色造成超过1点伤害后,你可以获得其至多等同于游戏轮次的牌,这些牌本回合不计入你的手牌上限。", yue_miheng: "乐祢衡", yue_miheng_prefix: "乐", dcjigu: "激鼓", dcjigu_info: "锁定技。①游戏开始时,你将所有手牌标记为“激鼓”。②你的“激鼓”牌不计入手牌上限。③每回合限一次,当你造成或受到伤害后,若你的你的“激鼓”牌数等于你的装备区的牌数,则你可以摸X张牌(X为你的空缺装备栏数)。", dcsirui: "思锐", dcsirui_info: "出牌阶段限一次,你可以将一张牌当作与其字数相同的一张基本牌或普通锦囊牌使用。", - zhupeilan: "朱佩兰", - dccilv: "辞虑", - dccilv_info: "当你成为普通锦囊牌的目标后,你可以摸剩余选项数的牌,然后若你的手牌数大于你的体力上限,则你选择执行并移去一项:①令此牌对你无效;②防止此牌对你造成的伤害;③于此牌结算完毕后获得此牌对应的所有实体牌。", - dctongdao: "痛悼", - dctongdao_info: "限定技,当你进入濒死状态时,你可以选择一名角色,令其将其拥有的技能重置至游戏开始时的状态,然后若其不为你,则你将体力值回复至与其相同。", yue_zoushi: "乐邹氏", yue_zoushi_prefix: "乐", dcyunzheng: "韵筝", @@ -562,16 +552,6 @@ const translates = { dcxidi_info: "锁定技。①游戏开始时,你将所有手牌标记为“笛”。②你的“笛”牌不计入手牌上限。③准备阶段,若你的手牌中有“笛”,则你观看牌堆顶X张牌,然后将这些牌以任意顺序置于牌堆顶和牌堆底(X为你手牌中的“笛”数,且X至多为5)。", dcchengyan: "乘烟", dcchengyan_info: "当你于出牌阶段使用【杀】或普通锦囊牌指定其他角色为目标后,你可以亮出牌堆顶的一张牌,若此牌为【杀】或可指定目标的普通锦囊牌,你将此牌对其的结算方式改为此牌牌名的结算方式;若此牌不为【杀】和普通锦囊牌,你获得此牌并将此牌标记为“笛”。", - hansong: "韩嵩", - dcyinbi: "隐避", - dcyinbi_info: "锁定技。①你的手牌上限与场上手牌上限最多的角色相同。②若没有角色手牌数与你相等,你使用牌无距离和次数限制。", - dcshuaiyan: "率言", - dcshuaiyan_info: "锁定技,其他角色手牌数变化后,若与你相等,你弃置其一张牌或摸一张牌。", - matie: "马铁", - dczhuiwang: "追亡", - dczhuiwang_info: "锁定技,你计算体力值小于等于你的角色的距离视为1。", - dcquxian: "驱险", - dcquxian_info: "出牌阶段开始时,你可以选择一名角色,若其在其他角色的攻击范围内,这些角色可依次对其使用一张【杀】。然后若其未以此法受到伤害,未使用【杀】的角色各失去X点体力(X为以此法使用【杀】的角色数量)。", dc_sp_zhurong: "群祝融", dcmanhou: "蛮后", dcmanhou_info: "出牌阶段限一次,你可以摸任意张牌并依次执行以下等量项(至多为4) :1:失去〖探乱〗;2:弃置一张手牌; 3:失去1点体力; 4:弃置一张牌并获得〖探乱〗。", diff --git a/character/sp2/character.js b/character/sp2/character.js index dd5d9d1bf..1c1b51b05 100644 --- a/character/sp2/character.js +++ b/character/sp2/character.js @@ -1,4 +1,7 @@ const characters = { + matie: ["male", "qun", 4, ["dczhuiwang", "dcquxian"]], + hansong: ["male", "qun", 3, ["dcyinbi", "dcshuaiyan"]], + chezhou: ["male", "wei", 4, ["dcshefu", "dcpigua"]], star_zhangzhao: ["male", "wu", 3, ["starzhongyan", "starjinglun"]], star_sunjian: ["male", "qun", "4/5", ["starruijun", "stargangyi"]], liqueguosi: ["male", "qun", 4, ["xiongsuan"]], diff --git a/character/sp2/skill.js b/character/sp2/skill.js index 62db3976e..f5c5b4ccc 100644 --- a/character/sp2/skill.js +++ b/character/sp2/skill.js @@ -2,6 +2,204 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //马铁 + dczhuiwang: { + mod: { + globalFrom(from, to) { + if (from.hp >= to.hp) return -Infinity; + }, + }, + }, + dcquxian: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("dcquxian"), "选择一名角色,攻击范围内包含其的角色可以对其使用【杀】") + .set("ai", target => { + const player = get.player(); + return -get.attitude(player, target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + targets = game.filterPlayer(current => current.inRange(target)).sortBySeat(); + if (!targets.length) return; + const sha = [], + nosha = []; + while (targets.length) { + const current = targets.shift(); + const bool = await current + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "驱险:是否对" + get.translation(target) + "使用一张杀?") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target) + .set("addCount", false) + .forResultBool(); + if (bool) sha.push(current); + else nosha.push(current); + } + if (!target.hasHistory("damage", evt => evt.getParent().type == "card" && evt.getParent(4) == event) && sha.length && nosha.length) { + for (const i of nosha) await i.loseHp(sha.length); + } + }, + }, + //韩嵩 + dcyinbi: { + mod: { + targetInRange(card, player) { + if (!game.hasPlayer(current => current != player && current.countCards("h") == player.countCards("h"))) return true; + }, + cardUsable(card, player) { + if (!game.hasPlayer(current => current != player && current.countCards("h") == player.countCards("h"))) return Infinity; + }, + maxHandcardBase(player) { + if (_status.dcyinbi) return; + _status.dcyinbi = true; + const num = Math.max(...game.filterPlayer().map(target => target.getHandcardLimit())); + delete _status.dcyinbi; + return num; + }, + }, + }, + dcshuaiyan: { + audio: 2, + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player, name, target) { + return target && target.countCards("h") == player.countCards("h"); + }, + getIndex(event, player) { + return game + .filterPlayer(target => { + if (target == player) return false; + if (event.getg && event.getg(target) && event.getg(target).length && target.countCards("h") == player.countCards("h")) return true; + const evt = event.getl(target); + if (evt && evt.hs && evt.hs.length && target.countCards("h") == player.countCards("h")) return true; + return false; + }) + .sortBySeat(); + }, + logTarget(event, player, triggername, target) { + return target; + }, + forced: true, + async content(event, trigger, player) { + const target = event.targets[0], + goon = target.countDiscardableCards(player, "he"); + let result; + if (goon) + result = await player + .chooseControl() + .set("choiceList", ["弃置" + get.translation(target) + "的一张牌", "摸一张牌"]) + .set("ai", () => { + const player = get.player(); + const eff1 = get.effect(get.event("target"), { name: "guohe_copy2" }, player, player); + const eff2 = get.effect(player, { name: "draw" }, player, player); + return eff1 > eff2 ? 0 : 1; + }) + .set("target", target) + .forResult(); + else result = { index: 1 }; + if (result.index == 0) player.discardPlayerCard(target, "he", true); + else player.draw(); + }, + }, + //侧肘 + dcshefu: { + audio: 2, + trigger: { + player: "damageBegin2", + source: "damageBegin1", + }, + filter(event, player) { + if (!event.source || event.source == event.player) return false; + const evt = event.getParent(2); + return evt && evt.name == "useCard"; + }, + forced: true, + logTarget(event, player) { + return event.source == player ? event.player : event.source; + }, + content() { + const evt = trigger.getParent(2); + const cards = evt.cards.filter(card => { + if (trigger.source._start_cards.includes(card)) return true; + return trigger.source.getAllHistory("gain", evt => { + return evt.cards.includes(card); + }).length; + }); + trigger.num = + cards.length + + cards.reduce((sum, card) => { + let num = 0, + history = trigger.source.actionHistory; + for (let i = history.length - 1; i >= 0; i--) { + if (history[i].gain.some(evtx => evtx.cards.includes(card))) break; + if (history[i].isRound) num++; + if (i == 0 && trigger.source._start_cards.includes(card)) num--; + } + return sum + num; + }, 0); + }, + ai: { + effect: { + target(card, player, target) { + if (target == player || !get.tag(card, "damage")) return; + if (!(card.cards || []).length) return "zeroplayertarget"; + }, + player: function () { + return lib.skill.dcshefu.ai.effect.target.apply(this, arguments); + }, + }, + }, + }, + dcpigua: { + audio: 2, + trigger: { source: "damageSource" }, + filter(event, player) { + if (event.player == player) return false; + return event.num > 1 && event.player.isIn() && event.player.countCards("he") && game.roundNumber > 0; + }, + async cost(event, trigger, player) { + const target = trigger.player; + let result = await player.gainPlayerCard(target, "he", [1, game.roundNumber]).set("prompt", get.prompt2("dcpigua", target)).set("logSkill", ["dcpigua", target]).forResult(); + result.bool = Boolean((result.cards || []).length); + event.result = result; + }, + popup: false, + async content(event, trigger, player) { + player.addTempSkill("dcpigua_effect"); + player.addGaintag(event.cards, "dcpigua_effect"); + }, + subSkill: { + effect: { + charlotte: true, + onremove(player, skill) { + player.removeGaintag(skill); + }, + mod: { + ignoredHandcard(card) { + if (card.hasGaintag("dcpigua_effect")) return true; + }, + cardDiscardable(card, _, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcpigua_effect")) return false; + }, + }, + }, + }, + }, //星张昭 starzhongyan: { audio: 2, diff --git a/character/sp2/sort.js b/character/sp2/sort.js index 5a5aa0f57..65d8f07e3 100644 --- a/character/sp2/sort.js +++ b/character/sp2/sort.js @@ -14,6 +14,7 @@ const characterSort = { sp_xuzhou: ["re_taoqian", "caosong", "zhangmiao", "qiuliju"], sp_zhongyuan: ["re_hucheer", "re_zoushi", "caoanmin", "re_dongcheng"], sp_xiaohu: ["haomeng", "yanfuren", "yanrou", "dc_zhuling"], + sp_qunxiong: ["chezhou", "hansong", "matie"], sp_star: ["star_caoren", "star_yuanshu", "star_dongzhuo", "star_yuanshao", "star_zhangchunhua", "star_sunjian", "star_zhangzhao"], mini_qixian: ["mp_liuling"], sp2_waitforsort: ["caobuxing", "re_maliang", "dc_jikang"], @@ -34,6 +35,7 @@ const characterSortTranslate = { sp_zhongyuan: "列传·中原狼烟", sp_binglin: "兵临城下", sp_xiaohu: "列传·虓虎悲歌", + sp_qunxiong: "列传·群雄伺动", sp_fenghuo: "烽火连天", sp_danqi: "千里单骑", sp_star: "将星系列", diff --git a/character/sp2/translate.js b/character/sp2/translate.js index b13b64090..fd63ebc6c 100644 --- a/character/sp2/translate.js +++ b/character/sp2/translate.js @@ -586,6 +586,21 @@ const translates = { starzhongyan_info: "出牌阶段限一次,你可展示牌堆顶三张牌,然后令一名角色将一张手牌与其中一张牌交换。然后若这些牌颜色相同,其回复1点体力或获得场上一张牌。然后若该角色不为你,你执行其未执行的一项。", starjinglun: "经纶", starjinglun_info: "每回合限一次,当你距离1以内的角色造成伤害后,你可以令其摸X张牌并对其发动〖忠言〗(X为其装备区的牌数)。", + chezhou: "车胄", + dcshefu: "慑伏", + dcshefu_info: "锁定技。你对其他角色/其他角色对你使用牌造成的伤害改为X(X为此牌对应的所有实体牌最近一次被伤害来源获得后至现在经过的轮次数之和)。", + dcpigua: "披挂", + dcpigua_info: "当你对一名其他角色造成超过1点伤害后,你可以获得其至多等同于游戏轮次的牌,这些牌本回合不计入你的手牌上限。", + hansong: "韩嵩", + dcyinbi: "隐避", + dcyinbi_info: "锁定技。①你的手牌上限与场上手牌上限最多的角色相同。②若没有角色手牌数与你相等,你使用牌无距离和次数限制。", + dcshuaiyan: "率言", + dcshuaiyan_info: "锁定技,其他角色手牌数变化后,若与你相等,你弃置其一张牌或摸一张牌。", + matie: "马铁", + dczhuiwang: "追亡", + dczhuiwang_info: "锁定技,你计算体力值小于等于你的角色的距离视为1。", + dcquxian: "驱险", + dcquxian_info: "出牌阶段开始时,你可以选择一名角色,若其在其他角色的攻击范围内,这些角色可依次对其使用一张【杀】。然后若其未以此法受到伤害,未使用【杀】的角色各失去X点体力(X为以此法使用【杀】的角色数量)。", }; export default translates; diff --git a/character/xianding/character.js b/character/xianding/character.js index c45ebd0cb..236943271 100644 --- a/character/xianding/character.js +++ b/character/xianding/character.js @@ -1,4 +1,5 @@ const characters = { + zhupeilan: ["female", "wu", 3, ["dccilv", "dctongdao"]], dc_sb_zhangxiu: ["male", "qun", 4, ["dcsbfuxi", "dcsbhaoyi"]], dc_sb_guanping: ["male", "shu", 4, ["dcsbwuwei"]], dc_sb_caoang: ["male", "wei", 4, ["dcsbfengmin", "dcsbzhiwang", "dcsbjueying"]], diff --git a/character/xianding/skill.js b/character/xianding/skill.js index 4ae39c393..b82a050d2 100644 --- a/character/xianding/skill.js +++ b/character/xianding/skill.js @@ -3,6 +3,155 @@ import cards from "../sp2/card.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //朱佩兰 + dccilv: { + audio: 2, + trigger: { target: "useCardToTargeted" }, + filter(event, player) { + return get.type(event.card) == "trick" && player.getStorage("dccilv").length < 3; + }, + async content(event, trigger, player) { + await player.draw(3 - player.getStorage("dccilv").length); + if (player.countCards("h") > player.maxHp) { + let result, + list = ["无效", "防伤", "获得"].filter(i => !player.getStorage("dccilv").includes(i)); + if (list.length == 1) result = { control: list[0] }; + else + result = await player + .chooseControl(list) + .set("prompt", "辞虑:选择执行并移去一项") + .set("ai", () => { + const player = get.event("player"), + trigger = get.event().getTrigger(); + let controls = get.event("controls").slice(); + if (controls.includes("防伤")) { + if (get.tag(card, "damage")) return "防伤"; + else controls.remove("防伤"); + } + if (get.effect(player, trigger.card, trigger.player, player) < 0 && controls.includes("无效")) return "无效"; + return controls[controls.length - 1]; + }) + .forResult(); + const choice = result.control; + player.popup(choice); + game.log(player, "选择了", "#y" + choice); + switch (choice) { + case "无效": + trigger.getParent().excluded.add(player); + game.log(trigger.card, "对", player, "无效"); + break; + case "防伤": + player.addTempSkill("dccilv_effect"); + player.markAuto("dccilv_effect", [trigger.card]); + break; + case "获得": + player + .when({ global: "useCardAfter" }) + .filter(evt => evt == trigger.getParent()) + .then(() => { + const cards = (trigger.cards || []).filterInD(); + if (cards.length) player.gain(cards, "gain2"); + }); + break; + } + player.markAuto("dccilv", [choice]); + } + }, + mark: true, + intro: { + markcount: storage => 3 - (storage || []).length, + content: storage => ((storage || []).length ? "已移去了$项" : "暂未移去任何项"), + }, + subSkill: { + effect: { + charlotte: true, + trigger: { player: "damageBegin4" }, + filter(event, player) { + const evt = event.getParent(2); + return evt && evt.name == "useCard" && player.getStorage("dccilv_effect").includes(evt.card); + }, + forced: true, + content() { + trigger.cancel(); + }, + ai: { + effect: { + target(card, player, target) { + if (player.getStorage("dccilv_effect").includes(card)) return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + dctongdao: { + unique: true, + limited: true, + trigger: { player: "dying" }, + skillAnimation: true, + animationColor: "fire", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("dctongdao")) + .set("ai", target => { + const player = get.event("player"); + if (player.hp + player.countCards("hs", card => player.canSaveCard(card, player)) > 0) return target == player ? 1 : 0; + return target.hp + 114514; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + player.awakenSkill("dctongdao"); + const removeSkills = target.getSkills(null, false, false).filter(i => { + const info = get.info(i); + return !info || !info.charlotte; + }); + if (removeSkills.length) target.removeSkill(removeSkills); + const gainSkills = target.getStockSkills(true, true).filter(i => { + const info = get.info(i); + if (info && info.zhuSkill && !player.isZhu2()) return false; + return !info || !info.charlotte; + }); + if (gainSkills.length) { + //抽象 + //混沌初开——牢戏 + Object.keys(target.storage) + .filter(i => gainSkills.some(skill => i.startsWith(skill))) + .forEach(storage => delete target.storage[storage]); + target.addSkill(gainSkills); + const suffixs = ["used", "round", "block", "blocker"]; + for (const skill of gainSkills) { + const info = get.info(skill); + if (typeof info.usable == "number") { + if (target.hasSkill("counttrigger") && target.storage.counttrigger[skill] && target.storage.counttrigger[skill] >= 1) { + delete target.storage.counttrigger[skill]; + } + if (typeof get.skillCount(skill) == "number" && get.skillCount(skill) >= 1) { + delete target.getStat("skill")[skill]; + } + } + if (info.round && target.storage[skill + "_roundcount"]) { + delete target.storage[skill + "_roundcount"]; + } + if (target.storage[`temp_ban_${skill}`]) { + delete target.storage[`temp_ban_${skill}`]; + } + if (target.awakenedSkills.includes(skill)) { + target.restoreSkill(skill); + } + for (const suffix of suffixs) { + if (target.hasSkill(skill + "_" + suffix)) { + target.removeSkill(skill + "_" + suffix); + } + } + } + } + if (target != player && target.hp > player.hp) { + await player.recoverTo(target.hp); + } + }, + }, //张绣 dcsbfuxi: { audio: 2, diff --git a/character/xianding/sort.js b/character/xianding/sort.js index 4c2e75e09..3b6a9394d 100644 --- a/character/xianding/sort.js +++ b/character/xianding/sort.js @@ -2,7 +2,7 @@ const characterSort = { 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_huangjia: ["caomao", "liubian", "dc_liuyu", "quanhuijie", "dingshangwan", "yuanji", "xielingyu", "sunyu", "ganfurenmifuren", "dc_ganfuren", "dc_mifuren", "dc_shixie", "caofang", "zhupeilan"], 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"], @@ -15,8 +15,9 @@ const characterSort = { sp2_wumiao: ["wu_zhugeliang", "wu_luxun", "wu_guanyu"], sp2_mouding: ["dc_sb_jiaxu", "dc_sb_lusu", "dc_sb_zhouyu", "dc_sb_simayi"], sp2_zhonghu: ["dc_jiangji", "dc_wangling", "dc_simashi", "dc_caoshuang"], - sp2_zijing: ["dc_sb_zhugejin"], - sp2_waitingforsort: ["dc_sb_caoang", "dc_sb_guanping", "dc_sb_zhangxiu"], + sp2_zijing: ["dc_sb_zhugejin", "dc_sb_guanping"], + sp2_dushi: ["dc_sb_caoang", "dc_sb_zhangxiu"], + sp2_waitingforsort: [], }; const characterSortTranslate = { @@ -37,6 +38,7 @@ const characterSortTranslate = { sp2_mouding: "谋定天下", sp2_zhonghu: "冢虎狼顾", sp2_zijing: "子敬邀刀", + sp2_dushi: "毒士鸩计", sp2_waitingforsort: "等待分包", }; diff --git a/character/xianding/translate.js b/character/xianding/translate.js index 63700755b..7c5828669 100644 --- a/character/xianding/translate.js +++ b/character/xianding/translate.js @@ -633,6 +633,11 @@ const translates = { dcsbfuxi_info: "其他角色的出牌阶段开始时,若其手牌数为全场最多,则你可以选择一项:①交给其一张牌,然后摸两张牌;②弃置其一张牌,然后视为对其使用一张【杀】。", dcsbhaoyi: "豪意", dcsbhaoyi_info: "结束阶段,你可以获得本回合进入弃牌堆的所有未造成过伤害的伤害牌,然后你可以将这些牌任意分配给其他角色。", + zhupeilan: "朱佩兰", + dccilv: "辞虑", + dccilv_info: "当你成为普通锦囊牌的目标后,你可以摸剩余选项数的牌,然后若你的手牌数大于你的体力上限,则你选择执行并移去一项:①令此牌对你无效;②防止此牌对你造成的伤害;③于此牌结算完毕后获得此牌对应的所有实体牌。", + dctongdao: "痛悼", + dctongdao_info: "限定技,当你进入濒死状态时,你可以选择一名角色,令其将其拥有的技能重置至游戏开始时的状态,然后若其不为你,则你将体力值回复至与其相同。", }; export default translates;