update version 2.0.1.1
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -7,6 +7,14 @@ const characters = {
|
||||
img: "extension/术樱包/character/images/zuoci_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/character/audio/zuoci/zuoci_shuying.mp3"]
|
||||
},
|
||||
ganning_shuying: {
|
||||
sex: "male",
|
||||
group: "wu",
|
||||
hp: 4,
|
||||
skills: ["qixi_shuying", "fenwei_shuying"],
|
||||
img: "extension/术樱包/character/images/ganning_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/character/audio/ganning/ganning_shuying.mp3"]
|
||||
},
|
||||
};
|
||||
|
||||
export default characters;
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
const dynamicTranslates = {};
|
||||
const dynamicTranslates = {
|
||||
qixi_shuying(player, skill) {
|
||||
if (player?.storage.fenwei_shuying_upgraded) {
|
||||
return "你可以将一张黑色牌当【过河拆桥】使用。<br>你使用【过河拆桥】结束后,若其弃置过一张牌,你记录该牌的花色。<br>每回合各限一次,若此次花色与上次花色不同,你可以消耗1点蓄力点并选择一项:①摸一张牌。②若该牌仍在弃牌堆中,获得之。";
|
||||
}
|
||||
|
||||
return "你可以将一张黑色牌当【过河拆桥】使用。<br>你使用【过河拆桥】结束后,若其弃置过一张牌,你记录该牌的花色。<br>每回合限一次,若此次花色与上次花色不同,你可以消耗1点蓄力点并选择一项:①摸一张牌。②若该牌仍在弃牌堆中,获得之。";
|
||||
},
|
||||
};
|
||||
|
||||
export default dynamicTranslates;
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.5 MiB |
@@ -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;
|
||||
|
||||
@@ -6,6 +6,12 @@ const translates = {
|
||||
xinsheng_shuying_info: "若你拥有技能〖化身〗,当你受到伤害后,你可以选择一项:①获得一张新化身牌;②更换所展示的化身牌。",
|
||||
jihun_shuying: "羁魂",
|
||||
jihun_shuying_info: "若你拥有技能〖化身〗,当你更换所展示的化身牌或技能时,保留上次声明的技能,直至该技能下次触发、再次更换所展示的化身牌或技能、重铸该技能对应的化身牌。",
|
||||
|
||||
ganning_shuying: "术甘宁",
|
||||
qixi_shuying: "奇袭",
|
||||
qixi_shuying_info: "你可以将一张黑色牌当【过河拆桥】使用。<br>你使用【过河拆桥】结束后,若其弃置过一张牌,你记录该牌的花色。<br>每回合限一次,若此次花色与上次花色不同,你可以消耗1点蓄力点并选择一项:①摸一张牌。②若该牌仍在弃牌堆中,获得之。",
|
||||
fenwei_shuying: "奋威",
|
||||
fenwei_shuying_info: "蓄力技(2/8)每回合各限一次:①当一名角色使用的锦囊牌指定了至少两名角色为目标时,你可以消耗任意点蓄力点并选择其中等量名目标角色,令此牌对这些角色无效。②当有牌不因使用而进入弃牌堆后,你获得1点蓄力点。③当你一次性消耗至少X点蓄力点后(X为当前存活角色数的一半,向上取整),你可以选择一项:⒈视为使用一张【过河拆桥】。⒉升级〖奇袭〗",
|
||||
};
|
||||
|
||||
export default translates;
|
||||
|
||||
Reference in New Issue
Block a user