diff --git a/card/kaiheiji.js b/card/kaiheiji.js
index 0734a4fd61..ffd73f8321 100644
--- a/card/kaiheiji.js
+++ b/card/kaiheiji.js
@@ -4,40 +4,466 @@ game.import("card", function () {
name: "kaiheiji",
connect: true,
card: {
- //新杀的劝酒
- khquanjiux: {
+ //烈火
+ liehuo: {
audio: true,
fullskin: true,
type: "trick",
enable: true,
selectTarget: -1,
- filterTarget: true,
+ filterTarget: lib.filter.notMe,
reverseOrder: true,
multitarget: true,
multiline: true,
+ async content(event, trigger, player) {
+ let { targets } = event;
+ targets.add(player);
+ targets = targets.filter(target => target.countCards("h")).sortBySeat();
+ const chooseEvent = player
+ .chooseCardOL(targets, "烈火:请选择一张手牌", true)
+ .set("ai", function (card) {
+ return Math.random();
+ })
+ .set("source", player);
+ chooseEvent.aiCard = function (target) {
+ const hs = target.getCards("h");
+ return { bool: true, cards: [hs.randomGet()] };
+ };
+ chooseEvent._args.remove("glow_result");
+ const result = await chooseEvent.forResult();
+ if (!targets.includes(player)) {
+ return;
+ }
+ let card = result[targets.indexOf(player)]?.cards[0],
+ damage = [];
+ if (!card) {
+ return;
+ }
+ for (let i = 0; i < targets.length; i++) {
+ if (targets[i] != player) {
+ if (get.color(result[i].cards[0], targets[i]) == get.color(card, player)) {
+ damage.push(targets[i]);
+ }
+ }
+ }
+ if (damage.length) {
+ await player.modedDiscard(card);
+ player.line(damage, "fire");
+ for (const target of damage.sortBySeat()) {
+ await target.damage("fire");
+ }
+ }
+ },
+ ai: {
+ wuxie() {
+ return Math.random() > 0.75;
+ },
+ order: 7,
+ useful: 6,
+ value: 6.5,
+ result: {
+ target: -1,
+ },
+ tag: {
+ damage: 0.5,
+ multitarget: 1,
+ multineg: 1,
+ },
+ },
+ },
+ //神兵
+ shenbing: {
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ selectTarget: -1,
+ filterTarget: true,
+ reverseOrder: true,
+ async contentBefore(event, trigger, player) {
+ const evt = event.getParent();
+ if (!evt.shenbing) {
+ const result = await player
+ .chooseControl("弃置牌", "使用牌")
+ .set("prompt", `神兵:令目标弃置装备区所有牌或依次使用牌堆不用副类型的装备牌各一张。`)
+ .set("ai", () => (Math.random() > 0.5 ? "弃置牌" : "使用牌"))
+ .forResult();
+ if (result?.control) {
+ evt.shenbing = result.control == "弃置牌" ? "discard" : "useCard";
+ }
+ }
+ },
+ async content(event, trigger, player) {
+ const evt = event.getParent(),
+ { target } = event;
+ if (evt.shenbing == "discard") {
+ const cards = target.getCards("e");
+ if (cards.length) {
+ await target.modedDiscard(cards);
+ }
+ }
+ if (evt.shenbing == "useCard") {
+ for (let i = 1; i < 6; i++) {
+ if (!target.hasEnabledSlot(i)) {
+ return;
+ }
+ const card = get.cardPile2(function (card) {
+ return get.subtype(card) == "equip" + i && target.canUse(card, target);
+ });
+ if (card) {
+ await target.chooseUseTarget(card, true, "nothrow", "nopopup");
+ }
+ }
+ }
+ },
+ ai: {
+ wuxie() {
+ return 0;
+ },
+ order: 7,
+ useful: 6.5,
+ value: 7,
+ result: {
+ player: 1,
+ },
+ tag: {
+ multitarget: 1,
+ },
+ },
+ },
+ //金铙
+ jinnao: {
+ global: ["jinnao_skill"],
+ enable: true,
+ fullskin: true,
+ type: "trick",
+ toself: true,
+ filterTarget(card, player, target) {
+ if (get.mode() == "versus" && _status.mode == "two") {
+ return player.isFriendOf(target) && player != target;
+ }
+ return player != target;
+ },
+ /*changeTarget(player, targets) {
+ targets.push(player);
+ },*/
+ modTarget(card, player, target) {
+ return player != target;
+ },
+ async content(event, trigger, player) {
+ player.addMark("jinnao_skill");
+ event.target.addMark("jinnao_skill");
+ },
+ ai: {
+ wuxie() {
+ return Math.random() > 0.5;
+ },
+ order: 5,
+ useful: 7,
+ value: 7.2,
+ result: {
+ target: 1,
+ },
+ },
+ },
+ //鹰狼
+ yinglang: {
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ selectTarget: -1,
+ filterTarget: true,
+ reverseOrder: true,
+ async content(event, trigger, player) {
+ event.target.addTempSkill("yinglang_skill", "roundEnd");
+ },
+ ai: {
+ wuxie() {
+ return 0;
+ },
+ order: 9,
+ useful: 8.5,
+ value: 8.5,
+ result: {
+ target: 1,
+ },
+ },
+ },
+ //有福同享
+ youfu: {
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ filterTarget(card, player, target) {
+ if (get.mode() == "versus" && _status.mode == "two") {
+ return player.isFriendOf(target) && player != target;
+ }
+ return player != target;
+ },
+ modTarget(card, player, target) {
+ return player != target;
+ },
+ async content(event, trigger, player) {
+ player.addTempSkill("youfu_skill", ["phaseBefore", "phaseChange", "phaseAfter"]);
+ player.markAuto("youfu_skill", event.target);
+ },
+ ai: {
+ wuxie() {
+ return Math.random() > 0.5;
+ },
+ order: 8,
+ useful: 6.5,
+ value: 7,
+ result: {
+ target: 1,
+ },
+ },
+ },
+ //富贵
+ fugui: {
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ filterTarget(card, player, target) {
+ if (get.mode() == "versus" && _status.mode == "two") {
+ return player.isFriendOf(target) && player != target;
+ }
+ return player != target;
+ },
+ modTarget(card, player, target) {
+ return player != target;
+ },
+ async content(event, trigger, player) {
+ const { target } = event;
+ target
+ .when({
+ player: "gainAfter",
+ global: "loseAsyncAfter",
+ })
+ .assign({
+ firstDo: true,
+ })
+ .filter(evt => evt.getg(target)?.length)
+ .then(() => {
+ sourcex.draw(trigger.getg(player)?.length);
+ })
+ .vars({
+ sourcex: player,
+ });
+ },
+ ai: {
+ wuxie() {
+ return Math.random() > 0.5;
+ },
+ order: 7,
+ useful: 6.5,
+ value: 7,
+ result: {
+ player: 1,
+ },
+ },
+ },
+ //躺赢狗!
+ tangying: {
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ filterTarget(card, player, target) {
+ if (get.mode() == "versus" && _status.mode == "two") {
+ return player.isFriendOf(target) && player != target;
+ }
+ return player != target;
+ },
+ modTarget(card, player, target) {
+ return player != target;
+ },
+ async content(event, trigger, player) {
+ const { target } = event;
+ for (const phase of lib.phaseName) {
+ const evt = event.getParent(phase);
+ if (evt?.name === phase && !evt.skipped) {
+ const name = get.translation(phase);
+ game.log(player, "结束了" + name);
+ evt.skipped = true;
+ }
+ }
+ const evt = event.getParent("phase");
+ if (!evt.finished) {
+ game.log(player, "结束了回合");
+ evt.finish();
+ }
+ await player.turnOver();
+ if (!_status.auto) {
+ ui.click.auto();
+ }
+ target.when({ player: "phaseBegin" }).step(async (event, trigger, player) => {
+ const result = await player
+ .chooseControl("摸牌阶段", "出牌阶段")
+ .set("prompt", "躺赢:选择要执行的额外阶段")
+ .set("ai", () => (Math.random() > 0.5 ? "摸牌阶段" : "出牌阶段"))
+ .forResult();
+ if (result?.control) {
+ const name = result.control == "摸牌阶段" ? "phaseDraw" : "phaseUse";
+ trigger.phaseList.splice(trigger.num, 0, `${name}|${event.name}`);
+ }
+ });
+ },
+ ai: {
+ wuxie() {
+ return Math.random() > 0.5;
+ },
+ order: 1,
+ useful: 5.5,
+ value: 6,
+ result: {
+ target: 1,
+ },
+ },
+ },
+ //大师
+ dashi: {
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ singleCard: true,
+ filterTarget: lib.filter.notMe,
+ filterAddedTarget(card, player, target, preTarget) {
+ return target != preTarget && target != player;
+ },
+ multicheck() {
+ return game.hasPlayer(target => target.countCards("h"));
+ },
+ complexSelect: true,
+ complexTarget: true,
+ async content(event, trigger, player) {
+ event.target.swapHandcards(event.addedTarget);
+ },
+ ai: {
+ order: 6,
+ useful: 8,
+ value: 8.2,
+ result: {
+ target(player, target) {
+ const list = [];
+ let targets = ui.selected.targets.slice();
+ if (_status.event.preTarget) {
+ targets.add(_status.event.preTarget);
+ }
+ //const num = player.countCards("he");
+ const players = game.filterPlayer();
+ if (targets.length == 0) {
+ for (let i = 0; i < players.length; i++) {
+ if (players[i] != player && get.attitude(player, players[i]) > 3) {
+ list.push(players[i]);
+ }
+ }
+ list.sort(function (a, b) {
+ return a.countCards("h") - b.countCards("h");
+ });
+ if (target == list[0]) {
+ return get.attitude(player, target);
+ }
+ return -get.attitude(player, target);
+ } else {
+ const from = ui.selected.targets[0];
+ for (let i = 0; i < players.length; i++) {
+ if (players[i] != player && get.attitude(player, players[i]) < 1) {
+ list.push(players[i]);
+ }
+ }
+ list.sort(function (a, b) {
+ return b.countCards("h") - a.countCards("h");
+ });
+ if (from.countCards("h") >= list[0].countCards("h")) {
+ return -get.attitude(player, target);
+ }
+ for (let i = 0; i < list.length && from.countCards("h") < list[i].countCards("h"); i++) {
+ const count = list[i].countCards("h") - from.countCards("h");
+ if (count < 2 && from.countCards("h") >= 2) {
+ return -get.attitude(player, target);
+ }
+ if (target == list[i]) {
+ return get.attitude(player, target);
+ }
+ return -get.attitude(player, target);
+ }
+ }
+ },
+ },
+ tag: {
+ multitarget: 1,
+ norepeat: 1,
+ },
+ },
+ },
+ //武圣归来
+ guilai: {
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ deadTarget: true,
+ filterTarget(card, player, target) {
+ if (get.mode() == "versus" && _status.mode == "two") {
+ return player.isFriendOf(target) && player != target && target.isDead();
+ }
+ return player != target && target.isDead();
+ },
+ modTarget(card, player, target) {
+ return player != target && target.isDead();
+ },
+ async content(event, trigger, player) {
+ const { target } = event;
+ await target.revive();
+ await target.draw(3);
+ },
+ ai: {
+ order: 10,
+ useful: 8.5,
+ value: 8.5,
+ result: {
+ target: 1,
+ },
+ },
+ },
+ //新杀的劝酒
+ khquanjiux: {
+ global: ["khquanjiux_skill"],
+ audio: true,
+ fullskin: true,
+ type: "trick",
+ enable: true,
+ notarget: true,
wuxieable: false,
async content(event, trigger, player) {
- const { targets } = event;
+ const targets = game.filterPlayer().sortBySeat();
+ player.line(targets);
for (const target of targets) {
- const cards = target.getCards("h").randomGets(get.rand(1, target.countCards("h")));
+ const num = get.rand(1, target.countCards("h"));
+ const cards = target.getCards("h").randomGets(num);
if (!cards.length) {
continue;
}
target.addGaintag(cards, "khquanjiux_tag");
cards.forEach(card => {
game.broadcastAll(card => {
- if (!card.storage?.origin_info) {
- card.storage.origin_info = [card.suit, card.number, card.name, card.nature];
+ if (!card.storage?.khquanjiux) {
+ card.storage.khquanjiux = [card.suit, card.number, card.name, card.nature];
}
card.init([card.suit, card.number, "jiu"]);
//改回原来的牌名
- card.destroyed = (card, position, player, event) => {
- if (card.storage?.origin_info) {
- card.init(card.storage.origin_info);
- delete card.storage.origin_info;
+ /*card.destroyed = (card, position, player, event) => {
+ if (card.storage?.khquanjiux) {
+ card.init(card.storage.khquanjiux);
+ delete card.storage.khquanjiux;
}
return false;
- };
+ };*/
}, card);
});
}
@@ -52,26 +478,26 @@ game.import("card", function () {
continue;
}
const { result } = await target
- .chooseToUse("劝酒:使用一张【酒】否则受到每名其他角色造成的一点伤害", function (card) {
+ .chooseToRespond("劝酒:打出一张【酒】否则受到每名其他角色造成的一点伤害", function (card) {
if (get.name(card) != "jiu") {
return false;
}
return lib.filter.filterCard.apply(this, arguments);
})
- .set("ai1", () => 114514)
+ .set("ai", () => 114514);
+ /*.set("ai1", () => 114514)
.set("ai2", function () {
return get.effect_use.apply(this, arguments) - get.event("effect") + 114514;
})
- .set("targetRequired", true)
.set(
"effect",
game.filterPlayer(current => current != target).reduce((eff, current) => eff + get.damageEffect(target, current, target), 0)
)
- .set("addCount", false);
+ .set("addCount", false);*/
if (!result?.bool) {
const damage = game.filterPlayer(current => current != target).sortBySeat();
if (damage.length) {
- while (damage.length) {
+ while (damage.length && target.isIn()) {
const current = damage.shift();
current.line(target, "yellow");
await target.damage(current);
@@ -86,7 +512,7 @@ game.import("card", function () {
useful: 7.5,
value: 7.5,
result: {
- target: -1,
+ player: 1,
},
tag: {
damage: 0.2,
@@ -101,34 +527,34 @@ game.import("card", function () {
fullskin: true,
type: "trick",
enable: true,
- selectTarget: -1,
- filterTarget: lib.filter.notMe,
- reverseOrder: true,
- multitarget: true,
- multiline: true,
+ notarget: true,
wuxieable: false,
global: "nisiwohuo_end",
async content(event, trigger, player) {
- player.$skill(get.translation(event.name), null, get.groupnature(player.group, "raw"));
- const { targets } = event;
+ player.$skill(get.translation(event.name), null, "thunder", null, "shen_jiaxu");
+ await game.delayx();
+ const targets = game.filterPlayer(target => target != player).sortBySeat();
+ player.line(targets);
game.broadcastAll(event => {
if (!_status.nisiwohuo) {
_status.nisiwohuo = [];
}
_status.nisiwohuo.push(event);
}, event);
- let count = 0;
+ let count = 0,
+ num = 0;
const goon = function () {
if (!_status.nisiwohuo?.includes(event)) {
return false;
}
return true;
};
- while (goon()) {
- const target = targets[count];
+ while (goon() && count < 100) {
+ const target = targets[num];
count++;
- if (count >= targets.length) {
- count = 0;
+ num++;
+ if (num >= targets.length) {
+ num = 0;
}
if (!target.isAlive()) {
continue;
@@ -181,7 +607,7 @@ game.import("card", function () {
useful: 9.5,
value: 10,
result: {
- target: -1,
+ player: 1,
},
tag: {
//damage: 0.5,
@@ -323,7 +749,7 @@ game.import("card", function () {
type: "trick",
filterTarget: lib.filter.notMe,
modTarget: true,
- content() {
+ async content(event, trigger, player) {
const cards = [];
while (cards.length < 2) {
const card = get.cardPile(card => get.tag(card, "damage") > 0.5 && !cards.includes(card));
@@ -334,7 +760,7 @@ game.import("card", function () {
}
}
if (cards.length) {
- target.gain(cards, "gain2");
+ await event.target.gain(cards, "gain2");
}
},
//增兵减灶的ai
@@ -365,7 +791,7 @@ game.import("card", function () {
filterTarget: true,
reverseOrder: true,
async content(event, trigger, player) {
- const target = event.target;
+ const { target } = event;
const result = await target
.chooseToUse("劝酒:使用一张【酒】或点数为9的牌,否则失去1点体力", function (card) {
if (get.name(card) != "jiu" && get.number(card) != "unsure" && get.number(card) != 9) {
@@ -433,7 +859,8 @@ game.import("card", function () {
filterTarget(card, player, target) {
return player != target && target.isDying();
},
- content() {
+ async content(event, trigger, player) {
+ const { target } = event;
player.$skill(get.translation("luojing"), null, get.groupnature(player.group, "raw"));
const evt = event.getParent("dying");
if (evt.player == target) {
@@ -528,7 +955,8 @@ game.import("card", function () {
filterTarget(card, player, target) {
return player != target && target.isDying();
},
- content() {
+ async content(event, trigger, player) {
+ const { target } = event;
player.addSkill("shengsi_debuff");
player.markAuto("shengsi_debuff", target);
target.recover(2);
@@ -607,10 +1035,8 @@ game.import("card", function () {
return !target.isLinked();
},
reverseOrder: true,
- content() {
- if (!target.isLinked()) {
- target.link(true);
- }
+ async content(event, trigger, player) {
+ await event.target.link(true);
},
//照搬铁索的ai
ai: {
@@ -698,11 +1124,122 @@ game.import("card", function () {
},
},
skill: {
+ khquanjiux_skill: {
+ charlotte: true,
+ silent: true,
+ firstDo: true,
+ trigger: {
+ player: "loseBegin",
+ global: ["addToExpansionBegin", "equipBegin", "loseAsyncBegin", "addJudgeBegin", "gainBegin"],
+ },
+ filter(event, player) {
+ return event.getl(player)?.cards?.some(card => card.storage?.khquanjiux?.length);
+ },
+ async content(event, trigger, player) {
+ const cards = trigger.getl(player)?.cards?.filter(card => card.storage?.khquanjiux?.length);
+ game.broadcastAll(cards => {
+ cards.forEach(card => {
+ if (card.storage?.khquanjiux?.length) {
+ card.init(card.storage.khquanjiux);
+ delete card.storage.khquanjiux;
+ }
+ });
+ }, cards);
+ },
+ },
+ jinnao_skill: {
+ charlotte: true,
+ silent: true,
+ firstDo: true,
+ trigger: { player: "damageBegin3" },
+ filter(event, player) {
+ return player.hasMark("jinnao_skill");
+ },
+ async content(event, trigger, player) {
+ player.removeMark(event.name, 1);
+ trigger.cancel();
+ },
+ intro: {
+ name: "金铙(金)",
+ name2: "金",
+ content: "mark",
+ markcount: "mark",
+ },
+ },
+ yinglang_skill: {
+ charlotte: true,
+ silent: true,
+ firstDo: true,
+ trigger: { player: "useCardToPlayered" },
+ filter(event, player) {
+ return event.target.countGainableCards(player, "he") && event.target != player;
+ },
+ async content(event, trigger, player) {
+ await player.gainPlayerCard(trigger.target, "he", true);
+ },
+ },
+ youfu_skill: {
+ popup: false,
+ charlotte: true,
+ onremove: true,
+ trigger: { player: "useCard2" },
+ filter(event, player) {
+ if (!["basic", "trick"].includes(get.type(event.card))) {
+ return false;
+ }
+ if (!Array.isArray(event.targets) || !event.targets.includes(player)) {
+ return false;
+ }
+ return game.hasPlayer(target => {
+ if (!player.getStorage("youfu_skill").includes(target)) {
+ return false;
+ }
+ return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target);
+ });
+ },
+ async cost(event, trigger, player) {
+ const targets = game.filterPlayer(target => {
+ if (!player.getStorage("youfu_skill").includes(target)) {
+ return false;
+ }
+ return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target);
+ });
+ if (targets.length == 1) {
+ const target = targets[0];
+ const bool = await player.chooseBool(get.prompt(event.skill, target), "令" + get.translation(target) + "也成为" + get.translation(trigger.card) + "的目标").forResult("bool");
+ event.result = { bool: bool, targets: targets };
+ } else {
+ event.result = await player
+ .chooseTarget(get.prompt(event.skill), "令任意名【有福同享】的目标角色也成为" + get.translation(trigger.card) + "的目标", (card, player, target) => {
+ const trigger = get.event().getTrigger();
+ if (!player.getStorage("youfu_skill").includes(target)) {
+ return false;
+ }
+ return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target);
+ })
+ .set("ai", target => {
+ const player = get.player(),
+ trigger = get.event().getTrigger();
+ return get.effect(target, trigger.card, player, player);
+ })
+ .forResult();
+ }
+ },
+ async content(event, trigger, player) {
+ player.line(event.targets);
+ trigger.targets.addArray(event.targets);
+ game.log(event.targets, "成为了", trigger.card, "的额外目标");
+ },
+ mark: true,
+ intro: {
+ content: "对自己使用基本牌和普通锦囊牌时,可以额外指定 $ 为目标",
+ },
+ },
nisiwohuo_end: {
trigger: { global: "die" },
firstDo: true,
silent: true,
- content() {
+ async content(event, trigger, player) {
game.broadcastAll(() => {
if (_status.nisiwohuo?.length) {
delete _status.nisiwohuo;
@@ -726,7 +1263,7 @@ game.import("card", function () {
}
return player.hasUsableCard("luojing");
},
- content() {
+ async content(event, trigger, player) {
player
.chooseToUse(
get.prompt("luojing", trigger.player).replace(/发动/, "使用"),
@@ -763,7 +1300,7 @@ game.import("card", function () {
}
return player.hasUsableCard("shengsi");
},
- content() {
+ async content(event, trigger, player) {
player
.chooseToUse(
get.prompt("shengsi", trigger.player).replace(/发动/, "使用"),
@@ -798,7 +1335,7 @@ game.import("card", function () {
filter(event, player) {
return player.getStorage("shengsi_debuff").includes(event.player);
},
- content() {
+ async content(event, trigger, player) {
player.$skill(get.translation("shengsi"), null, get.groupnature(player.group, "raw"));
player.unmarkAuto(event.name, trigger.player);
player.die();
@@ -811,19 +1348,64 @@ game.import("card", function () {
filter(event, player) {
return event.card.name == "leigong";
},
- content() {
+ async content(event, trigger, player) {
const num = game.countPlayer2(target => target.hasHistory("damage", evt => evt.getParent(2) == trigger && evt.notLink()));
if (num > 0) {
- player.draw(num);
+ await player.draw(num);
}
},
},
},
translate: {
+ liehuo: "烈火",
+ liehuo_bg: "烈",
+ liehuo_info: "出牌阶段,对所有其他角色使用,令你和目标暗中选择一张手牌,若有角色与你选择的牌颜色相同,你弃置你选择的牌对这些角色各造成一点火焰伤害。",
+ shenbing: "神兵",
+ shenbing_bg: "兵",
+ shenbing_info: "出牌阶段,对所有角色使用,令目标弃置装备区所有牌或依次使用牌堆不用副类型的装备牌各一张。",
+ jinnao: "金铙",
+ jinnao_skill: "金铙",
+ jinnao_bg: "金",
+ get jinnao_info() {
+ const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色";
+ return `出牌阶段,对${str}使用,令你和目标获得一个「金」标记。(当目标受到伤害时,其移去一个「金」防止此伤害)`;
+ },
+ yinglang: "鹰狼",
+ yinglang_skill: "鹰狼",
+ yinglang_bg: "鹰",
+ yinglang_info: "出牌阶段,对所有角色使用,令目标本轮使用牌指定其他角色为目标后,获得该目标一张牌。",
+ youfu: "有福同享",
+ youfu_skill: "有福同享",
+ youfu_bg: "福",
+ get youfu_info() {
+ const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色";
+ return `出牌阶段,对${str}使用,令你此阶段对自己使用基本牌和普通锦囊牌时,可以额外指定其为目标`;
+ },
+ fugui: "富贵",
+ fugui_bg: "富",
+ get fugui_info() {
+ const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色";
+ return `出牌阶段,对${str}使用,其下次获得牌后你摸等量张牌。`;
+ },
+ tangying: "躺赢",
+ tangying_bg: "躺",
+ get tangying_info() {
+ const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色";
+ return `出牌阶段,你结束当前回合,然后翻面并进入托管状态。令${str}下个回合开始时选择额外执行一个摸牌或出牌阶段。`;
+ },
+ dashi: "大师",
+ dashi_bg: "师",
+ dashi_info: "出牌阶段,令两名其他角色交换手牌。",
+ guilai: "武圣归来",
+ guilai_bg: "归",
+ get guilai_info() {
+ const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色";
+ return `出牌阶段,令${str}复活`;
+ },
khquanjiux: "劝酒",
khquanjiux_tag: "劝酒",
khquanjiux_bg: "劝",
- khquanjiux_info: "出牌阶段,对所有角色使用,所有角色手牌随机变成【酒】,然后依次使用一张【酒】,重复此效果直到有角色不使用,该角色受到每名其他角色造成的一点伤害。此牌不能被【无懈可击】响应。",
+ khquanjiux_info: "出牌阶段,对所有角色使用,所有角色手牌随机变成【酒】,然后依次打出一张【酒】,重复此效果直到有角色不使用,该角色受到每名其他角色造成的一点伤害。此牌不能被【无懈可击】响应。",
nisiwohuo: "你死我活",
nisiwohuo_end: "你死我活",
nisiwohuo_bg: "死",
@@ -861,6 +1443,32 @@ game.import("card", function () {
leigong_info: "出牌阶段,对所有角色使用,令目标依次进行一次【闪电】判定,然后每有一名角色因此受到非传导伤害,你摸一张牌。",
},
list: [
+ [lib.suit.randomGet(), get.rand(1, 13), "liehuo"],
+ [lib.suit.randomGet(), get.rand(1, 13), "liehuo"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "shenbing"],
+ [lib.suit.randomGet(), get.rand(1, 13), "shenbing"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "jinnao"],
+ [lib.suit.randomGet(), get.rand(1, 13), "jinnao"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "yinglang"],
+ [lib.suit.randomGet(), get.rand(1, 13), "yinglang"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "youfu"],
+ [lib.suit.randomGet(), get.rand(1, 13), "youfu"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "fugui"],
+ [lib.suit.randomGet(), get.rand(1, 13), "fugui"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "tangying"],
+ [lib.suit.randomGet(), get.rand(1, 13), "tangying"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "guilai"],
+
+ [lib.suit.randomGet(), get.rand(1, 13), "dashi"],
+ [lib.suit.randomGet(), get.rand(1, 13), "dashi"],
+
["spade", 13, "khquanjiux"],
["diamond", 13, "khquanjiux"],
["heart", 13, "khquanjiux"],
diff --git a/character/extra/skill.js b/character/extra/skill.js
index 08163c33d9..8471972b96 100644
--- a/character/extra/skill.js
+++ b/character/extra/skill.js
@@ -737,12 +737,14 @@ const skills = {
const targets = game.filterPlayer(target => target != player);
player.line(targets);
if (choices.includes("fengyin")) {
+ game.log(player, "选择了", "#y准备阶段、结束阶段", "的效果");
for (const target of targets) {
target.when({ player: "phaseJieshuBefore" }).then(() => player.addTempSkill("fengyin", ["phaseBefore", "phaseChange", "phaseAfter"]));
target.when({ player: "phaseZhunbeiBefore" }).then(() => player.addTempSkill("fengyin", ["phaseBefore", "phaseChange", "phaseAfter"]));
}
}
if (choices.includes("judge")) {
+ game.log(player, "选择了", "#y判定阶段", "的效果");
for (const target of targets) {
target.when({ player: "phaseJudgeBegin" }).step(async (event, trigger, player) => {
const result = await player
@@ -762,44 +764,54 @@ const skills = {
}
}
if (choices.includes("discard")) {
- game.addGlobalSkill("dclishi_discard");
+ game.log(player, "选择了", "#y摸牌阶段", "的效果");
for (const target of targets) {
- target.when({ player: "phaseDrawBegin" }).then(() => trigger.set("dclishi", player.playerid));
+ target.addTempSkill("dclishi_discard", { player: "phaseDrawAfter" });
+ //target.when({ player: "phaseDrawBegin" }).then(() => trigger.set("dclishi", player.playerid));
}
}
if (choices.includes("use")) {
+ game.log(player, "选择了", "#y出牌阶段", "的效果");
for (const target of targets) {
- target.when({ player: "phaseUseBegin" }).then(() => player.addTempSkill("dclishi_limit", ["phaseBefore", "phaseChange", "phaseAfter"]));
+ target.addTempSkill("dclishi_limit", { player: "phaseUseAfter" });
+ //target.when({ player: "phaseUseBegin" }).then(() => player.addTempSkill("dclishi_limit", ["phaseBefore", "phaseChange", "phaseAfter"]));
}
}
if (choices.includes("gain")) {
- player.addSkill("dclishi_gain");
+ game.log(player, "选择了", "#y弃牌阶段", "的效果");
for (const target of targets) {
- target.when({ player: "phaseDiscardBegin" }).then(() => trigger.set("dclishi", player.playerid));
+ target.addTempSkill("dclishi_gain", { player: "phaseDiscardAfter" });
+ target.markAuto("dclishi_gain", player);
+ //target.when({ player: "phaseDiscardBegin" }).then(() => trigger.set("dclishi", player.playerid));
}
}
},
subSkill: {
gain: {
trigger: {
- global: ["loseAsyncAfter", "loseAfter"],
+ player: ["loseAfter"],
+ global: ["loseAsyncAfter"],
},
charlotte: true,
forced: true,
popup: false,
+ onremove: true,
filter(event, player) {
if (event.type !== "discard") {
return false;
}
const evt = event.getParent("phaseDiscard");
- if (evt?.dclishi !== event.player.playerid) {
- return false;
- }
- const evt2 = event.getl(event.player);
- return evt?.name === "phaseDiscard" && evt?.player === event.player && evt2?.cards2?.filterInD("d");
+ const evt2 = event.getl(player);
+ return evt?.name === "phaseDiscard" && evt?.player === player && evt2?.cards2?.filterInD("d");
},
async content(event, trigger, player) {
- await player.gain(trigger.getl(trigger.player).cards2.filterInD("d"), "gain2");
+ const gainer = player
+ .getStorage(event.name)
+ .sortBySeat()
+ .find(target => target.isIn());
+ if (gainer) {
+ await gainer.gain(trigger.getl(player).cards2.filterInD("d"), "gain2");
+ }
},
},
limit: {
@@ -807,6 +819,7 @@ const skills = {
onremove: true,
trigger: { player: "useCard1" },
silent: true,
+ firstDo: true,
filter(event, player) {
return player.isPhaseUsing();
},
@@ -833,15 +846,15 @@ const skills = {
forced: true,
popup: false,
trigger: {
- global: ["gainAfter", "loseAsyncAfter"],
+ player: ["gainAfter"],
},
filter(event, player) {
const evt = event.getParent("phaseDraw");
- const cards = event?.getg?.(player);
- return event.getParent()?.name == "draw" && evt?.name === "phaseDraw" && evt?.dclishi === player.playerid && cards.map(card => get.color(card)).unique().length == 1;
+ const cards = event.getg?.(player);
+ return event.getParent()?.name == "draw" && evt?.name === "phaseDraw" && evt?.player === player && cards.map(card => get.color(card)).unique().length == 1;
},
async content(event, trigger, player) {
- let cards = trigger.getg(player);
+ const cards = trigger.getg(player);
await player.modedDiscard(cards);
},
},
@@ -10565,11 +10578,7 @@ const skills = {
audio: 2,
async cost(event, trigger, player) {
const {
- result: {
- bool,
- targets,
- links: cost_data,
- }
+ result: { bool, targets, links: cost_data },
} = await player
.chooseButtonTarget({
createDialog: [get.prompt2(event.skill), player.getExpansions("qixing")],
@@ -10625,12 +10634,12 @@ const skills = {
return -1;
},
})
- .set("allUse", player.getExpansions("qixing").length >= game.countPlayer(current => get.attitude(player, current) > 4) * 2)
+ .set("allUse", player.getExpansions("qixing").length >= game.countPlayer(current => get.attitude(player, current) > 4) * 2);
event.result = {
bool: bool,
targets: targets?.sortBySeat(),
cost_data: cost_data,
- }
+ };
},
async content(event, trigger, player) {
const { targets, cost_data: cards } = event;
@@ -10693,33 +10702,30 @@ const skills = {
},
async cost(event, trigger, player) {
const {
- result: {
- bool,
- targets,
- links: cost_data,
- }
- } = await player
- .chooseButtonTarget({
- createDialog: [get.prompt2(event.skill), player.getExpansions("qixing")],
- selectButton: 1,
- filterTarget: true,
- ai1(button) {
- if (game.hasPlayer(target => {
+ result: { bool, targets, links: cost_data },
+ } = await player.chooseButtonTarget({
+ createDialog: [get.prompt2(event.skill), player.getExpansions("qixing")],
+ selectButton: 1,
+ filterTarget: true,
+ ai1(button) {
+ if (
+ game.hasPlayer(target => {
return get.attitude(get.player(), target) < 0;
- })) {
- return 1;
- }
- return 0;
- },
- ai2(target) {
- return -get.attitude(get.player(), target);
- },
- });
+ })
+ ) {
+ return 1;
+ }
+ return 0;
+ },
+ ai2(target) {
+ return -get.attitude(get.player(), target);
+ },
+ });
event.result = {
bool: bool,
targets: targets?.sortBySeat(),
cost_data: cost_data,
- }
+ };
},
async content(event, trigger, player) {
const { targets, cost_data: cards } = event;
diff --git a/character/mobile/skill.js b/character/mobile/skill.js
index 72e0be7e6d..82a627cd8f 100644
--- a/character/mobile/skill.js
+++ b/character/mobile/skill.js
@@ -38,8 +38,7 @@ const skills = {
if (num > 0) {
if (!player.isDamaged()) {
await player.draw(num);
- }
- else {
+ } else {
await player.recover(num);
}
await player.draw(num);
@@ -72,16 +71,19 @@ const skills = {
},
async cost(event, trigger, player) {
const result = await player
- .chooseButton([
- get.prompt(event.skill),
+ .chooseButton(
[
+ get.prompt(event.skill),
[
- ["losehp", "失去任意点体力,令你此阶段使用的前等量张牌不计入次数限制"],
- ["discard", "弃置任意张手牌,令你此阶段使用的前等量张牌无距离限制且不可被响应"],
+ [
+ ["losehp", "失去任意点体力,令你此阶段使用的前等量张牌不计入次数限制"],
+ ["discard", "弃置任意张手牌,令你此阶段使用的前等量张牌无距离限制且不可被响应"],
+ ],
+ "textbutton",
],
- "textbutton",
- ]
- ], [1, 2])
+ ],
+ [1, 2]
+ )
.set("filterButton", button => {
const player = get.player();
if (button.link == "discard") {
@@ -91,7 +93,7 @@ const skills = {
})
.set("ai", button => {
const player = get.player(),
- num = Math.floor(player.countCards("h")/2);
+ num = Math.floor(player.countCards("h") / 2);
if (button.link == "discard") {
return num;
}
@@ -108,22 +110,25 @@ const skills = {
if (select == "nouse") {
await player.gainMaxHp();
await player.recover();
- }
- else {
+ } else {
if (select.includes("losehp")) {
const { result } = await player
- .chooseNumbers(get.translation(event.name), [
- {
- prompt: "失去任意点体力值,令你此阶段使用的前等量张牌不计入次数限制",
- min: 1,
- max: player.getHp(),
- }
- ], true)
+ .chooseNumbers(
+ get.translation(event.name),
+ [
+ {
+ prompt: "失去任意点体力值,令你此阶段使用的前等量张牌不计入次数限制",
+ min: 1,
+ max: player.getHp(),
+ },
+ ],
+ true
+ )
.set("processAI", () => {
- const player = get.player();
- let num = Math.floor(player.countCards("h")/2);
- return [num];
- });
+ const player = get.player();
+ let num = Math.floor(player.countCards("h") / 2);
+ return [num];
+ });
const number = result.numbers[0];
await player.loseHp(number);
player.addTempSkill("potzhuangshi_limit", "phaseChange");
@@ -136,7 +141,7 @@ const skills = {
.set("prompt2", "弃置任意张手牌,令你此阶段使用的前等量张牌无距离限制且不可被响应")
.set("ai", card => {
const player = get.player();
- let num = Math.floor(player.countCards("h")/2);
+ let num = Math.floor(player.countCards("h") / 2);
if (ui.selected.cards.length < num) {
return 7 - get.value(card);
}
@@ -171,8 +176,7 @@ const skills = {
const num = player.countMark("potzhuangshi_limit");
if (num > 0) {
player.addTip("potzhuangshi_limit", `不计次数 ${num}`);
- }
- else {
+ } else {
player.removeTip("potzhuangshi_limit");
}
},
@@ -198,8 +202,7 @@ const skills = {
const num = player.countMark("potzhuangshi_directHit");
if (num > 0) {
player.addTip("potzhuangshi_directHit", `不可响应 ${num}`);
- }
- else {
+ } else {
player.removeTip("potzhuangshi_directHit");
}
},
@@ -250,8 +253,9 @@ const skills = {
.filter(evt => evt == trigger.getParent(2))
.step(async (event, trigger, player) => {
if (target.isIn() && target.countCards("he")) {
- const { result: { cards }} = await player
- .discardPlayerCard(target, "he", true);
+ const {
+ result: { cards },
+ } = await player.discardPlayerCard(target, "he", true);
if (bool1) {
await player.gain(cards.filterInD("od"), "gain2");
}
@@ -280,19 +284,14 @@ const skills = {
choiceList.push("背水:弃置一张牌并令你本阶段使用【杀】的次数+1");
}
if (player.isDamaged()) {
- list.unshift("recover_hp")
- }
- else {
+ list.unshift("recover_hp");
+ } else {
choiceList[0] = `${choiceList[0]}`;
}
if (list.length == 1) {
- event.result = await player
- .chooseBool(get.prompt(event.skill), "摸一张牌")
- .set("frequentSkill", event.skill)
- .forResult();
+ event.result = await player.chooseBool(get.prompt(event.skill), "摸一张牌").set("frequentSkill", event.skill).forResult();
event.result.cost_data = "draw_card";
- }
- else {
+ } else {
list.push("cancel2");
if (
player.isDamaged() &&
@@ -303,8 +302,7 @@ const skills = {
) {
if (player.countCards("he") > 1 && list.includes("背水!")) {
choice = "背水!";
- }
- else {
+ } else {
choice = "recover_hp";
}
} else {
@@ -529,11 +527,13 @@ const skills = {
if (!target.countCards("h")) {
return;
}
- const result = target.countCards("h") > 2 ? await target
- .chooseCard("劲镞:展示两张手牌", 2, "h", true).forResult() : {
- bool: true,
- cards: target.getCards("h"),
- };
+ const result =
+ target.countCards("h") > 2
+ ? await target.chooseCard("劲镞:展示两张手牌", 2, "h", true).forResult()
+ : {
+ bool: true,
+ cards: target.getCards("h"),
+ };
if (!result.bool) {
return;
}
@@ -2324,7 +2324,7 @@ const skills = {
filterTarget: true,
async content(event, trigger, player) {
const target = event.targets[0];
- const num = target.maxHp - target.countCards("h");
+ const num = Math.min(5, target.maxHp) - target.countCards("h");
const isMax = target.isMaxHandcard();
if (num > 0) {
await target.drawTo(target.maxHp);
@@ -13804,7 +13804,7 @@ const skills = {
async cost(event, trigger, player) {
event.result = await player.chooseTarget("安国:令一名其他角色获得“安国”标记", lib.filter.notMe, true).forResult();
},
- content() {
+ async content(event, trigger, player) {
const target = event.targets[0];
target.addMark("sbanguo_mark", 1, false);
target.addAdditionalSkill("sbanguo_" + player.playerid, "sbanguo_mark");
@@ -13828,16 +13828,14 @@ const skills = {
},
move: {
audio: ["sbanguo1.mp3", "sbanguo2.mp3"],
- direct: true,
trigger: { player: "phaseUseBegin" },
filter(event, player) {
return game.hasPlayer(current => current.hasSkill("sbanguo_mark")) && game.hasPlayer(current => !current.hasMark("sbanguo_marked") && current != player);
},
- content() {
- "step 0";
- var targets = game.filterPlayer(current => current.hasSkill("sbanguo_mark"));
- var prompt2 = targets.length == 1 ? "将" + get.translation(targets[0]) + "的“安国”交给一名未获得过“安国”的其他角色" : "选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色";
- player
+ async cost(event, trigger, player) {
+ const targets = game.filterPlayer(current => current.hasSkill("sbanguo_mark"));
+ const prompt2 = targets.length == 1 ? "将" + get.translation(targets[0]) + "的“安国”交给一名未获得过“安国”的其他角色" : "选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色";
+ event.result = await player
.chooseTarget(get.prompt("sbanguo"), prompt2, targets.length == 1 ? 1 : 2, (card, player, target) => {
if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) {
return target.hasSkill("sbanguo_mark");
@@ -13851,30 +13849,31 @@ const skills = {
}
return get.attitude(player, _status.event.targets[0]) < get.attitude(player, target);
})
- .set("targets", targets);
- "step 1";
- if (result.bool) {
- var targets = result.targets;
- if (targets.length == 1) {
- var target1 = game.filterPlayer(current => current.hasSkill("sbanguo_mark"))[0];
- var target2 = targets[0];
- } else {
- var target1 = targets[0];
- var target2 = targets[1];
- }
- player.logSkill("sbanguo_move", target2, false);
- player.line2([target1, target2], "green");
- var map = target1.additionalSkills;
- for (var key in map) {
- if (key.indexOf("sbanguo_") != 0) {
- continue;
- }
- var id = parseInt(key.slice(8));
- target1.removeAdditionalSkill("sbanguo_" + id);
- target2.addMark("sbanguo_mark", 1, false);
- target2.addAdditionalSkill("sbanguo_" + id, "sbanguo_mark");
- target2.addMark("sbanguo_marked", 1, false);
+ .set("targets", targets)
+ .set("line", false)
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const { targets } = event;
+ let target1, target2;
+ if (targets.length == 1) {
+ target1 = game.filterPlayer(current => current.hasSkill("sbanguo_mark"))[0];
+ target2 = targets[0];
+ } else {
+ target1 = targets[0];
+ target2 = targets[1];
+ }
+ player.line2([target1, target2], "green");
+ const map = target1.additionalSkills;
+ for (const key in map) {
+ if (key.indexOf("sbanguo_") != 0) {
+ continue;
}
+ const id = parseInt(key.slice(8));
+ target1.removeAdditionalSkill("sbanguo_" + id);
+ target2.addMark("sbanguo_mark", 1, false);
+ target2.addAdditionalSkill("sbanguo_" + id, "sbanguo_mark");
+ target2.addMark("sbanguo_marked", 1, false);
}
},
},
@@ -13892,7 +13891,7 @@ const skills = {
}
return event.num >= player.hp;
},
- content() {
+ async content(event, trigger, player) {
trigger.cancel();
},
ai: {
@@ -13927,42 +13926,39 @@ const skills = {
return skills && skills.length;
},
logTarget: "player",
- content() {
- "step 0";
- trigger.player.removeAdditionalSkill("sbanguo_" + player.playerid);
- var num = 1 - trigger.player.hp;
- if (num > 0) {
- trigger.player.recover(num);
- }
- "step 1";
- var hp = player.hp - 1,
+ async content(event, trigger, player) {
+ const target = trigger.player;
+ target.removeAdditionalSkill("sbanguo_" + player.playerid);
+ await target.recoverTo(1);
+ const hp = player.hp - 1,
maxhp = player.maxHp - 1;
+ let result;
if (hp > 0 && maxhp > 0) {
- player
+ result = await player
.chooseControl()
.set("prompt", "安国:请选择一项")
- .set("choiceList", ["失去" + hp + "点体力,令" + get.translation(trigger.player) + "获得1点护甲", "减" + maxhp + "点体力上限,令" + get.translation(trigger.player) + "获得1点护甲"])
- .set("ai", () => "选项一");
+ .set("choiceList", ["失去" + hp + "点体力,令" + get.translation(target) + "获得1点护甲", "减" + maxhp + "点体力上限,令" + get.translation(target) + "获得1点护甲"])
+ .set("ai", () => "选项一")
+ .forResult();
} else if (hp > 0) {
- event._result = { control: "选项一" };
+ result = { control: "选项一" };
} else if (maxhp > 0) {
- event._result = { control: "选项二" };
+ result = { control: "选项二" };
} else {
- event.finish();
+ return;
}
- "step 2";
- if (result.control == "选项一") {
+ if (result?.control == "选项一") {
var num = player.hp - 1;
if (num > 0) {
- player.loseHp(num);
+ await player.loseHp(num);
}
- } else {
+ } else if (result?.control == "选项二") {
var num = player.maxHp - 1;
if (num > 0) {
- player.loseMaxHp(num);
+ await player.loseMaxHp(num);
}
}
- trigger.player.changeHujia(1, null, true);
+ await target.changeHujia(1, null, true);
},
},
},
@@ -16780,40 +16776,35 @@ const skills = {
huantu: {
audio: 2,
trigger: { global: "phaseDrawBefore" },
- direct: true,
+ round: 1,
filter(event, player) {
- return player.countCards("he") > 0 && !player.hasSkill("huantu_round") && player.inRange(event.player);
+ return player.countCards("he") > 0 && player.inRange(event.player);
},
checkx(event, player) {
- var target = event.player;
+ const target = event.player;
return get.attitude(player, target) > 0 && (target.hasSkill("pingkou") || target.skipList.includes("phaseUse") || (target.isDamaged() && target.hp <= 2) || target.needsToDiscard());
},
- content() {
- "step 0";
- player
- .chooseCard(get.prompt("huantu", trigger.player), "交给其一张牌并令其暂时跳过摸牌阶段", "he")
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseCard(get.prompt(event.skill, trigger.player), "交给其一张牌并令其暂时跳过摸牌阶段", "he")
.set("ai", function (card) {
if (!_status.event.checkx) {
return 0;
}
return 1 + Math.random();
})
- .set("checkx", lib.skill.huantu.checkx(trigger, player));
- "step 1";
- if (result.bool) {
- player.addTempSkill("huantu_round", "roundStart");
- player.logSkill("huantu", trigger.player);
- player.give(result.cards, trigger.player);
- trigger.cancel();
- player.addTempSkill("huantu_effect");
- }
+ .set("checkx", lib.skill.huantu.checkx(trigger, player))
+ .forResult();
+ },
+ logTarget: "player",
+ async content(event, trigger, player) {
+ const target = event.targets[0],
+ { cards } = event;
+ await player.give(cards, target);
+ trigger.cancel();
+ player.addTempSkill(event.name + "_effect");
},
subSkill: {
- round: {
- charlotte: true,
- mark: true,
- intro: { content: "本轮已发动" },
- },
effect: {
audio: "huantu",
trigger: { global: "phaseJieshuBegin" },
@@ -16823,36 +16814,22 @@ const skills = {
filter(event, player) {
return event.player.isIn();
},
- content() {
- "step 0";
- var str = get.translation(trigger.player);
- player
+ async content(event, trigger, player) {
+ const target = trigger.player,
+ str = get.translation(target);
+ const result = await player
.chooseControl()
.set("choiceList", ["令" + str + "回复1点体力并摸两张牌", "摸三张牌,然后交给" + str + "两张手牌"])
- .set("choice", trigger.player.isDamaged() ? 0 : 1);
- "step 1";
- if (result.index == 0) {
- trigger.player.recover();
- trigger.player.draw(2);
- event.finish();
- } else {
- event.target = trigger.player;
- player.draw(3);
- }
- "step 2";
- var hs = player.getCards("h");
- if (hs.length && target.isIn() && player.isIn()) {
- if (hs.length <= 2) {
- event._result = { bool: true, cards: hs };
- } else {
- player.chooseCard("h", 2, true, "交给" + get.translation(target) + "两张手牌");
+ .set("choice", target.isDamaged() ? 0 : 1)
+ .forResult();
+ if (result?.index == 0) {
+ await target.recover();
+ await target.draw(2);
+ } else if (result?.index == 1) {
+ await player.draw(3);
+ if (player.countCards("h") && target.isIn()) {
+ await player.chooseToGive(target, 2, true, "h");
}
- } else {
- event.finish();
- }
- "step 3";
- if (result.bool) {
- player.give(result.cards, trigger.player);
}
},
},
@@ -16871,11 +16848,12 @@ const skills = {
check(event, player) {
return get.attitude(player, event.player) > 0;
},
- content() {
+ async content(event, trigger, player) {
+ const target = trigger.player;
player.awakenSkill(event.name);
- trigger.player.draw(3);
- trigger.player.addTempSkill("bihuo_effect", "roundStart");
- trigger.player.addMark("bihuo_effect", game.countPlayer(), false);
+ await target.draw(3);
+ target.addTempSkill("bihuo_effect", "roundStart");
+ target.addMark("bihuo_effect", game.countPlayer(), false);
},
subSkill: {
effect: {
diff --git a/character/mobile/translate.js b/character/mobile/translate.js
index 71598607a1..adfc12a6eb 100644
--- a/character/mobile/translate.js
+++ b/character/mobile/translate.js
@@ -1034,7 +1034,7 @@ const translates = {
mbyuanmo_info: "每回合限两次,准备阶段或当你受到伤害后,你可以移动场上的一张牌,然后你可以令因此失去牌的角色摸X张牌(X为其攻击范围内因此减少的角色数且至多为5)",
wuke: "吴珂",
mbzhuguo: "助国",
- mbzhuguo_info: "出牌阶段限一次,你可令一名角色将手牌调整至体力上限。然后:若其没有摸牌,则回复1点体力;若其因此成为手牌数最多的角色,你可以选另一名角色,令其选择是否对你指定的另一名角色使用一张无距离限制的【杀】。",
+ mbzhuguo_info: "出牌阶段限一次,你可令一名角色将手牌调整至X(X为其体力上限且至多为5)。然后:若其没有摸牌,则回复1点体力;若其因此成为手牌数最多的角色,你可以选另一名角色,令其选择是否对你指定的另一名角色使用一张无距离限制的【杀】。",
mbanda: "谙达",
mbanda_info: "每回合限一次,当一名角色进入濒死状态时,你可令伤害来源交给其两张颜色不同的牌,否则该角色回复1点体力。",
mb_xingdaorong: "手杀邢道荣",
diff --git a/character/offline/skill.js b/character/offline/skill.js
index 077637a3f5..0654912a9e 100644
--- a/character/offline/skill.js
+++ b/character/offline/skill.js
@@ -16,30 +16,38 @@ const skills = {
},
async cost(event, trigger, player) {
const targets = game.filterPlayer(current => current != player);
- event.result = targets.length > 1 ? await player
- .chooseTarget(get.prompt2(event.skill), (card, player, target) => {
- if (target == player) {
- return false;
- }
- if (ui.selected.targets.length) {
- const targetx = ui.selected.targets[0];
- return target == targetx.getPrevious() || target == targetx.getNext();
- }
- return true;
- }, true, 2)
- .set("targetprompt", ["执行回合", "交换位置"])
- .set("complexTarget", true)
- .set("ai", target => {
- const att = get.attitude(get.player(), target);
- if (ui.selected.targets.length) {
- return -att;
- }
- return att;
- })
- .forResult() : {
- bool: true,
- targets: targets,
- };
+ event.result =
+ targets.length > 1
+ ? await player
+ .chooseTarget(
+ get.prompt2(event.skill),
+ (card, player, target) => {
+ if (target == player) {
+ return false;
+ }
+ if (ui.selected.targets.length) {
+ const targetx = ui.selected.targets[0];
+ return target == targetx.getPrevious() || target == targetx.getNext();
+ }
+ return true;
+ },
+ true,
+ 2
+ )
+ .set("targetprompt", ["执行回合", "交换位置"])
+ .set("complexTarget", true)
+ .set("ai", target => {
+ const att = get.attitude(get.player(), target);
+ if (ui.selected.targets.length) {
+ return -att;
+ }
+ return att;
+ })
+ .forResult()
+ : {
+ bool: true,
+ targets: targets,
+ };
},
async content(event, trigger, player) {
const targets = event.targets;
@@ -49,7 +57,7 @@ const skills = {
game.swapSeat(target1, target2);
},
player,
- targets[1],
+ targets[1]
);
}
await game.delay(3);
@@ -84,8 +92,7 @@ const skills = {
content(storage, player, skill) {
if (storage) {
return "所有角色的基本牌视为无次数限制的【杀】";
- }
- else if (storage === false) {
+ } else if (storage === false) {
return "所有角色与你互相计算距离为1,你视为拥有〖同忾〗";
}
return get.skillInfoTranslation(skill, player);
@@ -96,8 +103,7 @@ const skills = {
player.changeZhuanhuanji(event.name);
if (player.getStorage(event.name, false)) {
player.removeAdditionalSkill(event.name);
- }
- else {
+ } else {
player.addAdditionalSkill(event.name, ["petongkai"]);
}
},
@@ -120,16 +126,22 @@ const skills = {
viewas: {
mod: {
cardname(card, player) {
- if (game.hasPlayer(current => {
- return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true;
- }) && lib.card[card.name]?.type == "basic") {
+ if (
+ game.hasPlayer(current => {
+ return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true;
+ }) &&
+ lib.card[card.name]?.type == "basic"
+ ) {
return "sha";
}
},
cardUsable(card, player) {
- if (!game.hasPlayer(current => {
- return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true;
- }) || card.name != "sha") {
+ if (
+ !game.hasPlayer(current => {
+ return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true;
+ }) ||
+ card.name != "sha"
+ ) {
return;
}
if (!card.cards || card.cards.length != 1) {
@@ -138,7 +150,7 @@ const skills = {
if (get.suit(card) == "unsure" || lib.card[card.cards[0].name]?.type == "basic") {
return Infinity;
}
- }
+ },
},
},
},
@@ -155,12 +167,7 @@ const skills = {
async cost(event, trigger, player) {
const result = await player
.chooseControl(["选项一", "选项二", "选项三", "背水!", "cancel2"])
- .set("choiceList", [
- "选项一:摸一张牌",
- "选项二:回复1点体力",
- "选项三:使用一张牌",
- "背水,减少1点体力上限",
- ])
+ .set("choiceList", ["选项一:摸一张牌", "选项二:回复1点体力", "选项三:使用一张牌", "背水,减少1点体力上限"])
.set("displayIndex", false)
.set("ai", () => {
return get.player().hp <= 2 ? "选项二" : "选项一";
@@ -211,10 +218,7 @@ const skills = {
if (trigger.target == player) {
return;
}
- const result = await player
- .chooseToGive(true, "he", trigger.target)
- .set("visibleMove", true)
- .forResult();
+ const result = await player.chooseToGive(true, "he", trigger.target).set("visibleMove", true).forResult();
if (!result.bool) {
return;
}
@@ -247,7 +251,7 @@ const skills = {
game.swapSeat(target1, target2);
},
player,
- zhu.getPrevious(),
+ zhu.getPrevious()
);
}
let newzhu = game.findPlayer(i => i.getSeatNum() == 1);
@@ -291,7 +295,7 @@ const skills = {
target: "useCardToTarget",
},
filter(event, player) {
- return player.storage?.yjjiechu && event?.card.name === "sha"
+ return player.storage?.yjjiechu && event?.card.name === "sha";
},
async cost(event, trigger, player) {
let suits = [],
@@ -299,19 +303,21 @@ const skills = {
game.getAllGlobalHistory("everything", evt => {
if (evt.name == "damage" && evt.player == player && evt.card) {
suits.add(get.suit(evt.card));
- };
+ }
});
if (suits.includes(get.suit(trigger.card)) && player.hasSkill("pedaojue")) {
bool = true;
}
let list = lib.linked.slice(0).remove("kami");
- if (list.some(nature => {
- if (nature == trigger.card?.nature) {
- return false;
- }
- let card = new lib.element.VCard(trigger.card, trigger.cards, null, nature);
- return get.effect(player, card, trigger.player, player) > get.effect(player, trigger.card, trigger.player, player);
- })) {
+ if (
+ list.some(nature => {
+ if (nature == trigger.card?.nature) {
+ return false;
+ }
+ let card = new lib.element.VCard(trigger.card, trigger.cards, null, nature);
+ return get.effect(player, card, trigger.player, player) > get.effect(player, trigger.card, trigger.player, player);
+ })
+ ) {
bool = true;
}
event.result = await player
@@ -335,7 +341,7 @@ const skills = {
game.getAllGlobalHistory("everything", evt => {
if (evt.name == "damage" && evt.player == player && evt.card) {
records.remove(get.suit(evt.card));
- };
+ }
});
let nature = trigger.card.nature;
for (let i of natures) {
@@ -348,11 +354,7 @@ const skills = {
}
}
const result = await player
- .chooseButton([
- "劫出:改变此牌的花色和属性",
- [suits.map(i => ["", "", `lukai_${i}`]), "vcard"],
- [natures.map(i => [i, get.translation(i)]), "tdnodes"],
- ], 2, true)
+ .chooseButton(["劫出:改变此牌的花色和属性", [suits.map(i => ["", "", `lukai_${i}`]), "vcard"], [natures.map(i => [i, get.translation(i)]), "tdnodes"]], 2, true)
.set("filterButton", button => {
if (!ui.selected.buttons.length) {
return true;
@@ -386,9 +388,13 @@ const skills = {
suit = result.links[1][2].slice(6);
player.popup(get.translation(suit));
game.log(trigger.card, "被转为了", "#y" + get.translation(suit), "花色");
- game.broadcastAll((card, suit) => {
- card.suit = suit;
- }, trigger.card, suit);
+ game.broadcastAll(
+ (card, suit) => {
+ card.suit = suit;
+ },
+ trigger.card,
+ suit
+ );
player.popup(`${get.translation(naturex)}杀`, naturex);
game.log(trigger.card, "被转为了", "#y" + get.translation(naturex), "属性");
game.setNature(trigger.card, naturex);
@@ -399,7 +405,7 @@ const skills = {
player: "useCardAfter",
},
filter(event, player) {
- return event.targets.length && event?.card?.storage?.yjjiechu
+ return event.targets.length && event?.card?.storage?.yjjiechu;
},
charlotte: true,
silent: true,
@@ -417,7 +423,7 @@ const skills = {
.set("targetRequired", true)
.set("complexSelect", true)
.set("filterTarget", function (card, player, target) {
- const sourcex = get.event("sourcex")
+ const sourcex = get.event("sourcex");
if (target !== sourcex && !ui.selected.targets.includes(sourcex)) {
return false;
}
@@ -440,10 +446,10 @@ const skills = {
filterCard: () => false,
selectCard: -1,
viewAsFilter(player) {
- return !player.storage?.yjjiechu
+ return !player.storage?.yjjiechu;
},
precontent() {
- player.addTempSkill("yjjiechu_effect")
+ player.addTempSkill("yjjiechu_effect");
player.changeZhuanhuanji("yjjiechu");
},
},
@@ -463,7 +469,7 @@ const skills = {
player: "useCardAfter",
},
filter(event, player) {
- return player.getAllHistory("useCard", (evt) => evt.getParent(3).skill === "yjdaojue_effect").length === 3
+ return player.getAllHistory("useCard", evt => evt.getParent(3).skill === "yjdaojue_effect").length === 3;
},
skillAnimation: true,
animationColor: "metal",
@@ -472,10 +478,10 @@ const skills = {
async content(event, trigger, player) {
player.awakenSkill("yjdaojue");
player.removeTip("yjdaojue");
- player.popup("袁绍")
- await player.removeSkills("yjjiechu")
- await player.changeGroup("qun")
- await player.addSkills(["olsbshenli", "yjzhuni", "olsbshishou"])
+ player.popup("袁绍");
+ await player.removeSkills("yjjiechu");
+ await player.changeGroup("qun");
+ await player.addSkills(["olsbshenli", "yjzhuni", "olsbshishou"]);
},
},
achieve: {
@@ -488,15 +494,20 @@ const skills = {
forced: true,
locked: false,
filter(event, player) {
- return player.getAllHistory("gain", (evt) => evt.getParent(2).skill === "yjdaojue_effect").map(c => c.cards.length).reduce((sum, cur) => sum + cur, 0) >= 3;
+ return (
+ player
+ .getAllHistory("gain", evt => evt.getParent(2).skill === "yjdaojue_effect")
+ .map(c => c.cards.length)
+ .reduce((sum, cur) => sum + cur, 0) >= 3
+ );
},
async content(event, trigger, player) {
player.awakenSkill("yjdaojue");
player.removeTip("yjdaojue");
- player.popup("曹操")
- await player.removeSkills("yjjiechu")
- await player.changeGroup("wei")
- await player.addSkills(["yjzhian", "yjqingzheng", "rehujia"])
+ player.popup("曹操");
+ await player.removeSkills("yjjiechu");
+ await player.changeGroup("wei");
+ await player.addSkills(["yjzhian", "yjqingzheng", "rehujia"]);
},
},
effect: {
@@ -507,69 +518,93 @@ const skills = {
forced: true,
locked: false,
filter(event, player) {
- return get.itemtype(event.cards) == "cards" && game.getAllGlobalHistory(
- "everything",
- evt => {
- return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player) === get.suit(event?.card, player);
- },
- event
- ).length === 1
+ return (
+ get.itemtype(event.cards) == "cards" &&
+ game.getAllGlobalHistory(
+ "everything",
+ evt => {
+ return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player) === get.suit(event?.card, player);
+ },
+ event
+ ).length === 1
+ );
},
async content(event, trigger, player) {
trigger.cancel();
- player.addTip("yjdaojue", "道抉 " + game.getAllGlobalHistory(
- "everything",
- evt => {
- return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player);
- },
- trigger
- ).map(c => get.suit(c?.card, player)).unique().reduce((str, i) => str + get.translation(i), ""))
+ player.addTip(
+ "yjdaojue",
+ "道抉 " +
+ game
+ .getAllGlobalHistory(
+ "everything",
+ evt => {
+ return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player);
+ },
+ trigger
+ )
+ .map(c => get.suit(c?.card, player))
+ .unique()
+ .reduce((str, i) => str + get.translation(i), "")
+ );
const card = trigger.cards.filter(c => get.position(c, true) === "o");
if (!card.length) {
if (player.hasUsableCard("sha", "use")) {
await player
- .chooseToUse(function (card, player, event) {
- if (get.name(card) !== "sha") {
- return false;
- }
- return lib.filter.filterCard.apply(this, arguments);
- }, "对所有角色使用一张杀", true)
+ .chooseToUse(
+ function (card, player, event) {
+ if (get.name(card) !== "sha") {
+ return false;
+ }
+ return lib.filter.filterCard.apply(this, arguments);
+ },
+ "对所有角色使用一张杀",
+ true
+ )
.set("targetRequired", true)
.set("complexSelect", true)
.set("selectTarget", -1)
.set("filterTarget", function (card, player, target) {
return lib.filter.targetEnabled.apply(this, arguments);
- })
- return
+ });
+ return;
}
}
const result = await player
- .chooseControlList(
- get.prompt(event.name),
- ["获得" + get.translation(card), "使用一张指定所有其他角色的【杀】。"], true)
+ .chooseControlList(get.prompt(event.name), ["获得" + get.translation(card), "使用一张指定所有其他角色的【杀】。"], true)
.set("ai", () => {
- if (get.event("card").map(c => get.value(c)).reduce((sum, cur) => sum + cur, 0) > 4) {
+ if (
+ get
+ .event("card")
+ .map(c => get.value(c))
+ .reduce((sum, cur) => sum + cur, 0) > 4
+ ) {
return 0;
} else {
return 1;
}
- }).set("card", card).forResult();
+ })
+ .set("card", card)
+ .forResult();
if (result.index === 0) {
- await player.gain(card, "gain2", "log")
+ await player.gain(card, "gain2", "log");
} else if (player.hasUsableCard("sha", "use")) {
await player
- .chooseToUse(function (card, player, event) {
- if (get.name(card) !== "sha") {
- return false;
- }
- return lib.filter.filterCard.apply(this, arguments);
- }, "对所有角色使用一张杀", true)
+ .chooseToUse(
+ function (card, player, event) {
+ if (get.name(card) !== "sha") {
+ return false;
+ }
+ return lib.filter.filterCard.apply(this, arguments);
+ },
+ "对所有角色使用一张杀",
+ true
+ )
.set("targetRequired", true)
.set("complexSelect", true)
.set("selectTarget", -1)
.set("filterTarget", function (card, player, target) {
return lib.filter.targetEnabled.apply(this, arguments);
- })
+ });
}
},
},
@@ -592,26 +627,20 @@ const skills = {
async cost(event, trigger, player) {
const cards = trigger.cards?.filterInD("ejod") || [];
let list = ["选项一", "选项二", "选项三", "cancel2"],
- choiceList = [
- `弃置一张手牌${cards.length ? `并获得${get.translation(cards)}` : ""}`,
- "回复1点体力,此技能本轮失效",
- `对${get.translation(trigger.player)}造成${get.cnNumber(Math.max(1, player.getDamagedHp()))}点伤害,获得〖飞影〗并删去此项`,
- ];
+ choiceList = [`弃置一张手牌${cards.length ? `并获得${get.translation(cards)}` : ""}`, "回复1点体力,此技能本轮失效", `对${get.translation(trigger.player)}造成${get.cnNumber(Math.max(1, player.getDamagedHp()))}点伤害,获得〖飞影〗并删去此项`];
let choice = "cancel2";
if (player.isDamaged()) {
if (player.hp <= 1) {
choice = "选项二";
}
- }
- else {
+ } else {
list.remove("选项二");
choiceList[1] = `${choiceList[1]}`;
}
if (!player.countCards("h")) {
list.remove("选项一");
choiceList[0] = `${choiceList[0]}`;
- }
- else {
+ } else {
if (cards.length && player.hp > 1) {
let result = 0,
card = trigger.card,
@@ -623,12 +652,17 @@ const skills = {
} else {
result += (get.value(card, owner) - 0.01) * get.sgn(get.attitude(player, owner));
}
- }
- else {
+ } else {
result += cards.reduce((sum, i) => sum + get.value(i, player), 0);
}
result -= get.recoverEffect(player);
- if (result > player.getCards("h").map(i => get.value(i)).minBy(i => i)) {
+ if (
+ result >
+ player
+ .getCards("h")
+ .map(i => get.value(i))
+ .minBy(i => i)
+ ) {
choice = "选项一";
}
}
@@ -636,8 +670,7 @@ const skills = {
if (player.hasSkill("yjzhian_delete")) {
list.remove("选项三");
choiceList[2] = `${choiceList[2]}`;
- }
- else if (get.damageEffect(trigger.player, player) > 0 && choice == "cancel2") {
+ } else if (get.damageEffect(trigger.player, player) > 0 && choice == "cancel2") {
choice = "选项三";
}
const result = await player
@@ -771,17 +804,20 @@ const skills = {
if (!skills.length) {
return;
}
- const result = skills.length > 1 ? await player
- .chooseButton(["脱难:失去一个有标签的技能", [skills, "skill"]], true)
- .set("displayIndex", false)
- .set("ai", button => {
- const { link } = button;
- if (link == "petuonan") {
- return 2;
- }
- return 1;
- })
- .forResult() : { bool: true, links: skills };
+ const result =
+ skills.length > 1
+ ? await player
+ .chooseButton(["脱难:失去一个有标签的技能", [skills, "skill"]], true)
+ .set("displayIndex", false)
+ .set("ai", button => {
+ const { link } = button;
+ if (link == "petuonan") {
+ return 2;
+ }
+ return 1;
+ })
+ .forResult()
+ : { bool: true, links: skills };
if (result?.bool && result?.links?.length) {
await player.removeSkills(result.links);
}
@@ -3013,6 +3049,9 @@ const skills = {
if (get.is.playerNames(target, "zombie_zombie")) {
return false;
}
+ if (event.reserveOut) {
+ return false;
+ }
return player.hasAllHistory("useSkill", evt => {
if (evt.type !== "player") {
return false;
@@ -3051,7 +3090,7 @@ const skills = {
.forResult()
: { control: names[0] };
if (result.control) {
- target.revive(2);
+ await target.revive(2);
let doubleDraw = false;
let num = (get.character("zombie_zombie").maxHp || get.character("zombie_zombie").hp) - (get.character(result.control).maxHp || get.character(result.control).hp);
if (num !== 0) {
@@ -3257,12 +3296,14 @@ const skills = {
const getEnemies = function (func, includeDie) {
if (this["zombieshibian"]) {
return this["zombieshibian"].getEnemies(func, includeDie);
- }
- else {
+ } else {
const player = this;
- return [...origin_getEnemies.apply(this, arguments), ...game[includeDie ? "filterPlayer2" : "filterPlayer"](target => {
- return origin_getEnemies.apply(this, arguments).includes(target["zombieshibian"] || target);
- })]
+ return [
+ ...origin_getEnemies.apply(this, arguments),
+ ...game[includeDie ? "filterPlayer2" : "filterPlayer"](target => {
+ return origin_getEnemies.apply(this, arguments).includes(target["zombieshibian"] || target);
+ }),
+ ]
.filter(i => player != (i["zombieshibian"] || i))
.unique()
.sortBySeat(player);
diff --git a/character/rank.js b/character/rank.js
index 12352ae759..7a0ce42057 100644
--- a/character/rank.js
+++ b/character/rank.js
@@ -1161,6 +1161,7 @@ window.noname_character_rank = {
"xin_panzhangmazhong",
"sp_mifuren",
"xin_caozhen",
+ "tw_yanpu",
"yanpu",
"re_xiahoushi",
"tw_caocao",
@@ -1206,6 +1207,8 @@ window.noname_character_rank = {
"duanwei",
"wangjun",
"xin_zhuzhi",
+ "tw_zhuzhi",
+ "tw_zhuzhi",
"tw_xiahouen",
"tw_yl_luzhi",
"re_zhangsong",
@@ -2278,6 +2281,7 @@ window.noname_character_rank = {
"sb_liubei",
"sb_fazheng",
"sb_chengong",
+ "tw_sb_chengong",
"sb_yuanshao",
"sb_pangtong",
"sb_xiaoqiao",
@@ -2697,6 +2701,7 @@ window.noname_character_rank = {
"sxrm_caocao",
],
epic: [
+ "yj_caocaoyuanshao",
"v_caopi",
"ca_lijue",
"dc_sb_liuxie",
@@ -4145,6 +4150,7 @@ window.noname_character_rank = {
"ruanhui",
"re_wuguotai",
"yanpu",
+ "tw_yanpu",
"xin_caozhen",
"xin_guyong",
"ol_yujin",
@@ -4530,6 +4536,7 @@ window.noname_character_rank = {
"sb_ganning",
"sb_jiangwei",
"sb_chengong",
+ "tw_sb_chengong",
"sb_yuanshao",
"sb_pangtong",
"sb_menghuo",
diff --git a/character/refresh/skill.js b/character/refresh/skill.js
index aa2f8171f4..1488dc5dea 100644
--- a/character/refresh/skill.js
+++ b/character/refresh/skill.js
@@ -2251,7 +2251,7 @@ const skills = {
result = await trigger.source.chooseToDiscard("智愚:请弃置一张手牌", true).forResult();
}
let cards = player.getCards("h");
- const bool = cards.map(card => get.color(card, player)).unique();
+ const bool = cards.map(card => get.color(card, player)).unique().length == 1;
if (bool) {
cards = result.cards.filterInD("d");
if (cards.length) {
diff --git a/character/replace.js b/character/replace.js
index 9918dc26a7..d2ef166542 100644
--- a/character/replace.js
+++ b/character/replace.js
@@ -48,7 +48,7 @@ window.noname_character_replace = {
chendao: ["chendao", "pot_chendao", "ns_chendao", "old_chendao"],
chendeng: ["chendeng", "ol_chendeng", "re_chendeng", "jsrg_chendeng"],
chendong: ["chendong", "sp_chendong", "tw_chendong"],
- chengong: ["chengong", "re_chengong", "sb_chengong"],
+ chengong: ["chengong", "re_chengong", "sb_chengong", "tw_sb_chengong"],
chengpu: ["chengpu", "ol_chengpu", "xin_chengpu", "re_chengpu", "tw_chengpu", "std_chengpu", "ns_chengpu"],
chengui: ["chengui", "mb_chengui"],
chengyu: ["chengyu", "dc_sb_chengyu", "std_chengyu"],
@@ -356,7 +356,7 @@ window.noname_character_replace = {
zhuling: ["ol_zhuling", "dc_zhuling", "zhuling"],
zhuran: ["zhuran", "re_zhuran", "xin_zhuran", "old_zhuran"],
zhurong: ["zhurong", "ol_zhurong", "re_zhurong", "sb_zhurong", "dc_sp_zhurong"],
- zhuzhi: ["zhuzhi", "re_zhuzhi", "xin_zhuzhi", "old_zhuzhi"],
+ zhuzhi: ["zhuzhi", "re_zhuzhi", "xin_zhuzhi", "tw_zhuzhi", "old_zhuzhi"],
zongyu: ["zongyu", "sp_zongyu", "tw_zongyu"],
zoushi: ["zoushi", "re_zoushi", "yue_zoushi", "jsrg_zoushi", "std_zoushi"],
zumao: ["zumao", "tw_zumao"],
@@ -415,4 +415,5 @@ window.noname_character_replace = {
zerong: ["zerong", "std_zerong"],
tw_zhugejun: ["tw_zhugejun", "dc_zhugejun"],
wufu: ["wufu", "hr_wufu"],
+ yanpu: ["yanpu", "tw_yanpu"],
};
diff --git a/character/sb/skill.js b/character/sb/skill.js
index 3f28f13f90..943dd8e9af 100644
--- a/character/sb/skill.js
+++ b/character/sb/skill.js
@@ -74,7 +74,7 @@ const skills = {
},
popup: false,
async cost(event, trigger, player) {
- event.result = await player.gainPlayerCard(get.prompt2(event.skill), trigger.player, "hej", [1, trigger.num]).set("chooseOnly", true).forResult();
+ event.result = await player.gainPlayerCard(get.prompt2(event.skill), trigger.player, "hej", [1, trigger.num]).set("chooseonly", true).forResult();
},
async content(event, trigger, player) {
const cards = event.cards;
@@ -5695,35 +5695,36 @@ const skills = {
delay: false,
onremove: true,
group: "sbmingce_hit",
- content() {
- "step 0";
- player.give(cards, target);
- "step 1";
- var choices = ["选项二"];
- var choiceList = ["失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", "摸一张牌"];
+ async content(event, trigger, player) {
+ const { cards } = event,
+ { target } = event;
+ await player.give(cards, target);
+ let choices = ["选项二"],
+ choiceList = ["失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", "摸一张牌"];
if (target.hp > 0) {
choices.unshift("选项一");
} else {
choiceList[0] = '' + choiceList[0] + "";
}
- target
+ const result = await target
.chooseControl(choices)
.set("choiceList", choiceList)
.set("prompt", get.translation(player) + "对你发动了【明策】,请选择一项")
.set("ai", () => {
return _status.event.choice;
})
- .set("choice", target.hp <= 0 || (((target.hp + target.countCards("hs", "tao") > 2 && get.attitude(target, player) > 0) || get.effect(target, { name: "losehp" }, target, target) > 0) && target.hp > 0) ? 0 : 1);
- "step 2";
+ .set("choice", target.hp <= 0 || (((target.hp + target.countCards("hs", "tao") > 2 && get.attitude(target, player) > 0) || get.effect(target, { name: "losehp" }, target, target) > 0) && target.hp > 0) ? 0 : 1)
+ .forResult();
+ if (!result) {
+ return;
+ }
if (result.control == "选项一") {
- target.loseHp();
- player.draw(2);
+ await target.loseHp();
+ await player.draw(2);
+ player.addMark("sbmingce", 1);
} else {
- target.draw();
- event.finish();
+ await target.draw();
}
- "step 3";
- player.addMark("sbmingce", 1);
},
marktext: "笨",
intro: {
@@ -5746,27 +5747,26 @@ const skills = {
filter(event, player) {
return player.hasMark("sbmingce");
},
- direct: true,
- content() {
- "step 0";
- var num = player.countMark("sbmingce");
- event.num = num;
- player.chooseTarget(get.prompt("sbmingce"), "移去所有“策”,对一名其他角色造成" + num + "点伤害", lib.filter.notMe).set("ai", target => {
- var player = _status.event.player;
- var eff = get.damageEffect(target, player, player);
- var num = player.countMark("sbmingce");
- if (target.hasSkillTag("filterDamage", null, { player: player })) {
- num = 1;
- }
- return eff * num;
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("sbmingce_hit", target);
- player.removeMark("sbmingce", num);
- target.damage(num);
- }
+ async cost(event, trigger, player) {
+ const num = player.countMark("sbmingce");
+ event.result = await player
+ .chooseTarget(get.prompt("sbmingce"), "移去所有“策”,对一名其他角色造成" + num + "点伤害", lib.filter.notMe)
+ .set("ai", target => {
+ var player = _status.event.player;
+ var eff = get.damageEffect(target, player, player);
+ var num = player.countMark("sbmingce");
+ if (target.hasSkillTag("filterDamage", null, { player: player })) {
+ num = 1;
+ }
+ return eff * num;
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0],
+ num = player.countMark("sbmingce");
+ player.removeMark("sbmingce", num);
+ await target.damage(num);
},
},
},
@@ -5775,7 +5775,7 @@ const skills = {
audio: 2,
trigger: { player: "damageEnd" },
forced: true,
- content() {
+ async content(event, trigger, player) {
player.addTempSkill("sbzhichi_muteki");
},
subSkill: {
@@ -5785,7 +5785,7 @@ const skills = {
charlotte: true,
forced: true,
group: "sbzhichi_egg",
- content() {
+ async content(event, trigger, player) {
trigger.cancel();
},
mark: true,
@@ -5811,7 +5811,7 @@ const skills = {
forced: true,
silent: true,
forceDie: true,
- content() {
+ async content(event, trigger, player) {
player.chat("你是真滴牛批");
},
},
@@ -10436,36 +10436,38 @@ const skills = {
return;
}
do {
- const { result } = cards.length > 1 ? await player
- .chooseButtonTarget({
- createDialog: [`连营:请选择要分配的牌和目标`, cards],
- forced: true,
- selectButton: [1, Infinity],
- cardsx: cards,
- ai1(button) {
- return get.value(button.link);
- },
- ai2(target) {
- const player = get.player();
- const card = ui.selected.buttons[0].link;
- if (card) {
- return get.value(card, target) * get.attitude(player, target);
- }
- return 1;
- },
- }) : await player
- .chooseTarget("选择一名角色获得" + get.translation(cards), true)
- .set("ai", target => {
- const 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(cards[0], player, "raw") < 0);
+ const { result } =
+ cards.length > 1
+ ? await player.chooseButtonTarget({
+ createDialog: [`连营:请选择要分配的牌和目标`, cards],
+ forced: true,
+ selectButton: [1, Infinity],
+ cardsx: cards,
+ ai1(button) {
+ return get.value(button.link);
+ },
+ ai2(target) {
+ const player = get.player();
+ const card = ui.selected.buttons[0].link;
+ if (card) {
+ return get.value(card, target) * get.attitude(player, target);
+ }
+ return 1;
+ },
+ })
+ : await player
+ .chooseTarget("选择一名角色获得" + get.translation(cards), true)
+ .set("ai", target => {
+ const 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(cards[0], player, "raw") < 0);
if (result.bool) {
if (!result.links?.length) {
result.links = cards.slice(0);
diff --git a/character/sixiang/skill.js b/character/sixiang/skill.js
index 439ebefdfa..1f02aacf84 100644
--- a/character/sixiang/skill.js
+++ b/character/sixiang/skill.js
@@ -102,14 +102,20 @@ const skills = {
backup(links, player) {
return {
audio: "fjzhitu",
- filterCard: true,
+ filterCard(card, player) {
+ const selected = ui.selected.cards;
+ if (!selected.length) {
+ return true;
+ }
+ return get.number(card, player) + selected.reduce((sum, card) => (sum + get.number(card, get.player())), 0) <= 13;
+ },
selectCard: [2, Infinity],
filterOk() {
const selected = ui.selected.cards;
if (!selected.length) {
return false;
}
- return selected.reduce((sum, card) => (sum += get.number(card, get.player())), 0) >= 13;
+ return selected.reduce((sum, card) => (sum + get.number(card, get.player())), 0) == 13;
},
ai1(card) {
const player = get.player();
diff --git a/character/sp/skill.js b/character/sp/skill.js
index 24fc34f59d..491d4cda82 100644
--- a/character/sp/skill.js
+++ b/character/sp/skill.js
@@ -150,6 +150,9 @@ const skills = {
},
//OL张曼成 —— by 星の语
olkuangxin: {
+ init(player) {
+ player.addSkill("olkuangxin_record");
+ },
audio: 2,
trigger: { player: "phaseUseBegin" },
forced: true,
@@ -187,6 +190,42 @@ const skills = {
intro: {
content: "上次展示了#张牌",
},
+ group: ["olkuangxin_recover"],
+ subSkill: {
+ record: {
+ trigger: { player: ["phaseZhunbeiAfter", "phaseBefore", "enterGame"] },
+ lastDo: true,
+ charlotte: true,
+ forced: true,
+ popup: false,
+ forceDie: true,
+ filter(event, player) {
+ return event.name != "phase" || game.phaseNumber == 0;
+ },
+ content() {
+ if (!_status.olkuangxin) {
+ _status.olkuangxin = {};
+ }
+ _status.olkuangxin = player.hp;
+ },
+ },
+ recover: {
+ trigger: { player: "phaseJieshuBegin" },
+ filter(event, player) {
+ return _status.olkuangxin > 0;
+ },
+ forced: true,
+ locked: false,
+ async content(event, trigger, player) {
+ const num = _status.olkuangxin - player.hp;
+ if (num > 0) {
+ await player.recover(num);
+ } else if (num < 0) {
+ await player.loseHp(num);
+ }
+ },
+ },
+ },
},
olleishi: {
audio: 2,
@@ -222,9 +261,7 @@ const skills = {
return;
}
const resultx = await player
- .chooseTarget(`雷噬:对一名目标角色造成一点雷电伤害`, true, (card, player, target) => {
- return get.event().targets.includes(target);
- })
+ .chooseTarget(`雷噬:对一名角色造成一点雷电伤害`, true)
.set("targets", targets)
.set("ai", target => get.damageEffect(target, get.player(), get.player(), "thunder"))
.forResult();
@@ -1322,7 +1359,7 @@ const skills = {
.set("target", target)
.forResult("bool");
if (!bool) {
- await player.damage(1, target);
+ await player.damage(1, target, "thunder");
}
},
},
@@ -35476,39 +35513,42 @@ const skills = {
});
}
do {
- const { result } = cards.length > 1 ? await player
- .chooseButtonTarget({
- createDialog: [`礼让:是否分配本次弃置的牌?`, cards],
- selectButton: [1, Infinity],
- cardsx: cards,
- filterTarget: lib.filter.notMe,
- ai1(button) {
- return get.value(button.link);
- },
- canHidden: true,
- ai2(target) {
- const player = get.player();
- const card = ui.selected.buttons[0].link;
- if (card) {
- return get.value(card, target) * get.attitude(player, target);
- }
- return 1;
- },
- })
- .setHiddenSkill("lirang") : await player
- .chooseTarget(`礼让:是否令一名角色获得${get.translation(cards)}?`, lib.filter.notMe)
- .set("ai", target => {
- const 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;
- }
- })
- .setHiddenSkill("lirang")
- .set("enemy", get.value(cards[0], player, "raw") < 0);
+ const { result } =
+ cards.length > 1
+ ? await player
+ .chooseButtonTarget({
+ createDialog: [`礼让:是否分配本次弃置的牌?`, cards],
+ selectButton: [1, Infinity],
+ cardsx: cards,
+ filterTarget: lib.filter.notMe,
+ ai1(button) {
+ return get.value(button.link);
+ },
+ canHidden: true,
+ ai2(target) {
+ const player = get.player();
+ const card = ui.selected.buttons[0].link;
+ if (card) {
+ return get.value(card, target) * get.attitude(player, target);
+ }
+ return 1;
+ },
+ })
+ .setHiddenSkill("lirang")
+ : await player
+ .chooseTarget(`礼让:是否令一名角色获得${get.translation(cards)}?`, lib.filter.notMe)
+ .set("ai", target => {
+ const 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;
+ }
+ })
+ .setHiddenSkill("lirang")
+ .set("enemy", get.value(cards[0], player, "raw") < 0);
if (result?.bool) {
if (!result.links?.length) {
result.links = cards.slice(0);
@@ -35519,8 +35559,7 @@ const skills = {
give_map[id] = [];
}
give_map[id].addArray(result.links);
- }
- else {
+ } else {
break;
}
} while (cards.length > 0);
@@ -35541,14 +35580,16 @@ const skills = {
bool: targets.length > 0,
targets: targets?.sortBySeat(),
cost_data: lose_list,
- }
+ };
},
async content(event, trigger, player) {
- await game.loseAsync({
- gain_list: event.cost_data,
- giver: player,
- animate: "gain2",
- }).setContent("gaincardMultiple");
+ await game
+ .loseAsync({
+ gain_list: event.cost_data,
+ giver: player,
+ animate: "gain2",
+ })
+ .setContent("gaincardMultiple");
},
ai: {
expose: 0.1,
diff --git a/character/sp/translate.js b/character/sp/translate.js
index 35dbedfca9..6529cd321d 100644
--- a/character/sp/translate.js
+++ b/character/sp/translate.js
@@ -1513,10 +1513,10 @@ const translates = {
ol_zhangmancheng: "OL张曼成",
ol_zhangmancheng_prefix: "OL",
olkuangxin: "狂信",
- olkuangxin_info: "锁定技,出牌阶段开始时,你失去任意点体力,摸等量的牌并展示已损失体力值+1张手牌。",
+ olkuangxin_info: "锁定技,出牌阶段开始时,你失去任意点体力,摸等量的牌并展示已损失体力值+1张手牌。结束阶段,你调整体力值与上个准备阶段结束后相同。",
olleishi: "雷噬",
olleishi_judge: "雷噬·判定",
- olleishi_info: "出牌阶段限X次(X为你上次发动〖狂信〗展示牌的数量),你使用本回合展示过的牌结算完成后,可进行一次判定并获得判定牌,若判定结果与使用牌的花色:相同,你对一名目标角色造成一点雷电伤害;不同,你展示一张牌,本回合下次判定时,若此牌在你的手牌区内,将此牌作为判定牌。",
+ olleishi_info: "出牌阶段限X次(X为你上次发动〖狂信〗展示牌的数量),你使用本回合展示过的牌结算完成后,可进行一次判定并获得判定牌,若判定结果与使用牌的花色:相同,你对一名角色造成一点雷电伤害;不同,你展示一张牌,本回合下次判定时,若此牌在你的手牌区内,将此牌作为判定牌。",
ol_caizhenji: "OL蔡贞姬",
ol_caizhenji_prefix: "OL",
olkedi: "柯笛",
diff --git a/character/sxrm/intro.js b/character/sxrm/intro.js
index 134b627abe..5d819fc77f 100644
--- a/character/sxrm/intro.js
+++ b/character/sxrm/intro.js
@@ -1,5 +1,6 @@
const characterIntro = {
- sxrm_caocao: " “将军,魏王邀你去回忆中一叙。”
“眼见未必为真,请务必保持清醒。”",
+ sxrm_wanghou: "王垕是罗贯中创作的小说《三国演义》及其衍生作品中的角色,于小说第十七回登场,为曹操征讨袁术时管粮官任峻部下仓官,后被曹操冤杀。人名不见于正史记载,事件原型源于《三国志》裴松之注引的《曹瞒传》。",
+ sxrm_caocao: " “将军,魏王邀你去回忆中一叙。”
“眼见未必为真,请务必保持清醒。”",
};
export default characterIntro;
diff --git a/character/tw/character.js b/character/tw/character.js
index 36ab5f2c30..3867cf4f50 100644
--- a/character/tw/character.js
+++ b/character/tw/character.js
@@ -1,4 +1,28 @@
const characters = {
+ tw_sb_chengong: {
+ sex: "male",
+ group: "qun",
+ hp: 3,
+ skills: ["twmingce", "sbzhichi"],
+ dieAudios: ["sb_chengong"],
+ img: "image/character/sb_chengong.jpg",
+ },
+ tw_yanpu: {
+ sex: "male",
+ group: "qun",
+ hp: 3,
+ skills: ["twhuantu", "twbihuo"],
+ dieAudios: ["yanpu"],
+ img: "image/character/yanpu.jpg",
+ },
+ tw_zhuzhi: {
+ sex: "male",
+ group: "wu",
+ hp: 4,
+ skills: ["twanguo"],
+ dieAudios: ["xin_zhuzhi"],
+ img: "image/character/xin_zhuzhi.jpg",
+ },
huan_dianwei: {
sex: "male",
group: "wei",
diff --git a/character/tw/skill.js b/character/tw/skill.js
index 276ab41832..b36dc74d7e 100644
--- a/character/tw/skill.js
+++ b/character/tw/skill.js
@@ -2,6 +2,524 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
/** @type { importCharacterConfig['skill'] } */
const skills = {
+ //TW朱治
+ twanguo: {
+ audio: "sbanguo",
+ trigger: { global: "phaseBefore", player: "enterGame" },
+ group: ["twanguo_move", "twanguo_draw", "twanguo_dying"],
+ logAudio: () => 2,
+ filter(event, player) {
+ return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0);
+ },
+ async cost(event, trigger, player) {
+ event.result = await player.chooseTarget("安国:令一名其他角色获得“安国”标记", lib.filter.notMe, true).forResult();
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ target.markAuto(event.name + "_effect", ["draw", "handcard", "dying"]);
+ target.addMark(event.name + "_mark", 1);
+ target.addAdditionalSkill(event.name + "_" + player.playerid, event.name + "_mark");
+ },
+ subSkill: {
+ mark: {
+ onremove: ["twanguo_mark", "twanguo_effect"],
+ marktext: "安",
+ charlotte: true,
+ intro: {
+ name: "安国",
+ name2: "安国",
+ content(storage, player, skill) {
+ let str = "目前拥有的效果:";
+ const effect = player.getStorage("twanguo_effect");
+ if (!effect?.length) {
+ str += "
无";
+ } else {
+ effect.forEach(name => {
+ switch (name) {
+ case "draw":
+ str += "