fixed # 修复部分天书乱斗的问题

This commit is contained in:
2026-10-12 15:10:31 +08:00
parent 0205bbebc6
commit 279f2d9b0a
19 changed files with 888 additions and 103 deletions
@@ -17,11 +17,18 @@ const dynamicTranslates = {
},
//司马懿
langgu_shuying(player, skill) {
const condition = getTianshuDifficulty() == "nightmare"
? "黑色" : "黑桃";
return "锁定技,每回合限一次,当你获得其他角色的牌时,进行一次判定:"
+ `若结果为${condition},随机弃置其1张手牌,且视为此技能本回合未发动过。`;
},
yuanlv_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
return "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成过1点伤害。";
return "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且视为受到该敌方角色造成的1点伤害。";
}
return "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成1点伤害。";
@@ -66,18 +73,29 @@ const dynamicTranslates = {
return `锁定技,回合开始时,你摸X张牌并对至多X名角色造成1点伤害,然后你失去1点体力。X为你已损失体力且最大为${num}。`
},
qubu_shuying(player, skill) {
const condition = getTianshuDifficulty() == "nightmare"
? "黑色" : "黑桃";
return "锁定技,当友方角色使用【杀】指定目标时,进行一次判定:"
+ `若结果为${condition},你对此【杀】的所有目标造成1点伤害。`;
},
//袁术
wangzun_shuying(player, skill) {
const num =
getTianshuDifficulty() == "nightmare" ? 2 : 1;
const condition = getTianshuDifficulty() == "nightmare"
? "对你造成过伤害" : "对你造成的伤害数超过1点";
return `锁定技,其他敌方角色的结束阶段,若其本回合:1.没有对你造成伤害,则其弃置${num}张牌;2.对你造成的伤害数超过1点,则你对其造成1点伤害。`;
return `锁定技,其他敌方角色的结束阶段,若其本回合:1.没有对你造成伤害,则其弃置${num}张牌;2.${condition},则你对其造成1点伤害。`;
},
duoxi_shuying(player, skill) {
const num =
getTianshuDifficulty() == "nightmare" ? 2 : 1;
if (getTianshuDifficulty() == "nightmare") {
return "其他角色的摸牌阶段,你可以失去1点体力,改为你摸2张牌。";
}
return `其他角色的摸牌阶段,你可以失去1点体力,改为你与其各摸${num}张牌。`;
return "其他角色的摸牌阶段,你可以失去1点体力,改为你与其各摸1张牌。";
},
//张角
@@ -88,6 +106,12 @@ const dynamicTranslates = {
return "其他角色使用【杀】指定除你外的角色时,若你在其攻击范围内,你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。";
},
yinlei_shuying(player, skill) {
const condition = getTianshuDifficulty() == "nightmare"
? "失去牌" : "于回合外失去牌";
return `锁定技,当你${condition}时,随机横置一名角色。`;
},
};
export default dynamicTranslates;
+70 -54
View File
@@ -114,14 +114,19 @@ const skills = {
if (difficulty == "nightmare") {
for (const target of enemies) {
const card = target.getGainableCards(player, "e").randomGet();
if (!card) continue;
player.line(target);
await player.gainPlayerCard({ target, position: "e", forced: true });
await player.gain(card, target, "give");
}
}
else {
const target = enemies.randomGet();
if (!target) return;
const card = target.getGainableCards(player, "e").randomGet();
if (!card) return;
player.line(target);
await player.gainPlayerCard({ target, position: "e", forced: true });
await player.gain(card, target, "give");
}
},
ai: {
@@ -157,18 +162,20 @@ const skills = {
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { player: "damageEnd" },
logTarget: "source",
getIndex(event) {
return event.num;
},
filter(event, player) {
return (
event.num > 0 &&
event.source?.isIn() &&
player.getEnemies(null, false).includes(event.source) &&
event.source.hasGainableCards(player, "he")
event.source.hasGainableCards(player, event.source == player ? "e" : "he")
);
},
async content(event, trigger, player) {
await player.gainPlayerCard({
target: trigger.source,
position: "he",
position: trigger.source == player ? "e" : "he",
forced: true,
});
},
@@ -241,7 +248,6 @@ const skills = {
return game.hasPlayer(current => {
return (
current != player &&
player.getEnemies(null, false).includes(current) &&
event.getl?.(current)?.cards2?.length
);
});
@@ -250,20 +256,31 @@ const skills = {
const source = game.findPlayer(current => {
return (
current != player &&
player.getEnemies(null, false).includes(current) &&
trigger.getl?.(current)?.cards2?.length
);
});
if (!source) return;
player.addTempSkill("langgu_shuying_used", "roundStart");
player.addTempSkill("langgu_shuying_used", {
global: "phaseAfter",
});
const result = await player.judge(card => get.suit(card) == "spade" ? 2 : 0).forResult();
if (result.bool && source.isIn() && source.countDiscardableCards(player, "h") > 0) {
const isNightmare = getTianshuDifficulty() == "nightmare";
const result = await player.judge(card => {
const success = isNightmare
? get.color(card) == "black"
: get.suit(card) == "spade";
return success ? 2 : 0;
}).forResult();
if (result.bool) {
player.removeSkill("langgu_shuying_used");
if (!source.isIn()) return;
const card = source.getDiscardableCards(player, "h").randomGet();
if (!card) return;
player.line(source);
const card = source.getCards("h").randomGet();
await source.discard(card);
const discardEvent = source.discard(card);
discardEvent.discarder = player;
await discardEvent;
}
},
subSkill: {
@@ -603,31 +620,30 @@ const skills = {
trigger: { player: "phaseBegin" },
forced: true,
locked: true,
filter(event, player) {
return player.getDamagedHp() > 0;
},
async content(event, trigger, player) {
let maxNum = 3;
if (getTianshuDifficulty() == "hard") maxNum = 4;
if (getTianshuDifficulty() == "nightmare") maxNum = 5;
const num = Math.min(maxNum, player.getDamagedHp());
await player.draw(num);
if (num > 0) {
await player.draw(num);
const result = await player
.chooseTarget(`对至多${get.cnNumber(num)}名角色造成1点伤害`, [1, num], (card, player, target) => {
return target.isIn() && player.getEnemies(null, false).includes(target);
})
.set("ai", target => {
const player = get.player();
return get.damageEffect(target, player, player);
})
.forResult();
const result = await player
.chooseTarget(`对至多${get.cnNumber(num)}名角色造成1点伤害`, [1, num], (card, player, target) => {
return target.isIn();
})
.set("ai", target => {
const player = get.player();
return get.damageEffect(target, player, player);
})
.forResult();
if (result.bool) {
for (const target of result.targets) {
player.line(target);
await target.damage(1, player);
if (result.bool) {
for (const target of result.targets) {
player.line(target);
await target.damage(1, player);
}
}
}
@@ -645,6 +661,7 @@ const skills = {
locked: true,
filter(event, player) {
return (
event.isFirstTarget &&
event.card.name == "sha" &&
event.player?.isIn() &&
!player.getEnemies(null, false).includes(event.player) &&
@@ -652,8 +669,14 @@ const skills = {
);
},
async content(event, trigger, player) {
const isNightmare = getTianshuDifficulty() == "nightmare";
const result = await player
.judge(card => get.color(card) == "black" ? 2 : -1)
.judge(card => {
const success = isNightmare
? get.color(card) == "black"
: get.suit(card) == "spade";
return success ? 2 : -1;
})
.set("judge2", result => result.bool)
.forResult();
@@ -753,7 +776,7 @@ const skills = {
return sum;
}, 0);
if (damageNum > 1) return true;
if (damageNum > (getTianshuDifficulty() == "nightmare" ? 0 : 1)) return true;
return (
damageNum == 0 &&
@@ -784,7 +807,7 @@ const skills = {
if (num > 0) {
await target.chooseToDiscard(num, "he", true);
}
} else if (damageNum > 1 && target.isIn()) {
} else if (damageNum > (getTianshuDifficulty() == "nightmare" ? 0 : 1) && target.isIn()) {
await target.damage(1, player);
}
},
@@ -807,11 +830,14 @@ const skills = {
async cost(event, trigger, player) {
const num =
getTianshuDifficulty() == "nightmare" ? 2 : 1;
const drawText = getTianshuDifficulty() == "nightmare"
? `你摸${get.cnNumber(num)}张牌`
: `你与其各摸${get.cnNumber(num)}张牌`;
event.result = await player
.chooseBool(
get.prompt(event.skill, trigger.player),
`失去1点体力,将${get.translation(trigger.player)}的摸牌阶段改为你与其各摸${get.cnNumber(num)}张牌`
`失去1点体力,将${get.translation(trigger.player)}的摸牌阶段改为${drawText}`
)
.set("ai", () => {
const player = get.player();
@@ -823,10 +849,12 @@ const skills = {
: 1;
if (player.hp <= 1) return false;
const isEnemy = player
.getEnemies(null, false)
.includes(target);
if (getTianshuDifficulty() == "nightmare") {
return isEnemy && player.hp > 2;
}
// 避免额外增加敌方摸牌,或削减友方原本的摸牌数
if (isEnemy && trigger.num < num) return false;
@@ -846,7 +874,8 @@ const skills = {
await player.loseHp();
const targets = [player, target].filter(
const targets = (getTianshuDifficulty() == "nightmare"
? [player] : [player, target]).filter(
current => current.isIn()
);
if (targets.length) {
@@ -972,12 +1001,8 @@ const skills = {
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { player: ["useCard", "respond"] },
filter(event, player) {
return (
event.card.name == "shan" &&
player
.getEnemies(null, false)
.some(target => target.isIn())
);
return event.card.name == "shan"
&& game.hasPlayer(target => target != player && target.isIn());
},
line: "thunder",
async cost(event, trigger, player) {
@@ -985,12 +1010,7 @@ const skills = {
.chooseTarget(
get.prompt2(event.skill),
(card, player, target) => {
return (
target != player &&
player
.getEnemies(null, false)
.includes(target)
);
return target != player;
}
)
.set("ai", target => {
@@ -1046,16 +1066,12 @@ const skills = {
!event.targets?.length ||
event.targets.includes(player) ||
!source.inRange(player) ||
player.countCards("h") == 0 ||
!player.getEnemies(null, false).includes(source)
player.countCards("h") == 0
) {
return false;
}
const enemies = player.getEnemies(null, false);
return event.targets.some(target => {
return target.isIn() && !enemies.includes(target);
});
return true;
},
async cost(event, trigger, player) {
event.result = await player
@@ -1144,7 +1160,7 @@ const skills = {
filter(event, player) {
if (
getTianshuDifficulty() == "normal" ||
_status.currentPhase == player
(getTianshuDifficulty() != "nightmare" && _status.currentPhase == player)
) {
return false;
}
+3 -3
View File
@@ -13,7 +13,7 @@ const translates = {
guicai_shuying: "鬼才",
guicai_shuying_info: "当一名角色的判定牌生效前,你可以打出一张牌代替之。",
langgu_shuying: "狼顾",
langgu_shuying_info: " 锁定技,每回合限一次,当你获得其他角色的牌时,进行一次判定:若结果为黑桃,随机弃置其1张手牌,且视为此技能本回合未发动过。",
langgu_shuying_info: "锁定技,每回合限一次,当你获得其他角色的牌时,进行一次判定:若结果为黑桃,随机弃置其1张手牌,且视为此技能本回合未发动过。",
yuanlv_shuying: "远虑",
yuanlv_shuying_info: "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成1点伤害。",
@@ -39,7 +39,7 @@ const translates = {
yongsi_shuying: "庸肆",
yongsi_shuying_info: "锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);弃牌阶段,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成伤害数超过1点,本回合手牌上限改为已损失体力值。",
wangzun_shuying: "妄尊",
wangzun_shuying_info: "锁定技,其他角色其他敌方角色的结束阶段,若其本回合:1.没有对你造成伤害,则其弃置1张牌;2.对你造成伤害数超过1点,则你对其造成1点伤害。",
wangzun_shuying_info: "锁定技,其他敌方角色的结束阶段,若其本回合:1.没有对你造成伤害,则其弃置1张牌;2.对你造成伤害数超过1点,则你对其造成1点伤害。",
duoxi_shuying: "夺玺",
duoxi_shuying_info: "其他角色的摸牌阶段,你可以失去1点体力改为你与其各摸一张牌。",
@@ -51,7 +51,7 @@ const translates = {
zhuzheng_shuying: "谏征",
zhuzheng_shuying_info: "其他角色使用【杀】指定除你外的角色时,若你在其攻击范围内,你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。",
yinlei_shuying: "引雷",
yinlei_shuying_info: "锁定技,当你失去牌时,随机横置一名角色。",
yinlei_shuying_info: "锁定技,当你于回合外失去牌时,随机横置一名角色。",
};
export default translates;
+2 -2
View File
@@ -615,7 +615,7 @@ const skills = {
}
if (game.roundNumber < 3 && target.countGainableCards(player, "he") > 0) {
const cards = target.getCards("he").randomGets(Math.min(num, target.countCards("he")));
const cards = target.getGainableCards(player, "he").randomGets(num);
await player.gain(cards, target, "giveAuto");
}
@@ -712,7 +712,7 @@ const skills = {
const gained = [];
for (const target of targets) {
const cards = target.getCards("h").randomGets(Math.min(num, target.countCards("h")));
const cards = target.getGainableCards(player, "h").randomGets(num);
if (cards.length) {
player.line(target);
await player.gain(cards, target, "giveAuto");