Skip to content

Commit 08812da

Browse files
authored
Merge pull request #2658 from AstralBarrage/PRBranch
君霸天下,渭南风云
2 parents e74aef4 + e4bcbd0 commit 08812da

File tree

19 files changed

+1412
-11
lines changed

19 files changed

+1412
-11
lines changed

card/xianxia.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,63 @@ game.import("card", function () {
422422
},
423423
},
424424
},
425+
dajunyajing: {
426+
audio: true,
427+
fullskin: true,
428+
type: "trick",
429+
enable: true,
430+
filterTarget: true,
431+
async content(event, trigger, player) {
432+
const target = event.target;
433+
const targets = game
434+
.filterPlayer(current => {
435+
return current != target;
436+
})
437+
.sortBySeat(_status.currentPhase);
438+
for (const current of targets) {
439+
if (!target.isIn()) {
440+
return;
441+
}
442+
if (!current.isIn() || !current.countCards("hes") || current.hasSkill("diaohulishan")) {
443+
continue;
444+
}
445+
const next = current.chooseToUse();
446+
next.set("openskilldialog", `大军压境:是否将一张牌当作【杀】对${get.translation(target)}使用?`);
447+
next.set("norestore", true);
448+
next.set("_backupevent", `dajunyajing_backup`);
449+
next.set("custom", {
450+
add: {},
451+
replace: { window() {} },
452+
});
453+
next.backup(`dajunyajing_backup`);
454+
next.set("targetRequired", true);
455+
next.set("complexSelect", true);
456+
next.set("filterTarget", function (card, player, target) {
457+
const { sourcex } = get.event();
458+
if (target != sourcex && !ui.selected.targets.includes(sourcex)) {
459+
return false;
460+
}
461+
return lib.filter.targetEnabled.apply(this, arguments);
462+
});
463+
next.set("sourcex", target);
464+
next.set("addCount", false);
465+
await next;
466+
}
467+
},
468+
ai: {
469+
order: 6,
470+
value: 12,
471+
useful: 10,
472+
tag: {
473+
damage: 1,
474+
},
475+
result: {
476+
target(player, target) {
477+
return -1 * (game.countPlayer() - 1);
478+
},
479+
},
480+
},
481+
},
425482
},
426483
skill: {
427484
tiejili_skill: {
@@ -689,6 +746,20 @@ game.import("card", function () {
689746
},
690747
},
691748
},
749+
dajunyajing_backup: {
750+
filterCard(card) {
751+
return get.itemtype(card) == "card";
752+
},
753+
viewAs: {
754+
name: "sha",
755+
},
756+
selectCard: 1,
757+
position: "hes",
758+
ai1(card) {
759+
return 7 - get.value(card);
760+
},
761+
log: false,
762+
},
692763
},
693764
translate: {
694765
tiejili: "铁蒺藜骨朵",
@@ -718,6 +789,8 @@ game.import("card", function () {
718789
mengchong_skill_info: "锁定技,当你使用牌结算结束后,你选择与其他角色互相计算距离+1或-1直到你的下个回合开始(至多+2/-2)。",
719790
yidugongdu: "以毒攻毒",
720791
yidugongdu_info: "出牌阶段,对一名已受伤的角色使用。你观看其所有手牌,然后若你与其手牌中均有【毒】,弃置其中一张【毒】并与其各摸两张牌,否则你与其依次受到1点无来源伤害。",
792+
dajunyajing: "大军压境",
793+
dajunyajing_info: "出牌阶段,对一名角色使用。其以外的所有角色依次选择是否将一张牌当无距离限制的【杀】对其使用。",
721794
},
722795
list: [
723796
["diamond", 6, "suibozhuliu"],

character/extra/character.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,18 @@
11
const characters = {
2+
wn_shen_machao: {
3+
sex: "male",
4+
group: "shen",
5+
hp: 5,
6+
skills: ["wn_qiangshu", "wn_yuma"],
7+
groupInGuozhan: "shu",
8+
},
9+
wn_shen_xuzhu: {
10+
sex: "male",
11+
group: "shen",
12+
hp: 5,
13+
skills: ["wn_zhuanzhan", "wn_huwei"],
14+
groupInGuozhan: "wei",
15+
},
216
ca_shen_wangyun: {
317
sex: "male",
418
group: "shen",

character/extra/skill.js

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,173 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js";
22

33
/** @type { importCharacterConfig['skill'] } */
44
const skills = {
5+
//渭南神马超
6+
wn_qiangshu: {
7+
trigger: {
8+
source: "damageBegin1",
9+
},
10+
filter(event, player) {
11+
if (!event.card || !["sha", "juedou"].includes(event.card.name)) {
12+
return false;
13+
}
14+
const num = player.getAttackRange() - 1;
15+
return num > 0 && player.countCards("he") >= num;
16+
},
17+
async cost(event, trigger, player) {
18+
const num = player.getAttackRange() - 1;
19+
event.result = await player
20+
.chooseToDiscard("he", get.prompt2(event.skill), num)
21+
.set("chooseonly", true)
22+
.set("ai", card => {
23+
const trigger = get.event().getTrigger(),
24+
player = get.player();
25+
if (get.damageEffect(trigger.player, trigger.source, player) <= 0) {
26+
return 0;
27+
}
28+
return 7 - get.value(card);
29+
})
30+
.forResult();
31+
event.result.targets = [trigger.player];
32+
},
33+
async content(event, trigger, player) {
34+
await player.discard(event.cards);
35+
trigger.num += event.cards.length;
36+
},
37+
},
38+
wn_yuma: {
39+
trigger: {
40+
global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"],
41+
},
42+
usable: 1,
43+
filter(event, player) {
44+
if (!event.getd || !event.getl) {
45+
return false;
46+
}
47+
let cards = event.getd();
48+
return cards.some(card => {
49+
if (get.position(card) != "d" || get.type(card) != "equip") {
50+
return false;
51+
}
52+
if (card.willBeDestroyed("discardPile", get.owner(card), event)) {
53+
return false;
54+
}
55+
return game.hasPlayer(current => {
56+
return current.canEquip(card, true);
57+
});
58+
});
59+
},
60+
async cost(event, trigger, player) {
61+
const cards = trigger.getd().filter(card => {
62+
if (get.position(card) != "d" || get.type(card) != "equip") {
63+
return false;
64+
}
65+
if (card.willBeDestroyed("discardPile", get.owner(card), trigger)) {
66+
return false;
67+
}
68+
return true;
69+
});
70+
const { result: { bool, targets, links } } = await player
71+
.chooseButtonTarget({
72+
createDialog: [get.prompt2(event.skill), cards],
73+
filterTarget(card, player, target) {
74+
const buttons = ui.selected.buttons;
75+
if (!buttons.length) {
76+
return false;
77+
}
78+
return target.canEquip(buttons[0].link, true);
79+
},
80+
ai1(button) {
81+
return 20 - get.value(button.link);
82+
},
83+
ai2(target) {
84+
const player = get.player();
85+
const card = ui.selected.buttons[0]?.link;
86+
if (!target.countCards("h")) {
87+
return get.value(card, target) * get.attitude(player, target);
88+
}
89+
return (get.value(card, target) - target.countCards("h")) * get.attitude(player, target);
90+
},
91+
});
92+
event.result = {
93+
bool: bool,
94+
targets: targets,
95+
cards: links,
96+
};
97+
},
98+
async content(event, trigger, player) {
99+
const { targets: [target], cards: [card] } = event;
100+
target.$gain2(card);
101+
await game.delay();
102+
await target.equip(card);
103+
const num = target.countCards("h");
104+
if (num > 0 && target != player) {
105+
await player.gainPlayerCard(target, true, "h", num);
106+
}
107+
},
108+
},
109+
//渭南神许褚
110+
wn_zhuanzhan: {
111+
trigger: {
112+
global: "phaseZhunbeiBegin",
113+
},
114+
filter(event, player) {
115+
if (event.player == player || !player.hasEnabledSlot()) {
116+
return false;
117+
}
118+
const card = new lib.element.VCard({ name: "juedou" });
119+
return player.canUse(card, event.player);
120+
},
121+
async cost(event, trigger, player) {
122+
let list = [];
123+
for (let i = 1; i <= 5; i++) {
124+
const slot = `equip${i}`;
125+
if (player.hasEnabledSlot(slot)) {
126+
list.push("equip" + i);
127+
}
128+
}
129+
list.push("cancel2");
130+
let bool = "cancel2";
131+
const card = new lib.element.VCard({ name: "juedou" });
132+
if (get.effect(trigger.player, card, player, player) > 0) {
133+
bool = list.filter(i => i != "cancel2").randomGet();
134+
}
135+
const result = await player
136+
.chooseControl(list)
137+
.set("prompt", get.prompt2(event.skill))
138+
.set("ai", () => get.event("bool"))
139+
.set("bool", bool)
140+
.forResult();
141+
event.result = {
142+
bool: result.control != "cancel2",
143+
targets: [trigger.player],
144+
cost_data: result.control,
145+
};
146+
},
147+
async content(event, trigger, player) {
148+
const slot = event.cost_data;
149+
await player.disableEquip([slot]);
150+
const card = new lib.element.VCard({ name: "juedou" });
151+
if (player.canUse(card, trigger.player)) {
152+
await player.useCard(card, trigger.player);
153+
}
154+
},
155+
},
156+
wn_huwei: {
157+
trigger: {
158+
player: "phaseDrawBegin2",
159+
},
160+
forced: true,
161+
filter(event, player) {
162+
let list = Array.from({ length: 13 }).map((_, i) => "equip" + parseFloat(i + 1));
163+
list = list.filter(i => player.hasDisabledSlot(i));
164+
return !event.numFixed && list.length;
165+
},
166+
async content(event, trigger, player) {
167+
let list = Array.from({ length: 13 }).map((_, i) => "equip" + parseFloat(i + 1));
168+
let num = list.reduce((sum, slot) => sum + player.countDisabledSlot(slot), 0);
169+
trigger.num += num;
170+
},
171+
},
5172
//汉末神王允
6173
caanchao: {
7174
trigger: {

character/extra/sort.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const characterSort = {
1515
extra_offline: ["shen_jiaxu", "shen_diaochan", "boss_zhaoyun", "le_shen_jiaxu", "ps_shen_machao"],
1616
extra_hanmo: ["hm_shen_yl_luzhi", "hm_shen_huangfusong", "hm_shen_zhangjiao", "hm_shen_zhangbao", "hm_shen_zhangliang", "hm_shen_zhujun"],
1717
extra_changan: ["ca_shen_wangyun", "ca_shen_caocao", "ca_shen_lijueguosi", "zombie_jiaxu", "zombie_zombie"],
18+
extra_weinan: ["wn_shen_machao", "wn_shen_xuzhu"],
1819
extra_taoyuan: ["ty_shen_zhangfei", "ty_shen_guanyu", "ty_shen_liubei"],
1920
extra_jingxiang: ["jx_shen_caoren", "jx_shen_liubiao"],
2021
};
@@ -37,6 +38,7 @@ const characterSortTranslate = {
3738
extra_mb: "移动版神将",
3839
extra_hanmo: "风云志·汉末风云",
3940
extra_changan: "风云志·长安风云",
41+
extra_weinan: "风云志·渭南风云",
4042
extra_taoyuan: "山河煮酒·桃园挽歌",
4143
extra_jingxiang: "风云志·荆襄风云",
4244
};

character/extra/translate.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,19 @@ const translates = {
441441
cayurong_info: "锁定技,你于一轮内首次成为一种伤害牌的目标时,取消之。",
442442
cadingxi: "定西",
443443
cadingxi_info: "蓄力技(4/∞)。当你连续使用一种类型的牌时,你可以消耗1点蓄力值并展示牌堆顶的一张牌,若类型相同,你使用之,否则你从牌堆底摸一张牌;若连续相同2/3次,你回复全部体力/对所有其他角色各造成1点伤害。",
444+
445+
wn_shen_machao: "渭南神马超",
446+
wn_shen_machao_prefix: "渭南神",
447+
wn_qiangshu: "枪术",
448+
wn_qiangshu_info: "你使用【杀】或【决斗】造成伤害时,可以弃置X张牌,令此伤害+X(X为你的攻击范围-1)。",
449+
wn_yuma: "御马",
450+
wn_yuma_info: "每回合限一次,一张装备牌进入弃牌堆后,你可以将此牌置入一名角色装备区,然后获得其所有手牌。",
451+
wn_shen_xuzhu: "渭南神许褚",
452+
wn_shen_xuzhu_prefix: "渭南神",
453+
wn_zhuanzhan: "转战",
454+
wn_zhuanzhan_info: "其他角色的准备阶段,你可以废除一个装备栏并视为对其使用一张【决斗】。",
455+
wn_huwei: "虎威",
456+
wn_huwei_info: "锁定技,摸牌阶段你多摸X张牌(X为你已废除的装备栏数)。",
444457
};
445458

446459
export default translates;

character/offline/character.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,72 @@
11
const characters = {
2+
wn_caocao: {
3+
sex: "male",
4+
group: "wei",
5+
hp: 4,
6+
isZhugong: true,
7+
skills: ["wn_dingluan", "wn_zhuijiang"],
8+
},
9+
wn_hansui: {
10+
sex: "male",
11+
group: "qun",
12+
hp: 4,
13+
maxHp: 5,
14+
isZhugong: true,
15+
skills: ["wn_jubing", "wn_xiongju"],
16+
},
17+
wn_houxuan: {
18+
sex: "male",
19+
group: "qun",
20+
hp: 4,
21+
skills: ["wn_zhongtao", "mashu"],
22+
},
23+
wn_chengyi: {
24+
sex: "male",
25+
group: "qun",
26+
hp: 4,
27+
skills: ["wn_dutan"],
28+
},
29+
wn_yangqiú: {
30+
sex: "male",
31+
group: "qun",
32+
hp: 4,
33+
skills: ["wn_qifeng"],
34+
},
35+
pe_jun_caopi: {
36+
sex: "male",
37+
group: "wei",
38+
hp: 3,
39+
isZhugong: true,
40+
skills: ["jun_cuanzun", "jun_liufang", "songwei"],
41+
},
42+
pe_jun_liushan: {
43+
sex: "male",
44+
group: "shu",
45+
hp: 3,
46+
isZhugong: true,
47+
skills: ["jun_fuxiang", "jun_leling", "ruoyu"],
48+
},
49+
pe_jun_sunquan: {
50+
sex: "male",
51+
group: "wu",
52+
hp: 4,
53+
isZhugong: true,
54+
skills: ["jun_henglv", "jiuyuan"],
55+
},
56+
pe_jun_liuxie: {
57+
sex: "male",
58+
group: "qun",
59+
hp: 3,
60+
isZhugong: true,
61+
skills: ["jun_tianze", "jun_zhaoshou", "twzhuiting"],
62+
},
63+
pe_jun_liuhong: {
64+
sex: "male",
65+
group: "qun",
66+
hp: 4,
67+
isZhugong: true,
68+
skills: ["jun_gezhi", "jun_julian"],
69+
},
270
pe_que: {
371
sex: "male",
472
group: "qun",

0 commit comments

Comments
 (0)