mirror of
https://github.com/Shu-Ying/noname-shuying.git
synced 2026-10-24 16:50:01 +08:00
🎉 2.0.1.0版本发布
✨ 重构活动BOSS武将包并新增独立PVP武将包 ✨ 完善天书动态难度、过关奖励与羁绊系统 🎨 新增自定义技能选择、羁绊谱册及移动端适配 🔊 整理BOSS配音、图片与模块资源路径 🐛 修复天书关卡、伤害保护及武将包加载问题
This commit is contained in:
@@ -9,6 +9,7 @@ const characters = {
|
||||
img: "extension/术樱包/pve/images/青青子衿/caocao_boss_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/caocao_boss_shuying.mp3"]
|
||||
},
|
||||
|
||||
simayi_boss_shuying: {
|
||||
sex: "male",
|
||||
group: "wei",
|
||||
@@ -19,6 +20,7 @@ const characters = {
|
||||
img: "extension/术樱包/pve/images/青青子衿/simayi_boss_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/simayi_boss_shuying.mp3"]
|
||||
},
|
||||
|
||||
lvbu_boss_shuying: {
|
||||
sex: "male",
|
||||
group: "qun",
|
||||
@@ -29,6 +31,7 @@ const characters = {
|
||||
img: "extension/术樱包/pve/images/青青子衿/lvbu_boss_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/lvbu_boss_shuying.mp3"]
|
||||
},
|
||||
|
||||
dongzhuo_boss_shuying: {
|
||||
sex: "male",
|
||||
group: "qun",
|
||||
@@ -39,6 +42,28 @@ const characters = {
|
||||
img: "extension/术樱包/pve/images/青青子衿/dongzhuo_boss_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/dongzhuo_boss_shuying.mp3"]
|
||||
},
|
||||
|
||||
yuanshu_boss_shuying: {
|
||||
sex: "male",
|
||||
group: "qun",
|
||||
hp: 4,
|
||||
skills: ["yongsi_shuying", "wangzun_shuying"],
|
||||
isHiddenBoss: true,
|
||||
isBossAllowed: true,
|
||||
img: "extension/术樱包/pve/images/青青子衿/yuanshu_boss_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/yuanshu_boss_shuying.mp3"]
|
||||
},
|
||||
|
||||
zhangjiao_boss_shuying: {
|
||||
sex: "male",
|
||||
group: "qun",
|
||||
hp: 4,
|
||||
skills: ["guidao_shuying", "leiji_shuying", "zhuzheng_shuying"],
|
||||
isHiddenBoss: true,
|
||||
isBossAllowed: true,
|
||||
img: "extension/术樱包/pve/images/青青子衿/zhangjiao_boss_shuying.jpg",
|
||||
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/zhangjiao_boss_shuying.mp3"]
|
||||
},
|
||||
};
|
||||
|
||||
export default characters;
|
||||
|
||||
@@ -66,6 +66,28 @@ const dynamicTranslates = {
|
||||
return `锁定技,回合开始时,你摸X张牌并对至多X名角色造成1点伤害,然后你失去1点体力。X为你已损失体力且最大为${num}。`
|
||||
},
|
||||
|
||||
//袁术
|
||||
wangzun_shuying(player, skill) {
|
||||
const num =
|
||||
getTianshuDifficulty() == "nightmare" ? 2 : 1;
|
||||
|
||||
return `锁定技,其他敌方角色的结束阶段,若其本回合:1.没有对你造成伤害,则其弃置${num}张牌;2.对你造成的伤害数超过1点,则你对其造成1点伤害。`;
|
||||
},
|
||||
duoxi_shuying(player, skill) {
|
||||
const num =
|
||||
getTianshuDifficulty() == "nightmare" ? 2 : 1;
|
||||
|
||||
return `其他角色的摸牌阶段,你可以失去1点体力,改为你与其各摸${num}张牌。`;
|
||||
},
|
||||
|
||||
//张角
|
||||
zhuzheng_shuying(player, skill) {
|
||||
if (getTianshuDifficulty() == "nightmare") {
|
||||
return "当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后你成为目标。";
|
||||
}
|
||||
|
||||
return "其他角色使用【杀】指定除你外的角色时,若你在其攻击范围内,你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。";
|
||||
},
|
||||
};
|
||||
|
||||
export default dynamicTranslates;
|
||||
|
||||
@@ -670,6 +670,516 @@ const skills = {
|
||||
},
|
||||
},
|
||||
|
||||
//袁术
|
||||
yongsi_shuying: {
|
||||
mode: ["boss"],
|
||||
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
|
||||
forced: true,
|
||||
locked: true,
|
||||
group: [
|
||||
"yongsi_shuying_draw",
|
||||
"yongsi_shuying_discard",
|
||||
],
|
||||
mod: {
|
||||
maxHandcard(player, num) {
|
||||
if (_status.currentPhase != player) return;
|
||||
|
||||
const damageNum = player
|
||||
.getHistory("sourceDamage")
|
||||
.reduce((sum, evt) => sum + (evt.num || 0), 0);
|
||||
|
||||
if (damageNum > 1) {
|
||||
return player.getDamagedHp();
|
||||
}
|
||||
},
|
||||
},
|
||||
subSkill: {
|
||||
draw: {
|
||||
trigger: { player: "phaseDrawBegin2" },
|
||||
forced: true,
|
||||
locked: true,
|
||||
filter(event, player) {
|
||||
return !event.numFixed;
|
||||
},
|
||||
async content(event, trigger, player) {
|
||||
trigger.num = game.countGroup();
|
||||
},
|
||||
},
|
||||
discard: {
|
||||
trigger: { player: "phaseDiscardBegin" },
|
||||
forced: true,
|
||||
locked: true,
|
||||
filter(event, player) {
|
||||
const damageNum = player
|
||||
.getHistory("sourceDamage")
|
||||
.reduce((sum, evt) => sum + (evt.num || 0), 0);
|
||||
|
||||
return (
|
||||
damageNum == 0 &&
|
||||
player.countCards("h") < player.hp
|
||||
);
|
||||
},
|
||||
async content(event, trigger, player) {
|
||||
await player.drawTo(player.hp);
|
||||
},
|
||||
},
|
||||
},
|
||||
ai: {
|
||||
threaten: 1.8,
|
||||
},
|
||||
},
|
||||
wangzun_shuying: {
|
||||
mode: ["boss"],
|
||||
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
|
||||
trigger: { global: "phaseJieshuBegin" },
|
||||
forced: true,
|
||||
locked: true,
|
||||
logTarget: "player",
|
||||
filter(event, player) {
|
||||
const target = event.player;
|
||||
if (
|
||||
!target?.isIn() ||
|
||||
!player.getEnemies(null, false).includes(target)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const damageNum = player
|
||||
.getHistory("damage")
|
||||
.reduce((sum, evt) => {
|
||||
if (evt.source == target) {
|
||||
return sum + (evt.num || 0);
|
||||
}
|
||||
return sum;
|
||||
}, 0);
|
||||
|
||||
if (damageNum > 1) return true;
|
||||
|
||||
return (
|
||||
damageNum == 0 &&
|
||||
target.countDiscardableCards(target, "he") > 0
|
||||
);
|
||||
},
|
||||
async content(event, trigger, player) {
|
||||
const target = trigger.player;
|
||||
const damageNum = player
|
||||
.getHistory("damage")
|
||||
.reduce((sum, evt) => {
|
||||
if (evt.source == target) {
|
||||
return sum + (evt.num || 0);
|
||||
}
|
||||
return sum;
|
||||
}, 0);
|
||||
|
||||
player.line(target);
|
||||
|
||||
if (damageNum == 0) {
|
||||
const discardNum =
|
||||
getTianshuDifficulty() == "nightmare" ? 2 : 1;
|
||||
const num = Math.min(
|
||||
discardNum,
|
||||
target.countDiscardableCards(target, "he")
|
||||
);
|
||||
|
||||
if (num > 0) {
|
||||
await target.chooseToDiscard(num, "he", true);
|
||||
}
|
||||
} else if (damageNum > 1 && target.isIn()) {
|
||||
await target.damage(1, player);
|
||||
}
|
||||
},
|
||||
ai: {
|
||||
threaten: 1.6,
|
||||
},
|
||||
},
|
||||
duoxi_shuying: {
|
||||
mode: ["boss"],
|
||||
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
|
||||
trigger: { global: "phaseDrawBegin1" },
|
||||
filter(event, player) {
|
||||
return (
|
||||
getTianshuDifficulty() != "normal" &&
|
||||
!event.numFixed &&
|
||||
event.player?.isIn() &&
|
||||
event.player != player
|
||||
);
|
||||
},
|
||||
async cost(event, trigger, player) {
|
||||
const num =
|
||||
getTianshuDifficulty() == "nightmare" ? 2 : 1;
|
||||
|
||||
event.result = await player
|
||||
.chooseBool(
|
||||
get.prompt(event.skill, trigger.player),
|
||||
`失去1点体力,将${get.translation(trigger.player)}的摸牌阶段改为你与其各摸${get.cnNumber(num)}张牌`
|
||||
)
|
||||
.set("ai", () => {
|
||||
const player = get.player();
|
||||
const trigger = get.event().getTrigger();
|
||||
const target = trigger.player;
|
||||
const num =
|
||||
getTianshuDifficulty() == "nightmare"
|
||||
? 2
|
||||
: 1;
|
||||
|
||||
if (player.hp <= 1) return false;
|
||||
|
||||
const isEnemy = player
|
||||
.getEnemies(null, false)
|
||||
.includes(target);
|
||||
|
||||
// 避免额外增加敌方摸牌,或削减友方原本的摸牌数
|
||||
if (isEnemy && trigger.num < num) return false;
|
||||
if (!isEnemy && trigger.num > num) return false;
|
||||
|
||||
return player.hp > 2;
|
||||
})
|
||||
.forResult();
|
||||
},
|
||||
async content(event, trigger, player) {
|
||||
const target = trigger.player;
|
||||
const num =
|
||||
getTianshuDifficulty() == "nightmare" ? 2 : 1;
|
||||
|
||||
player.line(target);
|
||||
trigger.changeToZero();
|
||||
|
||||
await player.loseHp();
|
||||
|
||||
const targets = [player, target].filter(
|
||||
current => current.isIn()
|
||||
);
|
||||
if (targets.length) {
|
||||
await game.asyncDraw(targets, num);
|
||||
}
|
||||
},
|
||||
ai: {
|
||||
threaten: 1.3,
|
||||
},
|
||||
},
|
||||
|
||||
//张角
|
||||
guidao_shuying: {
|
||||
mode: ["boss"],
|
||||
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
|
||||
trigger: { global: "judge" },
|
||||
filter(event, player) {
|
||||
return player.countCards("hes", {
|
||||
color: "black",
|
||||
}) > 0;
|
||||
},
|
||||
async cost(event, trigger, player) {
|
||||
event.result = await player
|
||||
.chooseCard({
|
||||
prompt:
|
||||
`${get.translation(trigger.player)}的` +
|
||||
`${trigger.judgestr || ""}判定为` +
|
||||
`${get.translation(trigger.player.judging[0])},` +
|
||||
`${get.prompt(event.skill)}`,
|
||||
position: "hes",
|
||||
filterCard(card, player) {
|
||||
if (get.color(card, player) != "black") {
|
||||
return false;
|
||||
}
|
||||
|
||||
const enabled = game.checkMod(
|
||||
card,
|
||||
player,
|
||||
"unchanged",
|
||||
"cardEnabled2",
|
||||
player
|
||||
);
|
||||
if (enabled != "unchanged") {
|
||||
return !!enabled;
|
||||
}
|
||||
|
||||
const respondable = game.checkMod(
|
||||
card,
|
||||
player,
|
||||
"unchanged",
|
||||
"cardRespondable",
|
||||
player
|
||||
);
|
||||
if (respondable != "unchanged") {
|
||||
return !!respondable;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
ai(card) {
|
||||
const trigger = get.event().getTrigger();
|
||||
const player = get.player();
|
||||
const judging = get.event().judging;
|
||||
const result =
|
||||
trigger.judge(card) -
|
||||
trigger.judge(judging);
|
||||
const attitude = get.attitude(
|
||||
player,
|
||||
trigger.player
|
||||
);
|
||||
|
||||
if (attitude == 0 || result == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
let value = get.value(card);
|
||||
if (get.subtype(card) == "equip2") {
|
||||
value /= 2;
|
||||
} else {
|
||||
value /= 6;
|
||||
}
|
||||
|
||||
return attitude > 0
|
||||
? result - value
|
||||
: -result - value;
|
||||
},
|
||||
})
|
||||
.set("judging", trigger.player.judging[0])
|
||||
.forResult();
|
||||
},
|
||||
popup: false,
|
||||
async content(event, trigger, player) {
|
||||
const next = player.respond({
|
||||
cards: event.cards,
|
||||
skill: event.name,
|
||||
highlight: true,
|
||||
noOrdering: true,
|
||||
});
|
||||
await next;
|
||||
|
||||
const cards = next.cards;
|
||||
if (!cards?.length) return;
|
||||
|
||||
const judgingCard = trigger.player.judging[0];
|
||||
player.$gain2(judgingCard);
|
||||
await player.gain(judgingCard);
|
||||
|
||||
trigger.player.judging[0] = cards[0];
|
||||
trigger.orderingCards.addArray(cards);
|
||||
|
||||
game.log(trigger.player, "的判定牌改为", cards);
|
||||
await game.delay(2);
|
||||
},
|
||||
ai: {
|
||||
rejudge: true,
|
||||
tag: {
|
||||
rejudge: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
leiji_shuying: {
|
||||
mode: ["boss"],
|
||||
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())
|
||||
);
|
||||
},
|
||||
line: "thunder",
|
||||
async cost(event, trigger, player) {
|
||||
event.result = await player
|
||||
.chooseTarget(
|
||||
get.prompt2(event.skill),
|
||||
(card, player, target) => {
|
||||
return (
|
||||
target != player &&
|
||||
player
|
||||
.getEnemies(null, false)
|
||||
.includes(target)
|
||||
);
|
||||
}
|
||||
)
|
||||
.set("ai", target => {
|
||||
const player = get.player();
|
||||
if (target.hasSkill("hongyan")) return 0;
|
||||
|
||||
return get.damageEffect(
|
||||
target,
|
||||
player,
|
||||
player,
|
||||
"thunder"
|
||||
);
|
||||
})
|
||||
.forResult();
|
||||
},
|
||||
async content(event, trigger, player) {
|
||||
const target = event.targets[0];
|
||||
const judge = target.judge(card => {
|
||||
const suit = get.suit(card);
|
||||
if (suit == "spade") return -4;
|
||||
if (suit == "club") return -2;
|
||||
return 0;
|
||||
});
|
||||
judge.judge2 = result => result.bool == false;
|
||||
|
||||
const result = await judge.forResult();
|
||||
|
||||
if (result.suit == "spade") {
|
||||
await target.damage(2, "thunder", player);
|
||||
} else if (result.suit == "club") {
|
||||
if (player.isDamaged()) {
|
||||
await player.recover();
|
||||
}
|
||||
if (target.isIn()) {
|
||||
await target.damage(1, "thunder", player);
|
||||
}
|
||||
}
|
||||
},
|
||||
ai: {
|
||||
useShan: true,
|
||||
threaten: 1.8,
|
||||
},
|
||||
},
|
||||
zhuzheng_shuying: {
|
||||
mode: ["boss"],
|
||||
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
|
||||
trigger: { global: "useCard2" },
|
||||
filter(event, player) {
|
||||
const source = event.player;
|
||||
if (
|
||||
source == player ||
|
||||
event.card.name != "sha" ||
|
||||
!event.targets?.length ||
|
||||
event.targets.includes(player) ||
|
||||
!source.inRange(player) ||
|
||||
player.countCards("h") == 0 ||
|
||||
!player.getEnemies(null, false).includes(source)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const enemies = player.getEnemies(null, false);
|
||||
return event.targets.some(target => {
|
||||
return target.isIn() && !enemies.includes(target);
|
||||
});
|
||||
},
|
||||
async cost(event, trigger, player) {
|
||||
event.result = await player
|
||||
.chooseCard(
|
||||
"h",
|
||||
get.prompt(event.skill, trigger.player),
|
||||
"将一张手牌置于牌堆顶,取消此【杀】的所有目标"
|
||||
)
|
||||
.set("ai", card => {
|
||||
const player = get.player();
|
||||
const trigger = get.event().getTrigger();
|
||||
const enemies = player.getEnemies(null, false);
|
||||
|
||||
const protectValue = trigger.targets
|
||||
.filter(target => !enemies.includes(target))
|
||||
.reduce((sum, target) => {
|
||||
return (
|
||||
sum -
|
||||
get.effect(
|
||||
target,
|
||||
trigger.card,
|
||||
trigger.player,
|
||||
player
|
||||
)
|
||||
);
|
||||
}, 0);
|
||||
|
||||
const becomeTarget =
|
||||
getTianshuDifficulty() == "nightmare" ||
|
||||
get.color(trigger.card) != "black";
|
||||
|
||||
const selfValue = becomeTarget
|
||||
? get.effect(
|
||||
player,
|
||||
trigger.card,
|
||||
trigger.player,
|
||||
player
|
||||
)
|
||||
: 0;
|
||||
|
||||
if (protectValue + selfValue <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 7 - get.value(card);
|
||||
})
|
||||
.forResult();
|
||||
},
|
||||
async content(event, trigger, player) {
|
||||
await player.lose(event.cards, ui.cardPile, "insert");
|
||||
|
||||
trigger.targets.length = 0;
|
||||
|
||||
const becomeTarget =
|
||||
getTianshuDifficulty() == "nightmare" ||
|
||||
get.color(trigger.card) != "black";
|
||||
|
||||
if (becomeTarget && player.isIn()) {
|
||||
trigger.all_excluded = false;
|
||||
trigger.targets.add(player);
|
||||
game.log(player, "成为了", trigger.card, "的目标");
|
||||
} else {
|
||||
trigger.all_excluded = true;
|
||||
game.log(trigger.card, "失去了所有目标");
|
||||
}
|
||||
},
|
||||
ai: {
|
||||
threaten: 1.5,
|
||||
},
|
||||
},
|
||||
yinlei_shuying: {
|
||||
mode: ["boss"],
|
||||
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
|
||||
trigger: {
|
||||
player: "loseAfter",
|
||||
global: [
|
||||
"equipAfter",
|
||||
"addJudgeAfter",
|
||||
"gainAfter",
|
||||
"loseAsyncAfter",
|
||||
"addToExpansionAfter",
|
||||
],
|
||||
},
|
||||
forced: true,
|
||||
locked: true,
|
||||
filter(event, player) {
|
||||
if (
|
||||
getTianshuDifficulty() == "normal" ||
|
||||
_status.currentPhase == player
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const loseEvent = event.getl?.(player);
|
||||
return (
|
||||
loseEvent?.cards2?.length > 0 &&
|
||||
game.hasPlayer(target => {
|
||||
return target.isIn() && !target.isLinked();
|
||||
})
|
||||
);
|
||||
},
|
||||
logTarget(event, player) {
|
||||
return game
|
||||
.filterPlayer(target => {
|
||||
return target.isIn() && !target.isLinked();
|
||||
})
|
||||
.randomGet();
|
||||
},
|
||||
async content(event, trigger, player) {
|
||||
const targets = game.filterPlayer(target => {
|
||||
return target.isIn() && !target.isLinked();
|
||||
});
|
||||
if (!targets.length) return;
|
||||
|
||||
const target = targets.randomGet();
|
||||
if (target != player) {
|
||||
player.line(target);
|
||||
}
|
||||
await target.link(true);
|
||||
},
|
||||
ai: {
|
||||
threaten: 1.3,
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -35,7 +35,23 @@ const translates = {
|
||||
qubu_shuying: "驭布",
|
||||
qubu_shuying_info: "锁定技,当友方角色使用【杀】指定目标时,进行一次判定:若结果为黑桃,你对此【杀】的所有目标造成1点伤害。",
|
||||
|
||||
yuanshu_boss_shuying: "袁术",
|
||||
yongsi_shuying: "庸肆",
|
||||
yongsi_shuying_info: "锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);弃牌阶段,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成伤害数超过1点,本回合手牌上限改为已损失体力值。",
|
||||
wangzun_shuying: "妄尊",
|
||||
wangzun_shuying_info: "锁定技,其他角色其他敌方角色的结束阶段,若其本回合:1.没有对你造成伤害,则其弃置1张牌;2.对你造成伤害数超过1点,则你对其造成1点伤害。",
|
||||
duoxi_shuying: "夺玺",
|
||||
duoxi_shuying_info: "其他角色的摸牌阶段,你可以失去1点体力改为你与其各摸一张牌。",
|
||||
|
||||
zhangjiao_boss_shuying: "张角",
|
||||
guidao_shuying: "鬼道",
|
||||
guidao_shuying_info: "当一名角色的判定牌生效前,你可以打出一张黑色牌替换之。",
|
||||
leiji_shuying: "雷击",
|
||||
leiji_shuying_info: "每当你使用或打出【闪】时,你可以令一名其他角色进行判定,若结果为:黑桃,你对该角色造成2点雷电伤害;梅花,你回复1点体力,然后对该角色造成1点雷电伤害。",
|
||||
zhuzheng_shuying: "谏征",
|
||||
zhuzheng_shuying_info: "其他角色使用【杀】指定除你外的角色时,若你在其攻击范围内,你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。",
|
||||
yinlei_shuying: "引雷",
|
||||
yinlei_shuying_info: "锁定技,当你失去牌时,随机横置一名角色。",
|
||||
};
|
||||
|
||||
export default translates;
|
||||
|
||||
Reference in New Issue
Block a user