Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added audio/die/bigsb_dengai.mp3
Binary file not shown.
Binary file added audio/skill/olandu1.mp3
Binary file not shown.
Binary file added audio/skill/olandu2.mp3
Binary file not shown.
Binary file added audio/skill/olqiqi1.mp3
Binary file not shown.
Binary file added audio/skill/olqiqi2.mp3
Binary file not shown.
31 changes: 31 additions & 0 deletions card/xianxia.js
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,34 @@ game.import("card", function () {
},
},
},
yushijiesui: {
audio: true,
fullskin: true,
type: "trick",
enable: true,
filterTarget: true,
async content(event, trigger, player) {
const target = event.target;
await target.damage();
await player.loseHp();
},
ai: {
order: 6,
value: 12,
useful: 10,
tag: {
damage: 1,
},
result: {
target(player, target) {
return get.damageEffect(target, player, target);
},
player(player, target) {
return get.effect(player, { name: "losehp" }, player, player);
}
},
},
},
},
skill: {
tiejili_skill: {
Expand Down Expand Up @@ -789,6 +817,8 @@ game.import("card", function () {
yidugongdu_info: "出牌阶段,对一名已受伤的角色使用。你观看其所有手牌,然后若你与其手牌中均有【毒】,弃置其中一张【毒】并与其各摸两张牌,否则你与其依次受到1点无来源伤害。",
dajunyajing: "大军压境",
dajunyajing_info: "出牌阶段,对一名角色使用。其以外的所有角色依次选择是否将一张牌当无距离限制的【杀】对其使用。",
yushijiesui: "玉石皆碎",
yushijiesui_info: "出牌阶段,对一名角色使用。你对目标角色造成1点伤害,然后失去1点体力。",
},
list: [
["diamond", 6, "suibozhuliu"],
Expand All @@ -798,6 +828,7 @@ game.import("card", function () {
["spade", 5, "shangfangbaojian"],
["spade", 5, "qingmingjian"],
["club", 5, "mengchong"],
["heart", 5, "yushijiesui"],
],
};
});
8 changes: 8 additions & 0 deletions character/clan/character.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
const characters = {
clan_hanfu: {
sex: "male",
group: "qun",
hp: 3,
maxHp: 4,
skills: ["clanheta", "clanyingxiang", "clanxumin"],
clans: ["颍川韩氏"],
},
clan_luji: {
sex: "male",
group: "wu",
Expand Down
182 changes: 182 additions & 0 deletions character/clan/skill.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,188 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";

/** @type { importCharacterConfig['skill'] } */
const skills = {
//族韩馥
clanheta: {
audio: 2,
trigger: {
player: "phaseUseBegin",
},
filter(event, player) {
return !player.isLinked();
},
async content(event, trigger, player) {
await player.link(true);
player.addTempSkill("clanheta_effect");
},
subSkill: {
effect: {
trigger: {
player: "useCard1",
},
filter(event, player) {
if (!player.isLinked() || ["equip", "delay"].includes(get.type(event.card))) {
return false;
}
const targets = player.getHistory("useCard", evt => {
return evt?.targets?.length && evt != event;
}, event).map(evt => evt.targets ?? []).flat().toUniqued();
return targets.some(target => {
if (event.targets?.includes(target)) {
return true;
}
return lib.filter.targetEnabled(event.card, player, target);
});
},
charlotte: true,
async cost(event, trigger, player) {
const targets = player.getHistory("useCard", evt => {
return evt?.targets?.length && evt != trigger;
}, trigger).map(evt => evt.targets ?? []).flat().toUniqued();
event.result = await player
.chooseTarget((card, player, target) => {
const { targetx, targety, cardx } = get.event();
if (!targetx.includes(target)) {
return false;
}
if (ui.selected.targets?.length) {
const first = ui.selected.targets[0];
if (targety.includes(first) !== targety.includes(target)) {
return false;
}
}
return targety.includes(target) || lib.filter.targetEnabled(cardx, player, target);
}, [1, Infinity])
.set("targetx", targets)
.set("targety", trigger.targets)
.set("cardx", trigger.card)
.set("complexTarget", true)
.set("targetprompt", target => {
const { targety } = get.event();
return targety.includes(target) ? "取消目标" : "成为目标";
})
.set("prompt", get.translation(event.skill))
.set("prompt2", "为此牌增加或减少任意个目标")
.set("ai", target => {
const { targety, cardx, player } = get.event(),
eff = get.effect(target, cardx, player, player);
if (targety.includes(target)) {
return -eff * get.attitude(player, target);
}
return eff * get.attitude(player, target);
})
.forResult();
},
async content(event, trigger, player) {
await player.link(false);
const bool = trigger.targets.containsSome(...event.targets);
trigger.targets[bool ? "removeArray" : "addArray"](event.targets);
await game.delay();
},
},
},
},
clanyingxiang: {
audio: 2,
trigger: {
player: "phaseUseEnd",
},
filter(event, player) {
return game.hasPlayer(current => player.canCompare(current));
},
async cost(event, trigger, player) {
const list = get.inpileVCardList(info => {
if (info[0] == "basic" && !info[3]) {
return true;
}
if (info[0] != "trick") {
return false;
}
const infox = lib.card[info[2]];
if (infox.notarget || (info.selectTarget && infox.selectTarget != 1)) {
return false;
}
return infox.type == "trick";
});
if (!list.length) {
return;
}
const result = await player
.chooseButtonTarget({
createDialog: [get.prompt2(event.skill), [list, "vcard"]],
filterTarget(card, player, target) {
return player.canCompare(target);
},
ai1(button) {
const card = player.getCards("h").maxBy(card => {
return get.number(card);
}, card.name == button.link[2]);
if (card) {
return get.number(card);
}
return 0;
},
ai2(target) {
return -get.attitude(get.player(), target);
},
})
.forResult();
if (result.bool) {
event.result = {
bool: true,
targets: result.targets,
cost_data: result.links[0][2],
};
}
},
async content(event, trigger, player) {
const { targets: [target], cost_data: name } = event;
game.log(player, "声明的牌名为", `#y${get.translation(name)}`);
player.chat(name);
const result = await player.chooseToCompare(target).forResult();
if (!result.tie) {
const winner = result.bool ? player : target,
card = new lib.element.VCard({ name: name });
if (winner.hasUseTarget(card)) {
await winner.chooseUseTarget(card, true);
}
}
const cards = [result.player, result.target];
if (cards.some(card => card.name == name)) {
if (player.hasSkill("clanxumin", null, null, false) && !player.hasSkill("clanxumin")) {
player.restoreSkill("clanxumin");
game.log(player, "重置了", "【恤民】");
}
} else {
if (cards.someInD("od")) {
await player.gain(cards.filterInD("od"), "gain2");
}
const skills = player.getSkills(null, false, false).filter(skill => {
let info = get.info(skill);
if (!info || info.charlotte || get.skillInfoTranslation(skill, player).length == 0) {
return false;
}
return true;
});
const result2 = skills.length > 1 ? await player
.chooseButton(["迎乡:失去一个技能", [skills, "skill"]], true)
.set("ai", button => {
const { link } = button;
const info = get.info(link);
if (info?.ai?.neg || info?.ai?.halfneg) {
return 3;
}
return ["clanyingxiang", "clanxumin"].indexOf(link) + 1;
})
.forResult() : {
bool: true,
links: skills,
};
if (result2?.bool && result2?.links?.length) {
await player.removeSkills(result2.links);
}
}
},
},
//族陆绩
clangailan: {
audio: 2,
Expand Down
2 changes: 1 addition & 1 deletion character/clan/sort.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const characterSort = {
clan_wu: ["clan_wuyi", "clan_wuxian", "clan_wuban", "clan_wukuang", "clan_wuqiao"],
clan_xun: ["clan_xunshu", "clan_xunchen", "clan_xuncai", "clan_xuncan", "clan_xunyou", "clan_xunshuang"],
clan_han: ["clan_hanshao", "clan_hanrong"],
clan_han: ["clan_hanshao", "clan_hanrong", "clan_hanfu"],
clan_wang: ["clan_wangshen", "clan_wangling", "clan_wangyun", "clan_wanghun", "clan_wanglun", "clan_wangguang", "clan_wangmingshan", "clan_wangchang"],
clan_zhong: ["clan_zhongyan", "clan_zhonghui", "clan_zhongyu", "clan_zhongyao"],
clan_yang: ["clan_yangci", "clan_yangxiu", "clan_yangzhong", "clan_yangbiao"],
Expand Down
6 changes: 6 additions & 0 deletions character/clan/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,12 @@ const translates = {
clantanfeng_info: "出牌阶段限一次,你可以视为对一名角色使用一张无视防具且不计次数的【杀】。若此【杀】造成伤害,你摸X张牌(X为你与其装备区牌数之差);否则其可视为对你使用一张【杀】。",
clanjuewei: "绝围",
clanjuewei_info: "每回合限一次,你使用伤害牌指定目标后,或你成为伤害牌的目标后,你可选择一项:1.重铸一张装备牌,于此牌结算完成后视为对一名不为你的目标角色使用此牌;2.弃置一张装备牌,令此牌无效。",
clan_hanfu: "族韩馥",
clan_hanfu_prefix: "族",
clanheta: "和他",
clanheta_info: "出牌阶段开始时,你可以进入连环状态。然后本回合你使用牌时,可以解除连环状态并为此牌增加或减少任意名目标(无距离限制,仅能选择本回合你此前对其使用过牌的角色)。",
clanyingxiang: "迎乡",
clanyingxiang_info: "出牌阶段结束时,你可以声明一张基本牌或单目标锦囊牌的牌名并拼点,赢的角色视为使用你声明的牌。若拼点牌包含声明的牌名,你视为未发动〖恤民〗,否则你获得所有拼点牌并失去一个技能。",
};

export default translates;
7 changes: 7 additions & 0 deletions character/collab/character.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
const characters = {
bigsb_dengai: {
sex: "male",
group: "wei",
hp: 3,
maxHp: 5,
skills: ["olandu", "olqiqi"],
},
wild_liru: {
sex: "male",
group: "qun",
Expand Down
4 changes: 3 additions & 1 deletion character/collab/pinyin.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
const pinyins = {};
const pinyins = {
大宛: ["dà yuān"],
};
export default pinyins;
Loading