update version 2.0.1.1

This commit is contained in:
2026-08-29 03:10:14 +08:00
parent 441b4de298
commit c3e83a700a
21 changed files with 977 additions and 173 deletions
+438
View File
@@ -383,6 +383,444 @@ const skills = {
},
},
},
qixi_shuying: {
audio: "ext:术樱包/character/audio/ganning:2",
enable: "chooseToUse",
position: "hes",
filterCard(card) {
return get.color(card) == "black";
},
viewAs: {
name: "guohe",
},
viewAsFilter(player) {
return player.countCards("hes", card => get.color(card) == "black") > 0;
},
prompt: "将一张黑色牌当【过河拆桥】使用",
check(card) {
return 5 - get.value(card);
},
mark: true,
intro: {
content(storage, player) {
let str = storage
? `当前记录花色:${get.translation(storage)}`
: "尚未记录花色";
if (player.storage.fenwei_shuying_upgraded) {
str += "<br>〖奋威〗已升级:摸牌与获得弃牌每回合各限一次";
}
return str;
},
},
group: [
"qixi_shuying_capture",
"qixi_shuying_effect",
],
subSkill: {
capture: {
charlotte: true,
forced: true,
silent: true,
popup: false,
trigger: {
global: ["loseAfter", "loseAsyncAfter"],
},
filter(event, player) {
if (
event.type != "discard" ||
event.getlx === false ||
event.position != ui.discardPile
) {
return false;
}
const useEvent = event.getParent("useCard");
return (
useEvent?.player == player &&
get.name(useEvent.card) == "guohe" &&
event.cards?.length > 0
);
},
content(event, trigger, player) {
const useEvent = trigger.getParent("useCard");
if (!useEvent.qixi_shuying_discarded) {
useEvent.qixi_shuying_discarded = [];
}
useEvent.qixi_shuying_discarded.addArray(trigger.cards);
},
},
effect: {
charlotte: true,
forced: true,
popup: false,
trigger: {
player: "useCardAfter",
},
filter(event, player) {
return (
get.name(event.card) == "guohe" &&
event.qixi_shuying_discarded?.length > 0
);
},
async content(event, trigger, player) {
const cards = trigger.qixi_shuying_discarded;
const card = cards[cards.length - 1];
delete trigger.qixi_shuying_discarded;
if (!card) {
return;
}
const suit = get.suit(card, false);
const previousSuit = player.storage.qixi_shuying;
player.storage.qixi_shuying = suit;
player.syncStorage("qixi_shuying");
player.markSkill("qixi_shuying");
if (
!previousSuit ||
previousSuit == suit ||
player.countCharge() <= 0
) {
return;
}
const upgraded = !!player.storage.fenwei_shuying_upgraded;
const turn = game.phaseNumber;
let usage = player.storage.qixi_shuying_usage;
if (!usage || usage.turn != turn) {
usage = {
turn,
options: [],
};
player.storage.qixi_shuying_usage = usage;
player.syncStorage("qixi_shuying_usage");
}
const usedDraw = usage.options.includes("draw");
const usedGain = usage.options.includes("gain");
const canDraw = upgraded
? !usedDraw
: !usedDraw && !usedGain;
const canGain =
get.position(card, true) == "d" &&
(upgraded
? !usedGain
: !usedDraw && !usedGain);
if (!canDraw && !canGain) {
return;
}
const controls = [];
if (canDraw) {
controls.push("摸一张牌");
}
if (canGain) {
controls.push("获得弃置的牌");
}
controls.push("cancel2");
let choice = "cancel2";
if (canGain && get.value(card, player) > 2) {
choice = "获得弃置的牌";
} else if (canDraw) {
choice = "摸一张牌";
}
const result = await player
.chooseControl(controls)
.set(
"prompt",
`〖奇袭〗记录花色由${get.translation(previousSuit)}变为${get.translation(suit)}`,
)
.set(
"prompt2",
`你可以消耗1点蓄力点,摸一张牌或获得此次弃置的${get.translation(card)}`,
)
.set("choice", choice)
.set("ai", () => get.event().choice)
.forResult();
if (
result.control != "摸一张牌" &&
result.control != "获得弃置的牌"
) {
return;
}
if (player.countCharge() <= 0) {
return;
}
// 先记录具体选项,再扣除蓄力,避免扣除蓄力触发奋威升级时发生嵌套重入。
const option = result.control == "摸一张牌" ? "draw" : "gain";
if (!usage.options.includes(option)) {
usage.options.push(option);
}
player.syncStorage("qixi_shuying_usage");
player.removeCharge(1);
if (result.control == "摸一张牌") {
await player.draw();
return;
}
if (get.position(card, true) == "d") {
await player.gain(card, "gain2");
}
},
},
},
ai: {
order: 9,
result: {
player: 1,
},
},
},
fenwei_shuying: {
audio: "ext:术樱包/character/audio/ganning:2",
chargeSkill: 8,
beginMarkCount: 2,
trigger: {
global: "useCardToPlayered",
},
filter(event, player) {
return (
event.isFirstTarget &&
get.type(event.card) == "trick" &&
event.targets?.length >= 2 &&
player.countCharge() > 0 &&
!player.hasSkill("fenwei_shuying_used")
);
},
async cost(event, trigger, player) {
const max = Math.min(
player.countCharge(),
trigger.targets.length,
);
event.result = await player
.chooseTarget(
get.prompt(event.skill),
`消耗任意点蓄力点,令${get.translation(trigger.card)}对等量名目标角色无效`,
[1, max],
(card, player, target) => {
return get.event().targets.includes(target);
},
)
.set("targets", trigger.targets)
.set("ai", target => {
const player = get.player();
const trigger = get.event().getTrigger();
return -get.effect(
target,
trigger.card,
trigger.player,
player,
);
})
.forResult();
},
async content(event, trigger, player) {
const targets = event.targets;
const num = targets.length;
player.line(targets, "green");
player.removeCharge(num);
player.addTempSkill(
"fenwei_shuying_used",
{ global: "phaseAfter" },
);
trigger.getParent().excluded.addArray(targets);
},
group: [
"fenwei_shuying_init",
"fenwei_shuying_charge",
"fenwei_shuying_choice",
],
subSkill: {
init: {
charlotte: true,
forced: true,
locked: false,
audio: false,
trigger: {
player: "enterGame",
global: "phaseBefore",
},
filter(event, player) {
if (!player.countCharge(true)) {
return false;
}
return event.name != "phase" || game.phaseNumber == 0;
},
async content(event, trigger, player) {
const num = get.info("fenwei_shuying").beginMarkCount;
player.addCharge(num);
await game.delayx();
},
},
charge: {
charlotte: true,
forced: true,
locked: true,
audio: false,
popup: false,
usable: 1,
trigger: {
global: [
"loseAfter",
"loseAsyncAfter",
"cardsDiscardAfter",
],
},
filter(event, player) {
if (!player.countCharge(true)) {
return false;
}
if (event.name.indexOf("lose") == 0) {
if (
event.getlx === false ||
event.position != ui.discardPile
) {
return false;
}
} else {
const parent = event.getParent();
if (parent?.relatedEvent?.name == "useCard") {
return false;
}
}
return event.cards?.length > 0;
},
async content(event, trigger, player) {
player.addCharge(1);
await game.delayx();
},
},
choice: {
charlotte: true,
audio: false,
trigger: {
player: "removeMark",
},
filter(event, player) {
const num = Math.ceil(game.countPlayer() / 2);
return (
event.markName == "charge" &&
event.num >= num &&
!player.hasSkill("fenwei_shuying_choice_used") &&
(
!player.storage.fenwei_shuying_upgraded ||
player.hasUseTarget({ name: "guohe", isCard: true })
)
);
},
async cost(event, trigger, player) {
const num = Math.ceil(game.countPlayer() / 2);
const canUse = player.hasUseTarget({
name: "guohe",
isCard: true,
});
if (player.storage.fenwei_shuying_upgraded) {
const result = await player
.chooseBool(
get.prompt(event.skill),
`你本次消耗了至少${num}点蓄力点,是否视为使用一张【过河拆桥】?`,
)
.set("ai", () => true)
.forResult();
event.result = {
bool: result.bool,
cost_data: "使用过河拆桥",
};
return;
}
const controls = [];
if (canUse) {
controls.push("使用过河拆桥");
}
controls.push("升级奇袭", "cancel2");
const result = await player
.chooseControl(controls)
.set(
"prompt",
`〖奋威〗:你本次消耗了至少${num}点蓄力点`,
)
.set("choice", "升级奇袭")
.set("ai", () => get.event().choice)
.forResult();
if (
result.control == "使用过河拆桥" ||
result.control == "升级奇袭"
) {
event.result = {
bool: true,
cost_data: result.control,
};
}
},
async content(event, trigger, player) {
player.addTempSkill(
"fenwei_shuying_choice_used",
{ global: "phaseAfter" },
);
if (event.cost_data == "升级奇袭") {
player.storage.fenwei_shuying_upgraded = true;
player.syncStorage("fenwei_shuying_upgraded");
game.log(player, "升级了技能", "#g【奇袭】");
player.popup("奇袭·改", "wood");
if (player.hasSkill("qixi_shuying")) {
player.markSkill("qixi_shuying");
}
await game.delayx();
return;
}
if (player.hasUseTarget({ name: "guohe", isCard: true })) {
await player.chooseUseTarget({
prompt: "〖奋威〗:视为使用一张【过河拆桥】",
card: get.autoViewAs({ name: "guohe", isCard: true }),
forced: true,
});
}
},
},
used: {
charlotte: true,
},
choice_used: {
charlotte: true,
},
},
ai: {
expose: 0.2,
threaten: 1.4,
},
},
};
export default skills;