diff --git a/apps/core/character/sxrm/character.js b/apps/core/character/sxrm/character.js
index b9e89b2d80..fe0a902b3c 100644
--- a/apps/core/character/sxrm/character.js
+++ b/apps/core/character/sxrm/character.js
@@ -7,6 +7,56 @@ const characters = {
skills: ["sxrmjiehuo", "sxrmxianger", "sxrmmieguo"],
groupInGuozhan: "wu",
},
+ sxrm_sunshangxiang: {
+ sex: "female",
+ group: "wu",
+ hp: 3,
+ skills: ["sxrmjiaozong", "sxrmfusui"],
+ },
+ sxrm_zhangzhao: {
+ sex: "male",
+ group: "wu",
+ hp: 3,
+ skills: ["sxrmxiezhong", "sxrmqishi"],
+ },
+ sxrm_lusu: {
+ sex: "male",
+ group: "wu",
+ hp: 3,
+ skills: ["sxrmwanli", "sxrmlishui"],
+ },
+ sxrm_chen_caocao: {
+ sex: "male",
+ group: "wei",
+ hp: 4,
+ skills: ["sxrmlanjiao"],
+ },
+ sxrm_zhugeliang: {
+ sex: "male",
+ group: "shu",
+ hp: 3,
+ skills: ["sxrmbingqu", "sxrmfanxin"],
+ groupBorder: "shen",
+ names: "诸葛|亮",
+ },
+ sxrm_jiahua: {
+ sex: "male",
+ group: "wu",
+ hp: 5,
+ skills: ["sxrmfubei", "sxrmdancui"],
+ },
+ sxrm_zhaoyun: {
+ sex: "male",
+ group: "shu",
+ hp: 4,
+ skills: ["sxrmzhaduo"],
+ },
+ sxrm_caoren: {
+ sex: "male",
+ group: "wei",
+ hp: 4,
+ skills: ["sxrmyangbei", "sxrmyinfeng"],
+ },
//慢
sxrm_guanyu: {
sex: "male",
diff --git a/apps/core/character/sxrm/characterTitle.js b/apps/core/character/sxrm/characterTitle.js
index c9d11e76b7..f37b6cb012 100644
--- a/apps/core/character/sxrm/characterTitle.js
+++ b/apps/core/character/sxrm/characterTitle.js
@@ -1,5 +1,13 @@
export default {
sxrm_zhouyu: "哀弦万耳惊",
+ sxrm_sunshangxiang: "生死相随",
+ sxrm_zhangzhao: "迂儒",
+ sxrm_lusu: "养虫成蛇",
+ sxrm_chen_caocao: "铜雀囚凰",
+ sxrm_zhugeliang: "人也神也",
+ sxrm_jiahua: "拔剑四顾",
+ sxrm_zhaoyun: "坐收渔利",
+ sxrm_caoren: "坚壳之蚌",
sxrm_guanyu: "四海仰鼻息",
sxrm_guanyinping: "天骄虎女",
diff --git a/apps/core/character/sxrm/dynamicTranslate.js b/apps/core/character/sxrm/dynamicTranslate.js
index 27b4498d84..e7a12346f1 100644
--- a/apps/core/character/sxrm/dynamicTranslate.js
+++ b/apps/core/character/sxrm/dynamicTranslate.js
@@ -1,6 +1,32 @@
import { lib, game, ui, get, ai, _status } from "noname";
const dynamicTranslates = {
+ sxrmdancui(player, skill) {
+ const bool = player.getStorage(skill, false);
+ let type = !bool ? get.poptip("sxrm_qidingSkill") : "锁定技";
+ let forced = !bool ? "可以" : "须";
+ return `${type}。当你造成伤害时,你${forced}弃置两张牌(无牌则不弃,不足则全弃),令此伤害+1。`;
+ },
+ sxrmqishi(player, skill) {
+ const bool = player.getStorage(skill, false);
+ let type = !bool ? get.poptip("sxrm_qidingSkill") : "锁定技";
+ let forced = !bool ? "可以" : "";
+ return `${type}。结束阶段,你${forced}获得本回合其他角色进入弃牌堆的至多五张牌,然后你跳过下个摸牌阶段。`;
+ },
+ sxrmbiyi(player, skill) {
+ const bool = player.getStorage(skill, false);
+ let sk = player.storage.sxrmfusui_skill;
+ let yang = sk ? `【${get.translation(sk)}】` : "无技能",
+ yin = "【枭姬】";
+ if (bool) {
+ yin = `${yin}`;
+ } else {
+ yang = `${yang}`;
+ }
+ let start = "转换技,你视为拥有:",
+ end = "。当你发动上述对应技能后,切换本技能状态。";
+ return `${start}阳:${yang};阴:${yin}${end}`;
+ },
sxrmcongfeng(player, skill) {
const bool = player.getStorage(skill, false);
let yang = "与使用者各摸一张牌",
diff --git a/apps/core/character/sxrm/intro.js b/apps/core/character/sxrm/intro.js
index ea837540f1..69ef2a8891 100644
--- a/apps/core/character/sxrm/intro.js
+++ b/apps/core/character/sxrm/intro.js
@@ -2,6 +2,8 @@ const characterIntro = {
sxrm_wanghou: "王垕是罗贯中创作的小说《三国演义》及其衍生作品中的角色,于小说第十七回登场,为曹操征讨袁术时管粮官任峻部下仓官,后被曹操冤杀。人名不见于正史记载,事件原型源于《三国志》裴松之注引的《曹瞒传》。",
sxrm_caocao: " “将军,魏王邀你去回忆中一叙。”
“眼见未必为真,请务必保持清醒。”",
sxrm_guanyu: " “曹孟德,重逢之期指日可待。”
“彼时当与君共话此途之宵小————君亦居此。”",
+ sxrm_zhouyu: " “恨其诈,恨其黠,恨其狡,恨其奸,”
“恨其...不为吾所用。”",
+ sxrm_jiahua: "贾华,小说《三国演义》中的虚构人物,吴国大帝孙权部将,在京剧《甘露寺》中写作贾化。该角色初次登场于小说第五十三回,持方天画戟与宋谦共同护卫孙权攻打合肥,交战中兵器被乐进斩断;后奉命率三百刀斧手埋伏于甘露寺长廊,欲在吴国太不满刘备时擒杀之,后此计被识破,在民间衍生出“甘露寺的伏兵——假话(贾华)”的谚语。"
};
export default characterIntro;
diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js
index 2fc8635bf1..6cbd2fb17f 100644
--- a/apps/core/character/sxrm/skill.js
+++ b/apps/core/character/sxrm/skill.js
@@ -253,71 +253,1524 @@ const skills = {
game.countPlayer() <= num
? game.filterPlayer()
: (
- await target
- .chooseTarget({
- prompt: `选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`,
- selectTarget: num,
- forced: true,
- ai(target) {
- if (target === get.player()) {
- return 5;
- }
- return 1;
- },
- })
- .forResult()
- ).targets;
+ await target
+ .chooseTarget({
+ prompt: `选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`,
+ selectTarget: num,
+ forced: true,
+ ai(target) {
+ if (target === get.player()) {
+ return 5;
+ }
+ return 1;
+ },
+ })
+ .forResult()
+ ).targets;
if (!targetsx?.length) {
return;
}
- target.line(targetsx);
- player.addSkill("sxrmmieguo_ban");
- player.markAuto("sxrmmieguo_ban", targetsx);
- game.log(player, "执行了一个额外回合");
- player.insertPhase();
+ target.line(targetsx);
+ player.addSkill("sxrmmieguo_ban");
+ player.markAuto("sxrmmieguo_ban", targetsx);
+ game.log(player, "执行了一个额外回合");
+ player.insertPhase();
+ },
+ subSkill: {
+ ban: {
+ charlotte: true,
+ forced: true,
+ onremove: true,
+ popup: false,
+ intro: {
+ content(storage) {
+ if (!storage?.length) {
+ return "";
+ }
+ const list = [];
+ for (let i of storage) {
+ list.push(get.translation(i));
+ }
+ return "不能对" + list.join("、") + "使用牌";
+ },
+ },
+ mod: {
+ playerEnabled(card, player, target) {
+ if (player.getStorage("sxrmmieguo_ban")?.includes(target)) {
+ return false;
+ }
+ },
+ },
+ trigger: {
+ player: "phaseEnd",
+ },
+ filter(event, player) {
+ return event.skill === "sxrmmieguo";
+ },
+ async content(event, trigger, player) {
+ player.removeSkill(event.name);
+ if (!player.hasHistory("useCard")) {
+ game.log(player, "【灭虢】使命失败");
+ player.awakenSkill("sxrmmieguo");
+ await player.loseMaxHp();
+ }
+ },
+ },
+ },
+ },
+ //嗔孙尚香
+ sxrmjiaozong: {
+ audio: 2,
+ trigger: {
+ player: "phaseZhunbeiBegin",
+ target: "useCardToTargeted",
+ },
+ filter(event, player) {
+ if (event.name !== "phaseZhunbei" && event.card.name !== "sha") {
+ return false;
+ }
+ return player.canMoveCard(null, true);
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget({
+ prompt: get.prompt2("sxrmjiaozong"),
+ filterTarget(card, player, target) {
+ return target.hasCards("e", card => game.hasPlayer(current => current !== target && current.canEquip(card)));
+ },
+ ai(target) {
+ const player = get.player();
+ let val = Math.sign(get.attitude(player, target));
+ if (val > 0) {
+ if (target.hasSkill("xiaoji")) {
+ val += 4;
+ }
+ if (game.hasPlayer(current => get.attitude(player, current) < 0 && target.hasCards("e", card => get.color(card) === "red" && current.canEquip(card) && player.inRange(current) && _status.currentPhase === player))) {
+ val += 5;
+ }
+ } else {
+ if (game.hasPlayer(current => get.attitude(player, current) > 0 && target.hasCards("e", card => current.canEquip(card)) && current !== player)) {
+ val = -val + 3;
+ }
+ }
+ return val;
+ },
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ let result = await player
+ .choosePlayerCard({
+ target,
+ position: "e",
+ forced: true,
+ ai(button) {
+ const event = get.event();
+ const from = event.from;
+ const player = get.player();
+ let val = get.value(button.link, from);
+ if (get.attitude(player, from) < 0) {
+ return 5 - val;
+ }
+ return val;
+ },
+ })
+ .set("from", target)
+ .forResult();
+ if (!result.links?.length) {
+ return;
+ }
+ const card = result.links[0];
+ result = await player
+ .chooseTarget({
+ prompt: `将${get.translation(card)}移动至一名角色的装备区`,
+ filterTarget(card, player, target) {
+ const { card0 } = get.event();
+ return target.canEquip(card0) && target !== target;
+ },
+ forced: true,
+ })
+ .set("ai", target => {
+ const player = get.player();
+ const { card0 } = get.event();
+ let val = Math.sign(get.attitude(player, target));
+ if (val < 0) {
+ if (player.inRange(target) && player == _status.currentPhase) {
+ val = -val + get.color(card0) == "red" ? 3 : 2;
+ } else if (target == _status.currentPhase) {
+ val = -val + 4;
+ } else {
+ val = -val;
+ }
+ } else {
+ if (target == player && player == _status.currentPhase) {
+ val -= 5;
+ }
+ if (target.hasSkillTag("nodamage")) {
+ val += 5;
+ } else {
+ val += 1;
+ }
+ }
+ return val;
+ })
+ .set("card0", card)
+ .forResult();
+ if (!result.targets?.length) {
+ return;
+ }
+ const target2 = result.targets[0];
+ player.line(target);
+ target.$give(card, target2);
+ await target2.equip(card);
+ const color = get.color(card);
+ target2.addTempSkill("sxrmjiaozong_ban");
+ target2.markAuto("sxrmjiaozong_ban", color);
+ },
+ subSkill: {
+ ban: {
+ charlotte: true,
+ intro: {
+ content(storage, player) {
+ let str = "";
+ if (storage?.length) {
+ str = "本回合不能使用" + storage.map(i => get.translation(i)).join("、") + "牌且";
+ }
+ str += "受到的伤害+1";
+ return str;
+ },
+ },
+ forced: true,
+ onremove: true,
+ popup: false,
+ mod: {
+ cardEnabled(card, player) {
+ if (player.getStorage("sxrmjiaozong_ban")?.includes(get.color(card))) {
+ return false;
+ }
+ },
+ cardSavable(card, player) {
+ if (player.getStorage("sxrmjiaozong_ban")?.includes(get.color(card))) {
+ return false;
+ }
+ },
+ },
+ trigger: { player: "damageBegin3" },
+ async content(event, trigger, player) {
+ trigger.num++;
+ },
+ },
+ },
+ },
+ sxrmfusui: {
+ audio: 2,
+ enable: "phaseUse",
+ limited: true,
+ derivation: "sxrmbiyi",
+ filterTarget(card, player, target) {
+ const skills = target.getSkills(null, false, false).filter(skill => {
+ const list = get.skillCategoriesOf(skill, player);
+ return !list.length;
+ });
+ return target !== player && target.sex === "male" && skills.length > 0;
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ player.awakenSkill("sxrmfusui");
+ const skills = target.getSkills(null, false, false).filter(skill => {
+ let list = get.skillCategoriesOf(skill, player);
+ return !list.length;
+ });
+ if (!skills.length) {
+ return;
+ }
+ const { control: skill } = await player
+ .chooseControl({
+ prompt: `令${get.translation(target)}失去一个技能`,
+ controls: skills,
+ })
+ .forResult();
+ if (!skill) {
+ return;
+ }
+ await target.removeSkill(skill);
+ for (const current of [player, target]) {
+ current.storage.sxrmfusui_skill = skill;
+ await current.addSkill("sxrmbiyi");
+ current.addTempSkill("sxrmfusui_prevent", { player: "roundStart" });
+ }
+ },
+ ai: {
+ order: 7,
+ result: {
+ target: 2,
+ },
+ },
+ subSkill: {
+ prevent: {
+ trigger: {
+ player: "damageBegin4",
+ },
+ forced: true,
+ charlotte: true,
+ async content(event, trigger, player) {
+ trigger.cancel();
+ },
+ mark: true,
+ intro: {
+ content: "防止本轮受到的伤害",
+ },
+ ai: {
+ nofire: true,
+ nothunder: true,
+ nodamage: true,
+ effect: {
+ target(card, player, target, current) {
+ if (get.tag(card, "damage")) {
+ return [0, 0];
+ }
+ },
+ },
+ },
+ },
+ },
+ },
+ sxrmbiyi: {
+ audio: 2,
+ zhuanhuanji: true,
+ mark: true,
+ marktext: "☯",
+ derivation: "xiaoji",
+ forced: true,
+ locked: false,
+ init(player, skill) {
+ let lostSkill = player.storage.sxrmfusui_skill;
+ if (lostSkill) {
+ player.addAdditionalSkill(skill, [lostSkill]);
+ }
+ },
+ intro: {
+ content(storage, player) {
+ if (!storage) {
+ let lostSkill = player.storage.sxrmfusui_skill;
+ if (lostSkill) {
+ return "当前状态:阳(" + get.translation(lostSkill) + ")";
+ }
+ return "当前状态:阳(无技能)";
+ } else {
+ return "当前状态:阴(枭姬)";
+ }
+ },
+ },
+ trigger: {
+ player: ["useSkill", "logSkillBegin"],
+ },
+ filter(event, player) {
+ const skill = get.sourceSkillFor(event);
+ if (!skill) {
+ return false;
+ }
+ let currentSkill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : "xiaoji";
+ if (!currentSkill) {
+ return false;
+ }
+ let info = get.info(skill);
+ if (info && info.charlotte) {
+ return false;
+ }
+ return skill == currentSkill;
+ },
+ async content(event, trigger, player) {
+ player.changeZhuanhuanji("sxrmbiyi");
+ player.removeAdditionalSkill("sxrmbiyi");
+ const skill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : "xiaoji";
+ if (skill) {
+ player.addAdditionalSkill("sxrmbiyi", [skill]);
+ }
+ },
+ onremove(player) {
+ player.removeAdditionalSkill("sxrmbiyi");
+ delete player.storage.sxrmfusui_skill;
+ },
+ },
+ //嗔张昭
+ sxrmxiezhong: {
+ audio: 2,
+ filter(event, player) {
+ return game.countPlayer() > 1;
+ },
+ async cost(event, trigger, player) {
+ const num = Math.ceil(game.countPlayer() / 2);
+ event.result = await player
+ .chooseTarget({
+ prompt: get.prompt2("sxrmxiezhong"),
+ selectTarget: num,
+ ai(target) {
+ const player = get.player();
+ let val;
+ if (get.attitude(player, target) > 0) {
+ val = 3;
+ if (target.countCards("h") <= 3 && target.hp <= 3) {
+ val = -1;
+ } else if (target.hp >= 5) {
+ val = 5;
+ }
+ } else {
+ val = 2;
+ if (target.countCards("h") <= 3 && target.hp <= 3) {
+ val = 4;
+ } else if (target.countCards("h") >= 6 || target.hp >= 5) {
+ val = -1;
+ }
+ }
+ return val;
+ },
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const targets = event.targets.sortBySeat();
+ if (!targets?.length) {
+ return;
+ }
+ /** @type { [Player, number][]} */
+ let list = [];
+ for (const target of targets) {
+ if (!target.isIn()) {
+ continue;
+ }
+ if (!lib.skill.sxrmxiezhong.canUseSha(target)) {
+ list.push([target, 0]);
+ } else {
+ let result = await target
+ .chooseControl({
+ prompt: "请选择一项",
+ controls: ["摸两张牌并失去1点体力", "将两张牌当【杀】使用"],
+ ai() {
+ const player = get.player();
+ if (player.hp <= 2) {
+ return 1;
+ }
+ if (player.countCards("he") <= 3) {
+ return 0;
+ }
+ return player.getUseValue(get.autoViewAs({ name: "sha", isCard: true })) > 1 ? 1 : 0;
+ },
+ })
+ .forResult();
+ if (result.index == null) {
+ continue;
+ }
+ list.push([target, result.index]);
+ }
+ }
+ if (!list.length) {
+ return;
+ }
+ let count2 = 0;
+ for (const [current, index] of list) {
+ current.popup(index === 0 ? "摸牌" : "出杀");
+ count2 += index;
+ }
+ const count1 = list.length - count2;
+ for (const [target, index] of list) {
+ if (!target.isIn()) {
+ continue;
+ }
+ if (index == 0) {
+ await target.draw(2);
+ await target.loseHp();
+ } else {
+ if (!lib.skill.sxrmxiezhong.canUseSha(target)) {
+ continue;
+ }
+ const result = await target
+ .chooseCard({
+ prompt: "请选择两张牌当【杀】使用",
+ selectCard: 2,
+ position: "he",
+ forced: true,
+ ai(card) {
+ return 5 - get.value(card);
+ },
+ })
+ .forResult();
+ const cards = result.cards;
+ if (!cards?.length) {
+ continue;
+ }
+ await target.chooseUseTarget({
+ card: get.autoViewAs({ name: "sha" }),
+ cards,
+ forced: true,
+ addCount: false,
+ });
+ }
+ }
+ if (count1 === count2 || !game.hasPlayer(target => !targets.includes(target))) {
+ return;
+ }
+ const num = count1 > count2 ? 0 : 1;
+ const result = await player
+ .chooseTarget({
+ prompt: `选择一名角色,令其执行两次“${num == 0 ? "摸两张牌并失去一点体力" : "将两张牌当【杀】使用"}”的选项`,
+ filterTarget(card, player, target) {
+ const { targets } = get.event();
+ return !targets?.includes(target);
+ },
+ forced: true,
+ ai(target) {
+ const player = get.player();
+ const att = get.attitude(player, target);
+ const { num } = get.event();
+ let val;
+ if (att > 0) {
+ val = 1;
+ if (target.hp >= 6 && num === 0) {
+ val = 3;
+ }
+ if (target.countCards("he") === 1 && num === 1) {
+ val = 6;
+ }
+ } else {
+ val = 2;
+ if (target.hp <= 1 && num === 0) {
+ val = 5;
+ } else if (target.countCards("he") <= 4 && target.countCards("he") > 1 && num === 1) {
+ val = 4;
+ }
+ if (target.countCards("he") === 1 && num === 1) {
+ val = 0.5;
+ }
+ }
+ return val;
+ },
+ })
+ .set("num", num)
+ .set("targets", targets)
+ .forResult();
+ if (!result.targets?.length) {
+ return;
+ }
+ const target = result.targets[0];
+ player.line(target);
+ for (let i = 0; i < 2; i++) {
+ if (num == 0) {
+ await target.draw(2);
+ await target.loseHp();
+ } else {
+ if (!lib.skill.sxrmxiezhong.canUseSha(target)) {
+ continue;
+ }
+ const result = await target
+ .chooseCard({
+ prompt: "请选择两张牌当【杀】使用",
+ selectCard: 2,
+ position: "he",
+ forced: true,
+ ai(card) {
+ return 5 - get.value(card);
+ },
+ })
+ .forResult();
+ const cards = result.cards;
+ if (!cards?.length) {
+ continue;
+ }
+ await target.chooseUseTarget({
+ card: get.autoViewAs({ name: "sha" }),
+ cards,
+ forced: true,
+ addCount: false,
+ });
+ }
+ }
+ },
+ canUseSha(player) {
+ let cards = player.getCards("he");
+ if (cards.length < 2) {
+ return false;
+ }
+ return cards.some(card1 => {
+ return cards.some(card2 => {
+ if (card1 === card2) {
+ return false;
+ }
+ const card0 = get.autoViewAs({ name: "sha" }, [card1, card2]);
+ return lib.filter.cardEnabled(card0, player) && player.hasUseTarget(get.autoViewAs({name:'sha',cards)}));
+ });
+ });
+ },
+ },
+ sxrmqishi: {
+ audio: 2,
+ trigger: {
+ player: "phaseJieshuBegin",
+ },
+ locked(skill, player) {
+ if (!player?.storage.sxrmqishi) {
+ return false;
+ }
+ return true;
+ },
+ qidingSkill(skill, player) {
+ if (!player?.storage.sxrmqishi) {
+ return true;
+ }
+ return false;
+ },
+ getZhongyangCards(player) {
+ let cards = [];
+ game.checkGlobalHistory("cardMove", evt => {
+ if (evt.name == "lose" && evt.player != player && evt.position === ui.discardPile) {
+ cards.addArray(evt.cards);
+ } else if (evt.name == "cardsDiscard") {
+ for (const current of game.filterPlayer()) {
+ if (current != player) {
+ cards.addArray(evt.getd(current, "cards2"));
+ }
+ }
+ }
+ });
+ cards = cards.filterInD("d").flat().unique();
+ if (!cards.length) {
+ cards = [];
+ }
+ return cards;
+ },
+ filter(event, player) {
+ return lib.skill.sxrmqishi.getZhongyangCards(player).length;
+ },
+ async cost(event, trigger, player) {
+ const forced = Boolean(player.storage.sxrmqishi);
+ const cards = lib.skill.sxrmqishi.getZhongyangCards(player);
+ const result = await player
+ .chooseButton({
+ createDialog: ["获得本回合其他角色进入弃牌堆的至多五张牌", cards],
+ selectButton: [1, 5],
+ forced,
+ ai(button) {
+ const { cards } = get.event();
+ if (cards.length < 4) {
+ return -1;
+ }
+ return get.value(button.link);
+ },
+ })
+ .set("cards", cards)
+ .forResult();
+ event.result = {
+ bool: result.bool,
+ cost_data: {
+ links: result.links,
+ },
+ };
+ },
+ async content(event, trigger, player) {
+ player.awakenQidingSkill(event.name);
+ const cards = event.cost_data.links;
+ player.gain({
+ cards,
+ animate: "gain2",
+ });
+ player.skip("phaseDraw");
+ player.addTempSkill(event.name + "_mark", { player: "phaseDrawSkipped" });
+ },
+ mark: true,
+ intro: {
+ content: "qidingSkill",
+ },
+ subSkill: {
+ mark: {
+ charlotte: true,
+ mark: true,
+ marktext: "饿",
+ intro: {
+ content: "跳过下个摸牌阶段",
+ },
+ },
+ },
+ },
+ //嗔鲁肃
+ sxrmwanli: {
+ audio: 2,
+ trigger: {
+ global: "roundStart",
+ },
+ filter(event, player) {
+ return game.roundNumber == 1 && !player.getStorage("sxrmwanli")?.length && game.countPlayer() > 1;
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget({
+ prompt: "选择放出高利贷的目标",
+ filterTarget: lib.filter.notMe,
+ ai: target => {
+ return -get.attitude(get.player(), target);
+ }
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ const cards = await player
+ .chooseCard({
+ position: 'he',
+ selectCard: [1, Infinity],
+ prompt: '请选择交给' + get.translation(target) + '的牌',
+ forced: true,
+ ai: card => {
+ if (!ui.selected.cards?.length) return 10 - get.value(card);
+ return -1;
+ }
+ })
+ .forResult('cards');
+ await player.give(cards, target);
+ let name = event.name + '_eff';
+ player.addSkill(name);
+ player.markAuto(name, [{
+ target: target,
+ cards: 3 * cards.length,
+ round: 4,
+ huanqian: false,
+ }]);
+ },
+ group: ['sxrmwanli_draw'],
+ subSkill: {
+ eff: {
+ forced: true,
+ charlotte: true,
+ trigger: {
+ global: "roundEnd",
+ },
+ filter(event, player) {
+ return game.hasPlayer(current => {
+ return player.getStorage('sxrmwanli_eff')?.some(item => {
+ return item.target == current && current.isIn() && !item.huanqian && game.roundNumber >= item.round;
+ });
+ });
+ },
+ async content(event, trigger, player) {
+ let items = player.getStorage('sxrmwanli_eff')
+ .filter(item => {
+ return item.target.isIn() && !item.huanqian && game.roundNumber <= item.round;
+ });
+ const targets = items.map(item => item.target).sortBySeat();
+ items = items.sort((x, y) => x.indexOf(targets) - y.indexOf(targets));
+ for (let i in items) {
+ const { target, cards: num } = items[i];
+ if (!target.isIn()) continue;
+ let loseSkill, cards;
+ if (target.countCards('he') <= num) {
+ cards = target.getCards('he');
+ if (target.countCards('he') < num) loseSkill = true;
+ }
+ else {
+ cards = await target
+ .chooseCard({
+ prompt: `选择${get.cnNumber(num)}张牌还给${get.translation(player)}`,
+ forced: true,
+ position: 'he',
+ ai: card => {
+ return 10 - get.value(card);
+ }
+ })
+ .forResult('cards');
+ }
+ target.line(player);
+ if (cards?.length) await target.give(cards, player);
+ if (loseSkill) target.clearSkills();
+ for (let j in player.storage['sxrmwanli_eff']) {
+ if (player.storage['sxrmwanli_eff'][j].target == target) {
+ player.storage['sxrmwanli_eff'][j].huanqian = true;
+ }
+ }
+ }
+ },
+ intro: {
+ content(storage) {
+ if (!storage) return '账单是空的?!';
+ let str = '';
+ for (let item of storage) {
+ let { target, cards: num, round, huanqian } = item;
+ let str1 = `${get.translation(target)}需于第${round}轮结束时还给你${num}张牌`;
+ if (huanqian || !target.isAlive()) {
+ str1 = `${str1}`;
+ if (huanqian) str1 += '(已还钱)';
+ else str1 += '(已死亡)';
+ }
+ str1 = `
${str1}
`;
+ str += str1;
+ }
+ return str;
+ }
+ },
+ sub: true,
+ parentskill: "sxrmwanli",
+ },
+ draw: {
+ forced: true,
+ locked: false,
+ trigger: {
+ player: "phaseDrawBegin",
+ },
+ filter(event, player) {
+ if (!player.getStorage('sxrmwanli_eff')?.length) return false;
+ let num = player.getStorage('sxrmwanli_eff').reduce((sum, item) => {
+ const { target, huanqian } = item;
+ sum += (!target.isAlive() || huanqian) ? 3 : 0;
+ return sum;
+ }, 0);
+ return num > 0;
+ },
+ async content(event, trigger, player) {
+ let num = player.getStorage('sxrmwanli_eff').reduce((sum, item) => {
+ const { target, huanqian } = item;
+ sum += (!target.isAlive() || huanqian) ? 3 : 0;
+ return sum;
+ }, 0);
+ trigger.num += num;
+ },
+ sub: true,
+ parentskill: "sxrmwanli",
+ },
+ },
+ },
+ sxrmlishui: {
+ audio: 2,
+ trigger: {
+ target: "useCardToTarget",
+ },
+ filter(event, player) {
+ return get.color(event.card) == 'black';
+ },
+ async content(event, trigger, player) {
+ await player.draw();
+ if (!player.getStorage('sxrmwanli_eff')?.length) {
+ return;
+ }
+ let targets = [];
+ player.getStorage('sxrmwanli_eff').forEach(item => {
+ const { target, huanqian } = item;
+ if (!huanqian && target.isIn() && player.canCompare(target))
+ targets.push(target);
+ });
+ if (!targets.length) {
+ return;
+ }
+ const result = await player
+ .chooseTarget({
+ prompt: '选择一名“万利”角色拼点',
+ filterTarget: (card, player, target) => {
+ return targets.includes(target);
+ },
+ forced: true,
+ }).
+ forResult();
+ const target = result.targets[0];
+ const result2 = await player.chooseToCompare(target).forResult();
+ if (!player.storage['sxrmwanli_eff']) {
+ return;
+ }
+ if (result2.winner == player) {
+ player.say('还钱!');
+ for (const i in player.storage['sxrmwanli_eff']) {
+ if (player.storage['sxrmwanli_eff'][i].target == target) {
+ let num = player.storage['sxrmwanli_eff'][i]['round'];
+ player.storage['sxrmwanli_eff'][i]['round'] = Math.max(game.roundNumber, num - 1);
+ }
+ }
+ game.log(target, '的“万利”还钱时间被提前一轮');
+ }
+ },
+ ai: {
+ effect: {
+ target(card, player, target, current) {
+ if (get.color(card) == 'black' && get.attitude(target, player) < 0) {
+ return [1, 0.2];
+ }
+ },
+ },
+ },
+ },
+ //嗔曹操
+ sxrmlanjiao: {
+ audio: 2,
+ enable: "phaseUse",
+ filterTarget(card, player, target) {
+ return target != player && !player.getStorage("sxrmlanjiao_used")?.targets?.includes(target) && target.countCards("h") >= 2;
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ let cards;
+ while (1) {
+ if (!target.isIn() || target.countCards("h") < 2) {
+ break;
+ }
+ cards = await player
+ .choosePlayerCard({
+ target,
+ position: "h",
+ selectButton: 2
+ })
+ .forResult("cards");
+ await player.showCards(cards, `${get.translation(player)}对${get.translation(target)}发动了【揽娇】`);
+ let rechoose = await target
+ .chooseBool({
+ prompt: `是否失去一点体力并摸一张牌,令${get.translation(player)}重新选择?`,
+ ai: () => {
+ const player = get.player(), cards = get.event("cards");
+ return player.hp > 3 && !cards.some(i => get.color(i) == "red");
+ }
+ })
+ .set("cards", cards)
+ .forResult("bool");
+ if (rechoose) {
+ await target.draw();
+ await target.loseHp();
+ }
+ else {
+ break;
+ }
+ }
+ if (!cards?.length || !target.isIn()) {
+ return;
+ }
+ player.gain(cards, target, "give");
+ player.addTempSkill("sxrmlanjiao_used");
+ if (!player.storage["sxrmlanjiao_used"]) {
+ player.storage["sxrmlanjiao_used"] = {
+ targets: [],
+ suits: [],
+ };
+ }
+ player.storage["sxrmlanjiao_used"].targets.add(target);
+ cards.forEach(i => {
+ player.storage["sxrmlanjiao_used"].suits.add(get.suit(i));
+ });
+ let suits = player.storage["sxrmlanjiao_used"].suits;
+ if (suits.includes("heart") && suits.includes("diamond")) {
+ player.tempBanSkill(event.name);
+ }
+ },
+ ai: {
+ order: 8,
+ result: {
+ target: -1,
+ },
+ },
+ subSkill: {
+ used: {
+ charlotte: true,
+ mark: true,
+ intro: {
+ content(storage, player) {
+ if (!storage) return "";
+ let { targets, suits } = storage;
+ let str1 = targets.map(i => get.translation(i)).join("、"),
+ str2 = suits.map(i => get.translation(i)).join("、");
+ return `本回合已指定过的目标:${str1}
本回合获得过的花色:${str2}`;
+ }
+ },
+ sub: true,
+ sourceSkill: "sxrmlanjiao",
+ }
+ },
+ },
+ //嗔诸葛亮
+ sxrmbingqu: {
+ audio: 2,
+ trigger: { player: "phaseZhunbeiBegin" },
+ filter(event, player) {
+ return game.countPlayer() > 1;
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget({
+ prompt: "是否与一名其他角色各声明一种普通锦囊牌?",
+ filter: lib.filter.notMe,
+ ai: (target) => {
+ const player = get.player();
+ if (player.countCards("h") > 4) {
+ return -1;
+ }
+ const att = get.attitude(player, target);
+ if (att) {
+ return target.countCards("h") <= 4 ? 1 : -1;
+ }
+ else return target.countCards("h") > 4 ? 1 : -1;
+ },
+ })
+ .forResult();
+ },
+ getVcards(player) {
+ let list = lib.inpile.filter(name => {
+ return get.type(name) == 'trick';
+ });
+ let vcard = list
+ .filter(name => {
+ return lib.filter.cardEnabled({ name: name }, player);
+ })
+ .map(namex => {
+ let name = Array.isArray(namex) ? namex.name : namex;
+ return [get.type(name), "", name];
+ });
+ return vcard;
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ let vcard1 = lib.skill["sxrmbingqu"].getVcards(target);
+ let vcard2 = lib.skill["sxrmbingqu"].getVcards(player);
+ let targetCard = {};
+ for (let i of [[player, target, vcard1], [target, player, vcard2]]){
+ const [playerx, targetx, vcard] = i;
+ if (!vcard?.length || !playerx.isIn()) {
+ continue;
+ }
+ const result = await playerx
+ .chooseButton({
+ createDialog: [
+ `为${get.translation(targetx)}选择一个锦囊牌名`,
+ [vcard, "vcard"]
+ ],
+ forced: true,
+ ai: (button) => {
+ const player = get.player(), target = get.event("target");
+ return get.effect(player, { name: button.link[2] }, target, player);
+ }
+ })
+ .set("target", targetx)
+ .forResult();
+ const name = result.links[0][2]
+ game.log(playerx, "声明了", get.translation(name));
+ targetCard[targetx.playerid] = name;
+ }
+ for (let playerx of [player, target]){
+ if (!playerx.isIn()) continue;
+ if (!targetCard[playerx.playerid] || playerx.countCards('h', card => {
+ return game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false;
+ }) > Math.ceil(playerx.countCards('h') / 2)) {
+ continue;
+ }
+ const name = targetCard[playerx.playerid];
+ if (!player.hasUseTarget({ name: name })) {
+ continue;
+ }
+ const { cards } = await playerx
+ .chooseCard({
+ position: "h",
+ selectCard: Math.ceil(playerx.countCards('h') / 2),
+ forced: true,
+ prompt: `将一半手牌当作${get.translation(name)}使用`,
+ filterCard: (card, player) => {
+ return game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false;
+ },
+ ai: (card) => {
+ return 10 - get.value(card);
+ }
+ })
+ .forResult();
+ const cardx = get.autoViewAs({ name: name }, cards);
+ if (!lib.filter.cardEnabled(cardx, player)) {
+ continue;
+ }
+ await playerx.chooseUseTarget({
+ card: get.autoViewAs({ name: name }),
+ cards,
+ forced: true,
+ });
+ }
+ },
+ },
+ sxrmfanxin: {
+ audio: 2,
+ derivation: ["baonu", "wumou"],
+ trigger: {
+ global: ["phaseBefore", "dieAfter"],
+ player: "enterGame",
+ },
+ filter(event, player) {
+ if (event.name == "die") {
+ return player.storage["sxrmfanxin"]?.includes(event.player);
+ }
+ return event.name != "phase" || game.phaseNumber == 0;
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget({
+ prompt: get.prompt("sxrmfanxin"),
+ filterTarget: (card, player, target) => {
+ return target != player && !player.storage["sxrmfanxin"]?.includes(target);
+ },
+ ai: (target) => {
+ const player = get.player();
+ return -get.attitude(player, target);
+ }
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ const target = event.targets[0];
+ target.addSkills(["baonu", "wumou"]);
+ player.markAuto(event.name, [target]);
+ },
+ group: ["sxrmfanxin_draw"],
+ subSkill: {
+ draw: {
+ trigger: { global: "phaseBegin" },
+ filter(event, player) {
+ const target = event.player;
+ return player.storage["sxrmfanxin"]?.includes(target) && target.hasSkill("baonu") && target.countMark("baonu");
+ },
+ async cost(event, trigger, player) {
+ const target = trigger.player, num = target.countMark("baonu");
+ let list = Array.from({ length: num }, (_, i) => String(i + 1))
+ list.push("cancel2");
+ console.log(list);
+ const result = await player
+ .chooseControl({
+ prompt: get.prompt("sxrmbingqu"),
+ prompt2: `移去${get.translation(target)}的至多5个暴怒标记并摸等量的牌`,
+ controls: list,
+ ai: () => {
+ const num = get.event("num");
+ return num - 1;
+ }
+ })
+ .set("num", num)
+ .forResult();
+ event.result = {
+ bool: result.control != "cancel2",
+ cost_data: result.index + 1,
+ };
+ },
+ async content(event, trigger, player) {
+ const num = event.cost_data;
+ trigger.player.removeMark("baonu", num);
+ player.draw(num);
+ },
+ }
+ }
+ },
+ //嗔贾华
+ sxrmfubei: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ async content(event, trigger, player) {
+ await player.drawTo(player.maxHp);
+ if (player.countCards('h') < 2) {
+ return;
+ }
+ let { cards } = await player
+ .chooseCard({
+ prompt: "选择置入牌堆的两张牌",
+ forced: true,
+ selectCard: 2,
+ position: "he",
+ ai: (card) => {
+ return 10 - get.value(card);
+ }
+ })
+ .forResult();
+ if (cards?.length != 2) {
+ return;
+ }
+ const [card1, card2] = cards;
+ const insertRange = Math.min(ui.cardPile.childElementCount + 2, 10);
+ const result = await player
+ .chooseNumbers({
+ prompt: "请依次选择两张牌插入的位置",
+ forced: true,
+ list: [
+ {
+ prompt: `将${get.translation(card1)}置于牌堆顶的第()张`,
+ min: 1,
+ max: insertRange,
+ },
+ {
+ prompt: `将${get.translation(card2)}置于牌堆顶的第()张`,
+ min: 1,
+ max: insertRange,
+ }
+ ],
+ filterOk: (event) => {
+ return event.numbers.toUniqued()?.length == 2;
+ },
+ processAI: () => {
+ const list = Array.from({ length: get.event("range0") }).map((val, idx) => idx + 1);
+ if (list.length >= 2) {
+ list.remove(1);
+ }
+ return [list.randomRemove(), list.randomRemove()];
+ }
+ })
+ .set("range0", insertRange)
+ .forResult();
+ const [num1, num2] = result.numbers;
+ if (num1 > num2) {
+ cards = [card2, card1];
+ }
+ await player
+ .lose(cards, ui.cardPile)
+ .set("insert_index", (event, card) => {
+ const nums = get.event("nums"), cardsx = get.event("cardsx");
+ return ui.cardPile.childNodes[nums[cardsx.indexOf(card)] - 1];
+ })
+ .set("nums", [num1, num2])
+ .set("cardsx", [card1, card2]);
+ game.log(player, "将", card1, "与", card2, `分别置于牌堆顶的第${num1}张与第${num2}张`);
+ player.addTempSkill("sxrmfubei_damage", { global: "washCard" });
+ player.markAuto("sxrmfubei_damage", [card1, card2]);
},
+ group: "sxrmfubei_clear",
subSkill: {
- ban: {
- charlotte: true,
+ damage: {
forced: true,
- onremove: true,
- popup: false,
+ locked: false,
+ mark: true,
intro: {
content(storage) {
- if (!storage?.length) {
- return "";
- }
- const list = [];
- for (let i of storage) {
- list.push(get.translation(i));
+ if (!storage.length) return "";
+ let str = "地雷位置:";
+ for (let card of storage) {
+ str += `
${get.translation(card)}:`;
+ const pile = Array.from(ui.cardPile.childNodes);
+ let num = pile.indexOf(card) + 1;
+ if (num == 0) {
+ str += "不在牌堆中";
+ }
+ else {
+ str += `牌堆第${num}张`;
+ }
}
- return "不能对" + list.join("、") + "使用牌";
+ return str;
},
},
- mod: {
- playerEnabled(card, player, target) {
- if (player.getStorage("sxrmmieguo_ban")?.includes(target)) {
- return false;
- }
- },
+ trigger: { global: "phaseEnd" },
+ filter(event, player) {
+ if (!player.storage["sxrmfubei_damage"]?.length) return false;
+ const card = ui.cardPile.childNodes[0];
+ return player.storage["sxrmfubei_damage"].includes(card);
+ },
+ async content(event, trigger, player) {
+ const target = trigger.player;
+ player.line(target);
+ target.damage();
},
+ onremove: true,
+ sub: true,
+ sourceSkill: "sxrmfubei",
+ },
+ clear: {
+ forced: true,
+ charlotte: true,
+ popup: false,
trigger: {
- player: "phaseEnd",
+ global: ["cardsGotoOrderingEnd", "cardsGotoOrderingBegin", "gainEnd", "gainBegin", "addJudgeEnd", "addJudgeBegin", "addToExpansionEnd", "addToExpansionBegin"]
},
filter(event, player) {
- return event.skill === "sxrmmieguo";
+ if (!player.storage["sxrmfubei_damage"]?.length) return false;
+ const pile = Array.from(ui.cardPile.childNodes);
+ return player.storage["sxrmfubei_damage"].some(i => pile.indexOf(i) == -1);
},
async content(event, trigger, player) {
- player.removeSkill(event.name);
- if (!player.hasHistory("useCard")) {
- game.log(player, "【灭虢】使命失败");
- player.awakenSkill("sxrmmieguo");
- await player.loseMaxHp();
+ let cards = player.getStorage("sxrmfubei_damage");
+ if (!cards?.length) return;
+ const pile = Array.from(ui.cardPile.childNodes);
+ cards.forEach(i => {
+ if (pile.indexOf(i) == -1) {
+ player.storage["sxrmfubei_damage"].remove(i);
+ }
+ });
+ player.updateMark("sxrmfubei_damage", true);
+ },
+ sub: true,
+ sourceSkill: "sxrmfubei",
+ },
+ },
+ ai: {
+ order: 2,
+ result: {
+ player(player) {
+ if (player.maxHp - player.countCards("h") >= 2) return 1;
+ return -1;
+ },
+ },
+ },
+ },
+ sxrmdancui: {
+ audio: 2,
+ locked(skill, player) {
+ if (!player?.storage.sxrmdancui) {
+ return false;
+ }
+ return true;
+ },
+ qidingSkill(skill, player) {
+ if (!player?.storage.sxrmdancui) {
+ return true;
+ }
+ return false;
+ },
+ trigger: { source: "damageBegin1" },
+ async cost(event, trigger, player) {
+ const qiding = Boolean(player.storage["sxrmdancui"])
+ , target = trigger.player
+ , description = lib.dynamicTranslate["sxrmdancui"](player, "sxrmdancui");
+ if (player.countDiscardableCards(player, "he") < 2) {
+ if (qiding) {
+ event.result = {
+ bool: true,
+ cost_data: player.getDiscardableCards(player, "he"),
+ };
+ }
+ else {
+ const result = await player
+ .chooseBool({
+ prompt: `是否弃置2张牌(所有牌),使${get.translation(target)}受到的伤害值+1?`,
+ prompt2: description,
+ ai: () => {
+ const player = get.player(), target = get.event("target");
+ return get.attitude(player, target) < 0;
+ }
+ })
+ .set("target", target)
+ .forResult();
+ event.result = {
+ bool: result.bool,
+ cost_data: player.getDiscardableCards(player, "he"),
+ }
+ }
+ }
+ else {
+ const result = await player
+ .chooseCard({
+ prompt: `${qiding ? "" : "是否"}弃置2张牌,使${get.translation(target)}受到的伤害值+1${qiding ? "。" : "?"}`,
+ prompt2: description,
+ forced: qiding,
+ position: "he",
+ selectCard: 2,
+ filterCard: (card, player) => {
+ return player.getDiscardableCards(player, "he").includes(card);
+ },
+ ai: (card) => {
+ const player = get.player(), target = get.event("target");
+ if (get.attitude(player, target) >= 0) {
+ return -1;
+ }
+ return 5 - get.value(card);
+ }
+ })
+ .set("target", target)
+ .forResult();
+ event.result = {
+ bool: result.bool,
+ cost_data: result.cards,
+ }
+ }
+ },
+ async content(event, trigger, player) {
+ player.awakenQidingSkill(event.name);
+ const cards = event.cost_data;
+ if (cards?.length) await player.discard(cards);
+ trigger.num++;
+ },
+ mark: true,
+ intro: {
+ content: "qidingSkill",
+ },
+ },
+ //嗔赵云
+ sxrmzhaduo: {
+ audio: 2,
+ trigger: { player: "phaseJieshuBegin" },
+ filter(event, player) {
+ return game.countPlayer(current => {
+ return player != current && current.countGainableCards(player, "he");
+ }) >= 2;
+ },
+ async cost(event, trigger, player) {
+ event.result = await player
+ .chooseTarget({
+ prompt: "是否获得两名其他角色各一张牌?",
+ prompt2: get.translation("sxrmzhaduo_info"),
+ selectTarget: 2,
+ filterTarget: (card, player, target) => {
+ return player != target && target.countGainableCards(player, "he");
+ },
+ ai: (target) => {
+ const player = get.player();
+ return -get.attitude(player, target);
+ }
+ })
+ .forResult();
+ },
+ async content(event, trigger, player) {
+ let targets = event.targets;
+ for (let i of targets) {
+ if (!i.isIn()) continue;
+ await player.gainPlayerCard({
+ target: i,
+ forced: true,
+ position: "he"
+ });
+ }
+ let targetsx = targets.filter(i => {
+ return i.isIn() && player.canUse({ name: "sha", isCard: true }, i, false);
+ });
+ if (!targetsx.length) {
+ return;
+ }
+ const result = await player
+ .chooseTarget({
+ prompt: "视为对其中一名角色使用一张【杀】",
+ forced: true,
+ filterTarget: (card, player, target) => {
+ return targetsx.includes(target);
+ },
+ ai: (target) => {
+ const player = get.player();
+ return get.effect(target, { name: "sha" }, player, player);
+ },
+ })
+ .forResult();
+ const target1 = result.targets[0];
+ targets.remove(target1);
+ const target2 = targets[0];
+ const card1 = new lib.element.VCard({ name: "sha", isCard: true });
+ const skills1 = target2.getSkills(null, false, false);
+ await player.removeAdditionalSkill("sxrmzhaduo");
+ await player.addAdditionalSkill("sxrmzhaduo", skills1);
+ await player.useCard(card1, target1);
+ await player.removeAdditionalSkill("sxrmzhaduo");
+ if (!target2.isIn() || !target2.canUse({ name: "juedou", isCard: true }, player)) {
+ return;
+ }
+ const card2 = new lib.element.VCard({ name: "juedou", isCard: true });
+ const skills2 = target1.getSkills(null, false, false);
+ await player.removeAdditionalSkill("sxrmzhaduo");
+ await player.addAdditionalSkill("sxrmzhaduo", skills2);
+ await target2.useCard(card2, player);
+ await player.removeAdditionalSkill("sxrmzhaduo");
+ }
+ },
+ //嗔曹仁
+ sxrmyangbei: {
+ audio: 2,
+ trigger: {
+ player: ["phaseZhunbeiBegin", "phaseJieshuBegin", "useCardToPlayered"],
+ },
+ filter(event, player, name) {
+ if (name != "useCardToPlayered") return true;
+ const { card, targets, target } = event;
+ return (
+ (card.name == "sha" || get.type(card) == "trick") &&
+ targets.length == 1 &&
+ target.countDiscardableCards(target, "h")
+ );
+ },
+ async cost(event, trigger, player) {
+ if (event.triggername != "useCardToPlayered") {
+ event.result = await player
+ .chooseBool({
+ prompt: "是否摸三张牌并翻面?",
+ prompt2: get.translation("sxrmyangbei_info"),
+ ai: () => true
+ })
+ .forResult();
+ }
+ else {
+ const target = trigger.target;
+ event.result = await target
+ .chooseBool({
+ prompt: `是否弃置所有手牌,令${get.translation(player)}的技能【佯北】于本回合失效?`,
+ ai: () => {
+ const target = get.player(),
+ { playerx } = get.event;
+ if (get.attitude(target, playerx) >= 0) return false;
+ if (!playerx.isTurnedOver()) return false;
+ switch (target.countCards("h")) {
+ case 1:
+ return true;
+ case 2:
+ case 3:
+ return target.countCards("h", card => {
+ return ["shan", "tao"].includes(card.name);
+ }) <= 1;
+ default:
+ return false;
+ }
+ }
+ })
+ .set("playerx", player)
+ .forResult();
+ }
+ },
+ async content(event, trigger, player) {
+ if (event.triggername != "useCardToPlayered") {
+ player.draw(3);
+ player.turnOver();
+ }
+ else {
+ const target = trigger.target;
+ target.discard(target.getCards("h"));
+ player.tempBanSkill(event.name);
+ }
+ }
+ },
+ sxrmyinfeng: {
+ audio: 2,
+ forced: true,
+ trigger: { source: "damageEnd" },
+ filter(event, player) {
+ return game.getGlobalHistory("everything", evt => evt.name == "damage" && evt.source == player).indexOf(event) == 0;
+ },
+ async content(event, trigger, player) {
+ const target = trigger.player;
+ const num = target.maxHp - target.hp;
+ if (num) {
+ await target.loseMaxHp(num);
+ }
+ await target.addSkill("sxrmyinfeng_debuff");
+ target.storage["sxrmyinfeng_debuff"] = num;
+ player.markAuto(event.name, [target]);
+ player
+ .when({ player: "phaseBegin" })
+ .then(() => {
+ if (!player.storage["sxrmyinfeng"]?.length) return;
+ for (let i of player.storage["sxrmyinfeng"]) {
+ if (!i.isIn() || !i.hasSkill("sxrmyinfeng_debuff") || !i.storage["sxrmyinfeng_debuff"]) {
+ continue;
+ }
+ player.line(i);
+ const num = i.storage["sxrmyinfeng_debuff"];
+ i.gainMaxHp(num);
+ i.removeSkill("sxrmyinfeng_debuff");
}
+ delete player.storage["sxrmyinfeng"];
+ })
+ },
+ subSkill: {
+ debuff: {
+ inherit: "gangzhi",
+ forced: true,
+ charlotte: true,
+ popup: false,
+ mark: true,
+ marktext: "中箭",
+ intro: {
+ content(storage) {
+ return `中了冷箭,暂时损失了${storage || 0}点体力上限,期间造成与受到伤害均视为失去体力。`
+ },
},
},
},
},
+
+
+
//曼巴
//关羽
sxrmhanguo: {
@@ -463,19 +1916,19 @@ const skills = {
const result =
targets.length > 1
? await event.current
- .chooseTarget(`撼国:获得${get.translation(targets)}中的一名角色一张牌`, true, (card, player, target) => {
- return get.event().selectTargets.includes(target);
- })
- .set("selectTargets", targets)
- .set("ai", target => {
- const player = get.player();
- return get.effect(target, { name: "shunshou_copy2" }, player, player);
- })
- .forResult()
+ .chooseTarget(`撼国:获得${get.translation(targets)}中的一名角色一张牌`, true, (card, player, target) => {
+ return get.event().selectTargets.includes(target);
+ })
+ .set("selectTargets", targets)
+ .set("ai", target => {
+ const player = get.player();
+ return get.effect(target, { name: "shunshou_copy2" }, player, player);
+ })
+ .forResult()
: {
- bool: true,
- targets: targets,
- };
+ bool: true,
+ targets: targets,
+ };
if (result?.bool) {
const target = result.targets[0];
await event.current.gainPlayerCard(target, "he", true);
@@ -873,11 +2326,11 @@ const skills = {
cards.length == 1
? { bool: true, links: cards }
: await player
- .choosePlayerCard(current, "h", true)
- .set("filterButton", button => {
- return !get.is.connectedCard(button.link);
- })
- .forResult();
+ .choosePlayerCard(current, "h", true)
+ .set("filterButton", button => {
+ return !get.is.connectedCard(button.link);
+ })
+ .forResult();
if (result?.bool) {
connects.set(current, result.links);
}
@@ -984,36 +2437,36 @@ const skills = {
cards.length == 1
? { bool: true, links: cards }
: await player
- .choosePlayerCard(current, "h", true)
- .set("ai", button => {
- const { player, target } = get.event();
- const { link } = button;
- const att = get.attitude(player, target);
- let val = get.value(link, target);
- if (att > 0) {
- if (player == target && player == _status.currentPhase) {
- const num = target.countConnectedCards();
- if (num > 0) {
- if (get.is.connectedCard(link)) {
- val += 3;
- }
- return val;
- } else if (!get.is.connectedCard(link) && !get.tag(link, "damage")) {
- return 6.5 - val;
+ .choosePlayerCard(current, "h", true)
+ .set("ai", button => {
+ const { player, target } = get.event();
+ const { link } = button;
+ const att = get.attitude(player, target);
+ let val = get.value(link, target);
+ if (att > 0) {
+ if (player == target && player == _status.currentPhase) {
+ const num = target.countConnectedCards();
+ if (num > 0) {
+ if (get.is.connectedCard(link)) {
+ val += 3;
}
- return 6 - val;
+ return val;
+ } else if (!get.is.connectedCard(link) && !get.tag(link, "damage")) {
+ return 6.5 - val;
}
- if (get.is.connectedCard(link)) {
- val += 3;
- }
- return val;
+ return 6 - val;
}
- if (!get.is.connectedCard(link)) {
+ if (get.is.connectedCard(link)) {
val += 3;
}
return val;
- })
- .forResult();
+ }
+ if (!get.is.connectedCard(link)) {
+ val += 3;
+ }
+ return val;
+ })
+ .forResult();
if (result?.links?.length) {
connects.set(current, result.links);
}
@@ -1256,7 +2709,7 @@ const skills = {
async content(event, trigger, player) {
player
.when("phaseUseAfter")
- .step(async () => {})
+ .step(async () => { })
.assign({
mod: {
cardUsable(card, player, num) {
@@ -1290,7 +2743,7 @@ const skills = {
async content(event, trigger, player) {
player
.when("phaseDiscardAfter")
- .step(async () => {})
+ .step(async () => { })
.assign({
mod: {
maxHandcardFinal(player, num) {
@@ -1505,15 +2958,15 @@ const skills = {
const result =
targets.length > 1
? await player
- .chooseTarget("鄙诈:与一名角色拼点", true, (card, player, target) => player.canCompare(target))
- .set("ai", target => {
- return -get.attitude(get.player(), target);
- })
- .forResult()
+ .chooseTarget("鄙诈:与一名角色拼点", true, (card, player, target) => player.canCompare(target))
+ .set("ai", target => {
+ return -get.attitude(get.player(), target);
+ })
+ .forResult()
: {
- bool: true,
- targets: targets,
- };
+ bool: true,
+ targets: targets,
+ };
if (result?.bool) {
const target = result.targets[0];
const result2 = await player.chooseToCompare(target).forResult();
@@ -1601,28 +3054,28 @@ const skills = {
const result2 =
targets.length > 1
? await player
- .chooseTarget(
- `选择${get.translation(card)}的使用者`,
- (card, player, target) => {
- return get.event().canUse.includes(target);
- },
- true
- )
- .set("canUse", targets)
- .set("targetx", target)
- .set("willUse", card)
- .set("ai", target => {
- const { player, targetx, willUse } = get.event();
- if (target == player) {
- return get.effect(targetx, willUse, target, player);
- }
- return get.effect(player, willUse, target, player);
- })
- .forResult()
+ .chooseTarget(
+ `选择${get.translation(card)}的使用者`,
+ (card, player, target) => {
+ return get.event().canUse.includes(target);
+ },
+ true
+ )
+ .set("canUse", targets)
+ .set("targetx", target)
+ .set("willUse", card)
+ .set("ai", target => {
+ const { player, targetx, willUse } = get.event();
+ if (target == player) {
+ return get.effect(targetx, willUse, target, player);
+ }
+ return get.effect(player, willUse, target, player);
+ })
+ .forResult()
: {
- bool: true,
- targets: targets,
- };
+ bool: true,
+ targets: targets,
+ };
if (!result2?.bool) {
return;
}
@@ -1720,7 +3173,7 @@ const skills = {
.when({
global: ["phaseAfter", "phaseBeforeStart"],
})
- .step(async () => {})
+ .step(async () => { })
.assign({
mod: {
cardname(card, player) {
@@ -1938,12 +3391,12 @@ const skills = {
targets.length == 1
? { bool: true, targets }
: await player
- .chooseTarget("枯心:选择一名其他角色获得其未展示的手牌", true, lib.filter.notMe)
- .set("ai", target => {
- const player = get.player();
- return -get.attitude(player, target) * target.countCards("h");
- })
- .forResult();
+ .chooseTarget("枯心:选择一名其他角色获得其未展示的手牌", true, lib.filter.notMe)
+ .set("ai", target => {
+ const player = get.player();
+ return -get.attitude(player, target) * target.countCards("h");
+ })
+ .forResult();
if (result?.targets?.length) {
game.log(player, "选择了", "#g【枯心】", "的", "#y选项二");
const [target] = result.targets;
@@ -1977,12 +3430,12 @@ const skills = {
!target._dekuxin_eff &&
get.tag(card, "damage") &&
target.getHp() >
- (player.hasSkillTag("damageBonus", true, {
- card: card,
- target: target,
- })
- ? 2
- : 1)
+ (player.hasSkillTag("damageBonus", true, {
+ card: card,
+ target: target,
+ })
+ ? 2
+ : 1)
) {
if (player.hasSkillTag("jueqing", false, target)) {
return [1, -2];
diff --git a/apps/core/character/sxrm/sort.js b/apps/core/character/sxrm/sort.js
index 4f85bf94c0..377050482f 100644
--- a/apps/core/character/sxrm/sort.js
+++ b/apps/core/character/sxrm/sort.js
@@ -1,7 +1,7 @@
const characterSort = {
shixinrumo_yi: ["sxrm_caocao", "sxrm_liubei", "sxrm_jianggan", "sxrm_huatuo", "sxrm_lvboshe", "sxrm_fuhuanghou", "sxrm_xunyu", "sxrm_caopi", "sxrm_wanghou"],
shixinrumo_man: ["sxrm_guanyu", "sxrm_guanyinping", "sxrm_yujin", "sxrm_mifang", "sxrm_liufeng", "sxrm_luxun", "sxrm_lvmeng", "sxrm_pangde", "sxrm_yanwen"],
- shixinrumo_chen: ["sxrm_zhouyu"],
+ shixinrumo_chen: ["sxrm_zhouyu", "sxrm_sunshangxiang", "sxrm_zhangzhao", "sxrm_lusu", "sxrm_chen_caocao", "sxrm_zhugeliang", "sxrm_jiahua", "sxrm_zhaoyun", "sxrm_caoren"],
};
const characterSortTranslate = {
diff --git a/apps/core/character/sxrm/translate.js b/apps/core/character/sxrm/translate.js
index 8facf62bbf..f0832bd816 100644
--- a/apps/core/character/sxrm/translate.js
+++ b/apps/core/character/sxrm/translate.js
@@ -113,9 +113,56 @@ const translates = {
sxrmjiehuo: "劫火",
sxrmjiehuo_info: "使命技,回合开始时,你可以令场上下次出现的伤害改为3点火焰伤害。失败:若造成此伤害的角色不为你:你减1点体力上限。",
sxrmxianger: "香饵",
- sxrmxianger_info: "使命技,出牌阶段限一次,你可以令一名角色于其下个结束阶段回复2点体力,期间其不能使用点数大于6的牌。失败:期间其受到的伤害值小于2,你减1点体力上限。",
+ sxrmxianger_info: "使命技,出牌阶段限一次,你可以令一名角色于其下个结束阶段回复2点体力,期间其不能使用点数大于6的牌。失败:期间其受到的伤害值小于2:你减1点体力上限。",
sxrmmieguo: "灭虢",
- sxrmmieguo_info: "使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌,你减1点体力上限。",
+ sxrmmieguo_info: "使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌:你减1点体力上限。",
+ sxrm_sunshangxiang: "嗔孙尚香",
+ sxrm_sunshangxiang_prefix: "嗔",
+ sxrmjiaozong: "骄纵",
+ sxrmjiaozong_info: "准备阶段或当你成为【杀】的目标后,你可以移动场上一张装备牌至一名角色装备区内,其本回合不能使用与之颜色相同的牌且受到的伤害+1。",
+ sxrmfusui: "妇随",
+ sxrmfusui_info: `限定技,出牌阶段,你可以选择一名其他男性角色的一个非标签技能,你令其失去此技能,然后你与其获得【${get.poptip("sxrmbiyi")}】并防止你们本轮受到的伤害。`,
+ sxrmbiyi: "比翼",
+ sxrmbiyi_info: "转换技,你视为拥有:阳:因【妇随】失去的技能;阴:【枭姬】。当你发动上述对应技能后,切换本技能状态。",
+ sxrm_zhangzhao: "嗔张昭",
+ sxrm_zhangzhao_prefix: "嗔",
+ sxrmxiezhong: "挟众",
+ sxrmxiezhong_info: "准备阶段,你可令场上半数角色(向上取整)依次选择并执行一项:1.摸两张牌,失去 1 点体力;2.将两张牌当【杀】使用。然后你可以令另一名角色执行两次被选择较多的一项。",
+ sxrmqishi: "乞施",
+ sxrmqishi_info: `${get.poptip("sxrm_qidingSkill")}。结束阶段,你可以获得本回合其他角色进入弃牌堆的至多五张牌,然后你跳过下个摸牌阶段。`,
+ sxrm_lusu: "嗔鲁肃",
+ sxrm_lusu_prefix: "嗔",
+ sxrmwanli: "万利",
+ sxrmwanli_info: "首轮开始时,你可以交给一名其他角色任意张牌,第四轮结束时若你存活,其交给你三倍数量的牌(不足则全给并失去所有技能);若其已还牌或死亡,你摸牌阶段多摸三张牌。",
+ sxrmlishui: "理说",
+ sxrmlishui_info: "当你成为黑色牌的目标时,你可以摸一张牌并与一名未还牌的“万利”角色拼点:若你赢,其提前一轮还牌(不会提前到本轮前)。",
+ sxrm_chen_caocao: "嗔曹操",
+ sxrm_chen_caocao_prefix: "嗔",
+ sxrmlanjiao: "揽娇",
+ sxrmlanjiao_info: "出牌阶段对每名角色限一次,你可以展示一名其他角色两张手牌,然后你获得展示的牌;其可以在你展示这些牌时失去1点体力并摸一张牌,令你重新展示。若你一回合内因此获得过♥和♦牌,此技能本回合失效。",
+ sxrm_zhugeliang: "嗔诸葛亮",
+ sxrm_zhugeliang_prefix: "嗔",
+ sxrmbingqu: "并驱",
+ sxrmbingqu_info: "准备阶段,你可以与一名其他角色各声明一种普通锦囊牌,然后双方依次将半数手牌(向上取整)当对方声明的牌使用。",
+ sxrmfanxin: "燔心",
+ sxrmfanxin_info: "游戏开始或“燔心”角色死亡后,你可以令一名其他角色获得【${get.poptip("baonu")}】【${get.poptip("wumou")}】;其回合开始时,你可以移去其至多5枚“暴怒”并摸等量的牌。",
+ sxrm_jiahua: "嗔贾华",
+ sxrm_jiahua_prefix: "嗔",
+ sxrmfubei: "伏备",
+ sxrmfubei_info: "出牌阶段限一次,你可以将手牌摸至体力上限,然后将两张牌正面朝上置于牌堆顶前十张的任意位置(对其他角色可见);每名角色回合结束时,若牌堆顶的牌正面朝上,你须对其造成1点伤害。",
+ sxrmdancui: "殚瘁",
+ sxrmdancui_info: `${get.poptip("sxrm_qidingSkill")}。当你造成伤害时,你可以弃置两张牌(无牌则不弃,不足则全弃),令此伤害+1。`,
+ sxrm_zhaoyun: "嗔赵云",
+ sxrm_zhaoyun_prefix: "嗔",
+ sxrmzhaduo: "诈夺",
+ sxrmzhaduo_info: "结束阶段,你可以获得两名其他角色各一张牌,视为对其中一名角色使用一张【杀】,然后另一名角色视为对你使用一张【决斗】;在和其中一名角色的结算过程中,你视为拥有另一名角色的所有技能。",
+ sxrm_caoren: "嗔曹仁",
+ sxrm_caoren_prefix: "嗔",
+ sxrmyangbei: "佯北",
+ sxrmyangbei_info: "准备阶段和结束阶段,你可以翻面并摸三张牌。当你使用【杀】或普通锦囊牌指定唯一目标后,其可以弃置所有手牌令此技能本回合失效。",
+ sxrmyinfeng: "阴锋",
+ sxrmyinfeng_info: "锁定技,当你每回合首次造成伤害后,将受伤角色体力上限减至其体力值且其接下来造成和受到的伤害均视为失去体力,直到你下回合开始。",
+
};
export default translates;
diff --git a/apps/core/character/xianding/character.js b/apps/core/character/xianding/character.js
index 8639114b7a..47edf42651 100644
--- a/apps/core/character/xianding/character.js
+++ b/apps/core/character/xianding/character.js
@@ -1,4 +1,22 @@
const characters = {
+ v_guanyinping: {
+ sex: "female",
+ group: "shu",
+ hp: 4,
+ skills: ["dcshaowei", "dcdichou"],
+ },
+ dc_sb_wangping: {
+ sex: "male",
+ group: "shu",
+ hp: 4,
+ skills: ["dcsbyouyi", "dcsbfangong"],
+ },
+ dc_sb_masu: {
+ sex: "male",
+ group: "shu",
+ hp: 3,
+ skills: ["dcsbchengce", "dcsbxinzhan"],
+ },
dc_sb_zhugeliang: {
sex: "male",
group: "shu",
diff --git a/apps/core/character/xianding/characterTitle.js b/apps/core/character/xianding/characterTitle.js
index e1486b36ab..686eaa7c81 100644
--- a/apps/core/character/xianding/characterTitle.js
+++ b/apps/core/character/xianding/characterTitle.js
@@ -1,4 +1,8 @@
export default {
+ //v_guanyinping: "",
+ //dc_sb_wangping: "",
+ //dc_sb_masu: "",
+ //dc_shen_caopi: "",
//dc_sb_zhugeliang: "",
dc_shen_guanyu: "鬼神再临",
dc_shen_liubei: "誓守桃园义",
diff --git a/apps/core/character/xianding/skill.js b/apps/core/character/xianding/skill.js
index c1c6aad25c..5d56caa9fc 100644
--- a/apps/core/character/xianding/skill.js
+++ b/apps/core/character/xianding/skill.js
@@ -1,8 +1,748 @@
+// @ts-nocheck
import { lib, game, ui, get, ai, _status } from "noname";
import cards from "../sp2/card.js";
/** @type { importCharacterConfig["skill"] } */
const skills = {
+ //威关银屏
+ dcshaowei:{
+ audio: 2,
+ forced: true,
+ locked: false,
+ trigger: {
+ player:"loseAfter",
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ filter(event, player) {
+ if (event.name == "gain" && event.player == player) {
+ return false;
+ }
+ const evt = event.getl(player);
+ if (!evt?.cards2?.length) {
+ return false;
+ }
+ return ["diamond", "heart"].some(suit => {
+ return evt.cards2.some(i => get.suit(i, player) == suit) && !player.getStorage("dcshaowei_used")?.includes(suit);
+ });
+ },
+ async content(event, trigger, player) {
+ const evt = trigger.getl(player);
+ if (!evt?.cards2?.length) {
+ return;
+ }
+ const suits = ["diamond", "heart"].filter(suit => {
+ return evt.cards2.some(i => get.suit(i, player) == suit) && !player.getStorage("dcshaowei_used")?.includes(suit);
+ });
+ if (suits.includes("diamond")) {
+ let cardsx = [];
+ while (cardsx.length < 3) {
+ const card = get.cardPile2(i => get.color(i) == "red" && !cardsx.includes(i));
+ if (card) {
+ cardsx.push(card);
+ }
+ else {
+ break;
+ }
+ }
+ if (cardsx.length) {
+ await player.gain(cardsx, "draw");
+ }
+ player.addTempSkill("dcshaowei_used");
+ player.markAuto("dcshaowei_used", ["diamond"]);
+ }
+ if (suits.includes("heart")) {
+ await player.recover();
+ if (player.hasDisabledSlot()) {
+ await player.chooseToEnable();
+ }
+ player.addTempSkill("dcshaowei_used");
+ player.markAuto("dcshaowei_used", ["heart"]);
+ }
+ },
+ subSkill: {
+ used: {
+ charlotte: true,
+ onremove: true,
+ sub: true,
+ sourceSkill: "dcshaowei",
+ },
+ }
+ },
+ dcdichou: {
+ audio: 2,
+ forced: true,
+ intro: {
+ content: "mark",
+ name2: "仇",
+ },
+ marktext: "仇",
+ trigger: {
+ target: "useCardToTarget",
+ },
+ filter(event, player) {
+ return event.player != player;
+ },
+ async content(event, trigger, player) {
+ const target = trigger.player;
+ if (target.isIn()) {
+ target.addMark("dcdichou", 1);
+ }
+ },
+ group: ["dcdichou_discard", "dcdichou_draw", "dcdichou_damage"],
+ subSkill: {
+ discard: {
+ forced: true,
+ trigger: {
+ player: "phaseBegin",
+ },
+ filter(event,player){
+ return player.hasEnabledSlot() || game.countPlayer(i => i.countMark("dcdichou") && i.countDiscardableCards(player, "he"));
+ },
+ async content(event, trigger, player) {
+ if (player.hasEnabledSlot()) {
+ await player.chooseToDisable();
+ }
+ if (game.countPlayer(i => i.countMark("dcdichou") && i.countDiscardableCards(player, "he"))) {
+ const result = await player
+ .chooseTarget({
+ prompt: "弃置一名有“仇”的角色一张牌",
+ filterTarget(card, player, target) {
+ return target.countMark("dcdichou") && target.countDiscardableCards(player, "he");
+ },
+ forced: true,
+ ai: (target) => {
+ return -get.attitude(get.player(), target);
+ },
+ })
+ .forResult();
+ const target = result.targets[0];
+ const { links } = await player
+ .discardPlayerCard({
+ target,
+ forced: true,
+ position: "he",
+ })
+ .forResult();
+ const card = links[0];
+ if (!card) {
+ return;
+ }
+ const num = get.translation(get.name(card)).length;
+ if (!num) {
+ return;
+ }
+ player.addTempSkill("dcdichou_eff");
+ player.addMark("dcdichou_eff", num);
+ }
+ },
+ sub: true,
+ sourceSkill: "dcdichou",
+ },
+ eff: {
+ audio: 2,
+ charlotte: true,
+ mark: true,
+ intro: {
+ content: "本回合攻击范围与使用【杀】的次数上限均+#",
+ },
+ onremove: true,
+ mod: {
+ attackRange(player, num) {
+ return num + player.countMark("dcdichou_eff");
+ },
+ cardUsable(card, player, num) {
+ if (card.name == "sha") {
+ return num + player.countMark("dcdichou_eff");
+ }
+ },
+ },
+ sub: true,
+ sourceSkill: "dcdichou",
+ },
+ draw: {
+ forced: true,
+ trigger: {
+ player: "useCardToPlayer",
+ },
+ filter(event, player) {
+ return event.target.countMark("dcdichou");
+ },
+ async content(event, trigger, player) {
+ const target = trigger.target;
+ target.removeMark("dcdichou", 1);
+ await player.draw();
+ },
+ sub: true,
+ sourceSkill: "dcdichou",
+ },
+ damage: {
+ forced: true,
+ trigger: {
+ player: "phaseEnd",
+ },
+ filter(event, player) {
+ return game.countPlayer(i => i.countMark("dcdichou"));
+ },
+ async content(event, trigger, player) {
+ const result = await player
+ .chooseTarget({
+ prompt: "对任意名有“仇”的角色各造成一点火焰伤害并移除其“仇”",
+ selectTarget: [1, Infinity],
+ forced: true,
+ filterTarget: (card, player, target) => {
+ return target.countMark("dcdichou");
+ },
+ ai: (target) => {
+ const player = get.player();
+ if (get.damageEffect(target, player, player, "fire") > 0) return 1;
+ return 0;
+ }
+ })
+ .forResult();
+ if (!result.targets?.length) {
+ return;
+ }
+ const targets = result.targets.sortBySeat();
+ player.line(targets);
+ for (let target of targets) {
+ if (!target.isIn()) continue;
+ target.damage("fire");
+ target.removeMark("dcdichou", target.countMark("dcdichou"));
+ }
+ },
+ sub: true,
+ sourceSkill: "dcdichou",
+ },
+ },
+ },
+ //谋王平
+ dcsbyouyi: {
+ audio: 2,
+ trigger: {
+ target: "useCardToTarget",
+ },
+ filter(event, player) {
+ if (!event.player.isIn()) {
+ return false;
+ }
+ if (!get.tag(event.card, "damage") || event.player == player) {
+ return false;
+ }
+ if (!player.getStorage("dcsbyouyi_used")?.length) {
+ return true;
+ }
+ let storage = player.getStorage("dcsbyouyi_used")
+ if (!storage.includes("discard")) {
+ return player.countDiscardableCards("he");
+ }
+ if (!storage.includes("loseHp")) {
+ return true;
+ }
+ return false;
+ },
+ async cost(event, trigger, player) {
+ let choiceList = [
+ "弃置任意张牌,本回合结束时摸等量牌。",
+ "失去至多3点体力,令一名角色摸等量牌,本回合结束时回复等量体力。",
+ ];
+ let controlList = ["弃置牌", "失去体力", "cancel2"];
+ for (let i of [0, 1]) {
+ let list = ["discard", "loseHp"];
+ let bool1 = player.getStorage("dcsbyouyi_used")?.includes(list[i]);
+ let bool2 = (i == 0 ? Boolean(!player.countDiscardableCards("he")) : false);
+ if (bool1 || bool2) {
+ if (bool1) choiceList[i] += "(已发动)";
+ else choiceList[i] += "(无法执行)";
+ choiceList[i] = `'${choiceList[i]}`;
+ controlList[i] = "";
+ }
+ }
+ controlList = controlList.filter(i => i!="");
+ const result = await player
+ .chooseControl({
+ prompt: get.prompt("dcsbyouyi"),
+ controls: controlList,
+ choiceList: choiceList,
+ ai: () => {
+ const list = get.event("list"),
+ player = get.player();
+ if (list.includes("弃置牌") && player.countCards("he", i => {
+ if (["wuxie", "shan", "tao"].includes(get.name(i, player))) {
+ return false;
+ }
+ let val = 5 - get.value(i, player);
+ if (player.getStorage("dcsbfangong")) {
+ val += 1;
+ }
+ return val >= 3;
+ })) {
+ return "弃置牌";
+ }
+ if (list.includes("失去体力") && player.hp >= 3) {
+ return "失去体力";
+ }
+ return "cancel2";
+ }
+ })
+ .set("list", choiceList)
+ .forResult();
+ event.result = {
+ bool: result.control != "cancel2",
+ cost_data: result.control,
+ };
+ },
+ async content(event, trigger, player) {
+ const user = trigger.player;
+ if (!user.isIn()) {
+ return;
+ }
+ player.line(user);
+ user.addTempSkill("dcsbyouyi_sha");
+ user.addMark("dcsbyouyi_sha");
+ const control = event.cost_data;
+ if (control == "弃置牌") {
+ const result = await player
+ .chooseToDiscard({
+ position: "he",
+ selectCard: [1, Infinity],
+ forced: true,
+ ai: (card) => {
+ const player = get.player();
+ if (["wuxie", "shan", "tao"].includes(get.name(card, player))) {
+ return 0;
+ }
+ let val = 5 - get.value(card, player);
+ if (player.getStorage("dcsbfangong")) {
+ val += 1;
+ }
+ if (val < 3) val = 0;
+ return val;
+ }
+ })
+ .forResult();
+ player.addTempSkill("dcsbyouyi_used");
+ player.markAuto("dcsbyouyi_used", ["discard"]);
+ if (!player.storage["dcsbyouyi_eff"]) {
+ player.storage["dcsbyouyi_eff"] = {
+ draw: 0,
+ recover: 0,
+ sum: 0,
+ };
+ }
+ player.storage["dcsbyouyi_eff"].draw += result.cards.length;
+ player.storage["dcsbyouyi_eff"].sum += result.cards.length;
+ }
+ else {
+ const result = await player
+ .chooseControl({
+ controls: ["1", "2", "3"],
+ prompt: "选择失去的体力值",
+ ai: () => {
+ const player = get.player();
+ return String(Math.min(3, Math.max(1, player.hp - 2)));
+ },
+ })
+ .forResult();
+ const num = Number(result.control);
+ await player.loseHp(num);
+ const result1 = await player
+ .chooseTarget({
+ prompt: `令一名角色摸${get.cnNumber(num)}张牌`,
+ forced: true,
+ ai: (target) => {
+ return get.attitude(get.player(), target);
+ }
+ })
+ .forResult();
+ const target = result1.targets[0];
+ await target.draw(num);
+ player.addTempSkill("dcsbyouyi_used");
+ player.markAuto("dcsbyouyi_used", ["loseHp"]);
+ if (!player.storage["dcsbyouyi_eff"]) {
+ player.storage["dcsbyouyi_eff"] = {
+ draw: 0,
+ recover: 0,
+ sum: 0,
+ };
+ }
+ player.storage["dcsbyouyi_eff"].recover += num;
+ player.storage["dcsbyouyi_eff"].sum += num;
+ }
+ const sum = player.storage["dcsbyouyi_eff"]?.sum;
+ if (!sum) {
+ return;
+ }
+ if (sum >= 7) {
+ player.storage["dcsbyouyi_eff"].sum = sum % 7;
+ game.log(player, "重置了", "#g【返攻】");
+ player.restoreSkill("dcsbfangong");
+ }
+ },
+ group: "dcsbyouyi_eff",
+ subSkill: {
+ sha: {
+ charlotte: true,
+ mark: true,
+ intro: {
+ content: "本回合使用【杀】次数+#",
+ },
+ mod: {
+ cardUsable(card, player, num) {
+ if (card.name == "sha") {
+ return num + player.countMark("dcsbyouyi_sha");
+ }
+ },
+ },
+ onremove: true,
+ sub: true,
+ sourceSkill:"dcsbyouyi",
+ },
+ used: {
+ charlotte: true,
+ sub: true,
+ mark: true,
+ intro: {
+ content(storage, player) {
+ let str = "";
+ if (!player.storage["dcsbyouyi_eff"]) {
+ return str;
+ }
+ const { draw, recover } = player.storage["dcsbyouyi_eff"];
+ if (draw) str += `本回合结束时,摸${draw}张牌。`;
+ if (draw && recover) str += "
";
+ if (recover) str += `本回合结束时,回复${recover}点体力。`;
+ return str;
+ },
+ },
+ onremove: true,
+ sourceSkill: "dcsbyouyi",
+ },
+ eff: {
+ charlotte: true,
+ forced: true,
+ popup: false,
+ trigger: {
+ global: ["phaseEnd", "phaseBeginStart"],
+ },
+ filter(event, player) {
+ if (!player.storage["dcsbyouyi_eff"]) return false;
+ const { draw, recover } = player.storage["dcsbyouyi_eff"];
+ return draw || recover;
+ },
+ async content(event, trigger, player) {
+ if (!player.storage["dcsbyouyi_eff"]) return;
+ if (event.triggername == "phaseEnd") {
+ const { draw, recover } = player.storage["dcsbyouyi_eff"];
+ if (draw) player.draw(draw);
+ if (recover) player.recover(recover);
+ }
+ else {
+ player.storage["dcsbyouyi_eff"].draw = 0;
+ player.storage["dcsbyouyi_eff"].recover = 0;
+ }
+ },
+ sub: true,
+ sourceSkill: "dcsbyouyi",
+ },
+ },
+ },
+ dcsbfangong: {
+ enable: "phaseUse",
+ limited: true,
+ skillAnimation: true,
+ animationColor: "orange",
+ async content(event, trigger, player) {
+ player.awakenSkill(event.name, true);
+ await player.recoverTo(player.maxHp);
+ await player.draw(Math.min(5, player.countCards("h")));
+ },
+ mark: true,
+ intro: {
+ content(storage, player) {
+ let str = "";
+ if (!storage) str += "限定技【返攻】未发动";
+ else str += "限定技【返攻】已发动";
+ let storage1 = player.storage["dcsbyouyi_eff"];
+ if (!storage1) return str;
+ str += "
";
+ const sum = storage1.sum;
+ str += `
再通过【诱夷】弃置${7 - sum}张牌或失去${7 - sum}点体力后刷新【返攻】。`;
+ return str;
+ },
+ },
+ init: (player, skill) => player.storage[skill] = false,
+ ai: {
+ order: 7,
+ result: {
+ player: 1,
+ }
+ },
+ },
+ //谋马谡
+ dcsbxinzhan: {
+ audio: 2,
+ trigger: {
+ player: "useCardToPlayer",
+ },
+ filter(event, player) {
+ if (!(event.card?.name=="sha" || get.type(event.card)=="trick") || event.targets.length != 1 || event.target == player) {
+ return false;
+ }
+ const eventx = event.getParent();
+ let history = player.getHistory("useCard", evt => {
+ if (eventx.card?.name == "sha") {
+ return evt != eventx && evt.card?.name == "sha" && evt.targets.length == 1 && evt.target != player;
+ }
+ else {
+ return evt != eventx && get.type(evt.card) == "trick" && evt.targets.length == 1 && evt.target != player;
+ }
+ },eventx);
+ return !history.length;
+ },
+ async content(event, trigger, player) {
+ const target = trigger.target,
+ card = trigger.card;
+ if (!target || !card) return;
+ const result = await player
+ .chooseControl("响应", "不响应")
+ .set("prompt", `猜测你的${get.translation(card)}是否被响应`)
+ .set("ai", () => {
+ return [0, 1].randomGet();
+ })
+ .forResult();
+ player.addTempSkill("dcsbxinzhan_eff");
+ player.markAuto("dcsbxinzhan_eff", [{
+ target: target,
+ card: card,
+ result: result.control,
+ }]);
+ },
+ check(event, player) {
+ if (!event.target) return false;
+ return get.attitude(player, event.target) < 0;
+ },
+ subSkill: {
+ eff: {
+ forced: true,
+ charlotte: true,
+ trigger: { player: "useCardAfter" },
+ filter(event, player) {
+ let storage = player.getStorage("dcsbxinzhan_eff");
+ if (!storage) return false;
+ return storage.some(item => {
+ return item.card === event.card;
+ });
+ },
+ async content(event, trigger, player) {
+ let item = player.storage["dcsbxinzhan_eff"].find(i => i.card == trigger.card);
+ player.storage["dcsbxinzhan_eff"].remove(item);
+ const { target, card, result } = item;
+ let xiangying = "不响应";
+ game.checkGlobalHistory("everything", evt => {
+ if (["useCard", "respond"].includes(evt.name)) {
+ if (Array.isArray(evt.respondTo) && evt.respondTo[1] == card) {
+ xiangying = "响应";
+ }
+ }
+ });
+ if (xiangying == result) {
+ if (target.isIn() && target.countCards("he")) {
+ await player.gainPlayerCard(target, 1, "he", true, "visible");
+ }
+ player.recover();
+ }
+ else {
+ const card0 = get.cardPile(card => card.name == "sha");
+ if (card0) {
+ await player.gain(card0, "gain2");
+ }
+ const cardx = new lib.element.VCard({name: "juedou", isCard: true});
+ if (target.isIn() && player.canUse(cardx, target)) {
+ await player.useCard(cardx, target);
+ }
+ }
+ },
+ sub: true,
+ sourceSkill: "dcsbxinzhan",
+ },
+ },
+ },
+ dcsbchengce: {
+ audio: 2,
+ trigger: { global: "roundStart" },
+ filter(event, player) {
+ return game.countPlayer() > 1;
+ },
+ async content(event, trigger, player) {
+ const cards = get.cards(2, true);
+ if (!cards.length) {
+ return;
+ }
+ await game.cardsGotoOrdering(cards);
+ let list = [["牌堆顶的牌", cards]], prompt = "观看牌堆顶的2张牌";
+ let hs = player.getCards("h");
+ if (hs.length) {
+ list.push(["你的手牌", hs]);
+ prompt = "用任意张手牌交换牌堆顶的等量牌";
+ }
+ const result = await player
+ .chooseToMove({
+ prompt: prompt,
+ forced: true,
+ filterMove: (from, to) => {
+ return typeof to != "number";
+ },
+ list: list,
+ num: 2,
+ })
+ .forResult();
+ event.forceDie = true;
+ if (result.moved[1]?.length) {
+ const lose = result.moved[0].slice();
+ const gain = result.moved[1].slice().filter(i => !get.owner(i));
+ if (lose.some(i => get.owner(i))) {
+ await player.lose(
+ lose.filter(i => get.owner(i)),
+ ui.special
+ );
+ }
+ await game.cardsGotoPile(lose.slice().reverse(), "insert");
+ game.updateRoundNumber();
+ if (gain.length) {
+ await player.gain(gain, "draw");
+ }
+ }
+ else {
+ await game.cardsGotoPile(result.moved[0].slice().reverse(), "insert");
+ }
+ if (game.countPlayer() < 2) {
+ return;
+ }
+ if (player.isIn()) {
+ const result1 = await player
+ .chooseTarget({
+ prompt: "令一名其他角色观看牌堆顶2张牌并获得其中1张",
+ forced: true,
+ filterTarget: (card, player, target) => {
+ return target != player;
+ },
+ ai: target => {
+ let player = get.player();
+ return get.attitude(player, target);
+ },
+ })
+ .forResult();
+ const target = result1.targets[0];
+ const cards0 = get.cards(2, true);
+ const result2 = await target
+ .chooseButton({
+ createDialog: [
+ "选择一张牌获得",
+ cards0
+ ],
+ forced: true,
+ ai: (button) => {
+ const card = button.link;
+ let val = get.value(card);
+ if (!get.tag(card, "damage")) val += 5;
+ return val;
+ }
+ })
+ .forResult();
+ const card0 = result2.links[0];
+ if (!card0) {
+ return;
+ }
+ await target.gain(card0, "draw");
+ if (get.tag(card0, "damage")) {
+ if (player.isIn()) {
+ let cardsx = [];
+ while (cardsx.length < 2) {
+ const card = get.cardPile(i => get.tag(i, "damage") && !cardsx.includes(i));
+ if (card) {
+ cardsx.push(card);
+ }
+ else {
+ break;
+ }
+ }
+ await player.gain(cardsx, "draw");
+ }
+ if (target.isIn()) {
+ let cardsx = target.getCards("h").randomGets(2);
+ if (cardsx?.length) {
+ target.addTempSkill(event.name + "_sha", { global: "roundEnd" });
+ target.addGaintag(cardsx, event.name + "_sha");
+ }
+ }
+ }
+ else {
+ if (player.isIn()) {
+ let cardsx = [];
+ while (cardsx.length < 2) {
+ const card = get.cardPile(i => !get.tag(i, "damage") && !cardsx.includes(i));
+ if (card) {
+ cardsx.push(card);
+ }
+ else {
+ break;
+ }
+ }
+ await player.gain(cardsx, "draw");
+ player.addSkill(event.name + "_mianshang");
+ }
+ if (target.isIn()) {
+ target.addTempSkill("dcsbxinzhan", { global: "roundEnd" });
+ }
+ }
+ }
+ },
+ check: (event, player) => {
+ return game.hasPlayer(current => {
+ return current != player && get.attitude(player, target) > 0;
+ })
+ },
+ subSkill: {
+ sha: {
+ charlotte: true,
+ mod: {
+ cardname(card) {
+ if (get.itemtype(card) == "card" && card.hasGaintag("dcsbchengce_sha")) {
+ return "sha";
+ }
+ },
+ cardnature(card) {
+ if (get.itemtype(card) == "card" && card.hasGaintag("dcsbchengce_sha")) {
+ return false;
+ }
+ }
+ },
+ trigger: {
+ global:"roundEnd"
+ },
+ onremove(player, skill) {
+ player.removeGaintag("dcsbchengce_sha");
+ },
+ sub: true,
+ sourceSkill: "dcsbchengce",
+ },
+ mianshang: {
+ charlotte: true,
+ forced: true,
+ trigger: { player: "damageBegin4" },
+ async content(event, trigger, player) {
+ player.removeSkill(event.name);
+ trigger.cancel();
+ },
+ mark: true,
+ intro: {
+ content: "防止下次受到的伤害",
+ },
+ sub: true,
+ sourceSkill: "dcsbchengce",
+ },
+ },
+ },
//谋诸葛亮------by 清风
dcsbjingmou: {
audio: 2,
diff --git a/apps/core/character/xianding/sort.js b/apps/core/character/xianding/sort.js
index eaf284014c..e39756e0b2 100644
--- a/apps/core/character/xianding/sort.js
+++ b/apps/core/character/xianding/sort.js
@@ -24,9 +24,10 @@ const characterSort = {
sp2_youlin: ["dc_sb_hulie", "dc_sb_dengai"],
sp2_boyan: ["dc_sb_huangquan", "dc_sb_luotong", "dc_sb_xusheng", "dc_sb_zhuran"],
sp2_fengchu: ["dc_sb_zhangren", "dc_sb_liuzhang", "dc_sb_wuyi", "dc_sb_fazheng"],
+ sp2_wuhou: ["dc_sb_masu", "dc_sb_wangping"],
sp2_weizhen: ["v_gongsunzan", "v_zhangliao", "v_lvbu", "v_dongzhuo", "v_machao"],
sp2_junwei: ["v_caopi", "v_sunquan", "v_caocao", "v_liubei"],
- sp2_pianyu: ["v_zhangxingcai", "v_sunshangxiang"],
+ sp2_pianyu: ["v_zhangxingcai", "v_sunshangxiang", "v_guanyinping"],
sp2_waitingforsort: [],
};
@@ -55,6 +56,7 @@ const characterSortTranslate = {
sp2_youlin: "幼麟绝战",
sp2_boyan: "伯言绽火",
sp2_fengchu: "凤雏溯攻",
+ sp2_wuhou: "武侯定南",
sp2_weizhen: "威震天下",
sp2_junwei: "君威盖世",
sp2_pianyu: "片羽威凤",
diff --git a/apps/core/character/xianding/translate.js b/apps/core/character/xianding/translate.js
index e41660d3c7..e9bd8d5435 100644
--- a/apps/core/character/xianding/translate.js
+++ b/apps/core/character/xianding/translate.js
@@ -1,6 +1,24 @@
import { lib, game, ui, get, ai, _status } from "noname";
const translates = {
+ v_guanyinping: "威关银屏",
+ v_guanyinping_prefix: "威",
+ dcshaowei: "绍威",
+ dcshaowei_info: "每回合每项限一次:1.你失去♦️牌后,你从牌堆随机获得3张红色牌;2.你失去♥️牌后,你回复1点体力并恢复1个装备栏。",
+ dcdichou: "涤仇",
+ dcdichou_info: "锁定技。①其他角色对你使用牌时,其获得1个“仇”标记;②你的回合开始时,你废除1个装备栏并弃置一名有“仇”的角色1张牌,本回合你的攻击范围与使用【杀】的次数上限增加X(X为被弃置的牌名字数);③你对有“仇”的角色使用牌时,你摸1张牌并移去其1个“仇”;④你的回合结束时,你对任意名有“仇”的角色各造成1点火焰伤害并移去其所有“仇”。",
+ dc_sb_wangping: "新杀谋王平",
+ dc_sb_wangping_prefix: "新杀谋",
+ dcsbyouyi: "诱夷",
+ dcsbyouyi_info: "每回合每项限一次,你成为其他角色使用的伤害牌的目标时,你可令其本阶段使用的【杀】次数上限+1,然后你选择一项执行:1.弃置任意张牌,本回合结束时摸等量张牌;2.失去至多3点体力并令一名角色摸等量张牌,本回合结束时回复因此失去的体力。 ",
+ dcsbfangong: "返攻",
+ dcsbfangong_info: "限定技,出牌阶段,你可回满体力值并摸当前手牌数张牌(至多摸5张)。你因“诱夷”失去的体力值和牌数的总和每累计达到7后,此技能视为未发动过。",
+ dc_sb_masu: "新杀谋马谡",
+ dc_sb_masu_prefix: "新杀谋",
+ dcsbchengce: "呈策",
+ dcsbchengce_info: `每轮开始时,你可以观看牌堆顶2张牌并用任意张手牌替换其中等量牌,然后你令一名其他角色观看牌堆顶2张牌并获得其中1张。若其获得的牌为:非伤害牌,你获得2张非伤害牌并防止下次你受到的伤害,其获得${get.poptip("dcsbxinzhan")}直到本轮结束;伤害牌,你获得2张伤害牌,其随机2张手牌视为【杀】直到本轮结束。`,
+ dcsbxinzhan: "心战",
+ dcsbxinzhan_info: "每回合各限一次,你每回合首次使用【杀】或普通锦囊牌指定其他角色为唯一目标时,可猜测此牌是否被响应。此牌结算完成后,若你猜对,你观看目标手牌并获得其1张牌,且你回复1点体力;若你没猜对,你获得1张【杀】并视为对其使用一张【决斗】。",
dc_sb_zhugeliang: "新杀谋诸葛亮",
dc_sb_zhugeliang_prefix: "新杀谋",
dcsbjingmou: "靖谋",
diff --git a/apps/core/noname/get/index.js b/apps/core/noname/get/index.js
index d9581734b0..cb228b9d69 100644
--- a/apps/core/noname/get/index.js
+++ b/apps/core/noname/get/index.js
@@ -835,6 +835,9 @@ export class Get {
if (info.feedPigSkill) {
list.add("威主技");
}
+ if (get.is.qidingSkill(skill, player)) {
+ list.add("契定技");
+ }
if (info.categories) {
list.addArray(info.categories(skill, player));
}
@@ -4970,6 +4973,12 @@ else if (entry[1] !== void 0) stringifying[key] = JSON.stringify(entry[1]);*/
}
return "未发动";
}
+ case "qidingSkill": {
+ if (content) {
+ return "此事已成";
+ }
+ return "契约未定";
+ }
case "info": {
return lib.translate[skill + "_info"];
}
diff --git a/apps/core/noname/get/is.js b/apps/core/noname/get/is.js
index 1bff529911..1d49f46704 100644
--- a/apps/core/noname/get/is.js
+++ b/apps/core/noname/get/is.js
@@ -642,6 +642,23 @@ export class Is {
return Boolean(zhuanhuanji);
}
+ /**
+ * @param { string } skill
+ * @param { Player } player
+ * @returns
+ */
+ qidingSkill(skill, player) {
+ const info = get.info(skill);
+ if (!info) {
+ return false;
+ }
+ const { qidingSkill } = info;
+ if (typeof qidingSkill === "function") {
+ return Boolean(qidingSkill(skill, player));
+ }
+ return Boolean(qidingSkill);
+ }
+
/**
* 检查指定玩家的名称的子串是否包含指定字符串
*
diff --git a/apps/core/noname/library/element/player.js b/apps/core/noname/library/element/player.js
index 1ee43bcb88..fda80c10f3 100644
--- a/apps/core/noname/library/element/player.js
+++ b/apps/core/noname/library/element/player.js
@@ -11500,6 +11500,17 @@ export class Player extends HTMLDivElement {
_status.event.clearStepCache();
return this;
}
+ awakenQidingSkill(skill){
+ if (this.storage[skill]) {
+ return;
+ }
+ if (this.storage[skill] === undefined || this.storage[skill] === false) {
+ this.storage[skill] = true;
+ }
+ game.log(`契约已成,${get.translation(this)}将【${get.translation(skill)}】改为锁定技。`);
+ _status.event.clearStepCache();
+ return this;
+ }
restoreSkill(skill, nomark) {
if (this.storage[skill] === true) {
this.storage[skill] = false;
diff --git a/apps/core/noname/library/index.js b/apps/core/noname/library/index.js
index b674769ee8..93cdf90559 100644
--- a/apps/core/noname/library/index.js
+++ b/apps/core/noname/library/index.js
@@ -13720,6 +13720,13 @@ export class Library {
nature: "graymm",
},
],
+ [
+ "嗔",
+ {
+ color: "#5a6968",
+ nature: "graymm",
+ },
+ ],
[
"用间",
{
diff --git a/apps/core/noname/library/poptip.js b/apps/core/noname/library/poptip.js
index 2d2514bf3b..dbb5b1ea59 100644
--- a/apps/core/noname/library/poptip.js
+++ b/apps/core/noname/library/poptip.js
@@ -30,6 +30,7 @@ const _poptipMap = new Map([
["rule_tongxin", { name: "同心", info: "若技能拥有同心效果,则拥有该技能的角色可在回合开始时与其他角色同心直到自己下回合开始(默认为选择一名角色同心),选择的角色称为“同心角色”。拥有同心效果的技能发动后,技能发动者先执行同心效果。然后若有与其同心的角色,这些角色也依次执行同心效果。" }],
["sxrm_connect", { name: "连接", info: `一种对手牌的动作:
被连接的手牌对所有角色可见
一名角色因为使用、打出、弃置而失去连接牌时,所有角色依次弃置被连接的手牌(不可嵌套)
一张连接牌再次被连接或离开手牌区时,重置为正常状态` }],
["sxrm_compare", { name: "延时拼点", info: "拼点的子类,拼点结束后不会立刻公布结果,改为将两张拼点牌扣置并移出游戏;满足一定条件时公开结果,此回合结束后,若仍未满足公开条件,将游戏外的拼点牌移回弃牌堆,并且不再执行拼点的后续效果。" }],
+ ["sxrm_qidingSkill", { name: "契定技", info: "一种技能标签。发动一次后,此技能“契定技”的标签改为“锁定技”并删除技能描述中的“可以”。" }],
["rule_mamba", { name: "牢大", info: "Man! What can I say? Mamba out!" }],
]);
diff --git a/apps/core/vite.config.ts b/apps/core/vite.config.ts
index 898f5adafe..c9f23f1d8b 100644
--- a/apps/core/vite.config.ts
+++ b/apps/core/vite.config.ts
@@ -2,7 +2,7 @@ import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
const port = {
- client: 8080,
+ client: 8081,
server: 8089,
};