✨ feat: 整合活动BOSS主题并完善捉鬼驱邪内容

✨ feat: 统一活动BOSS主题入口与武将包合并流程
✨ feat: 补充十二生肖及捉鬼驱邪武将、技能和配音资源
✨ feat: 支持更新时安全清理废弃文件与目录
This commit is contained in:
2026-08-12 03:32:07 +08:00
parent 690e55736d
commit 49cb75d813
87 changed files with 2312 additions and 356 deletions
+5
View File
@@ -0,0 +1,5 @@
import { lib, game, ui, get, ai, _status } from "../../../../../../noname.js";
const cards = {};
export default cards;
+71 -6
View File
@@ -9,9 +9,40 @@ const characters = {
img: "extension/术樱包/pve/images/十二生肖/zishu_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/zishu.mp3"]
},
// chouniu_boss_shuying: {},
// yinhu_boss_shuying: {},
// maotu_boss_shuying: {},
chouniu_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["chouniu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/chouniu_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/chouniu.mp3"]
},
yinhu_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["yinhu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/yinhu_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/yinhu.mp3"]
},
maotu_boss_shuying: {
sex: "female",
group: "qun",
hp: 4,
skills: ["maotu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/maotu_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/maotu.mp3"]
},
chenlong_boss_shuying: {
sex: "male",
group: "qun",
@@ -22,7 +53,18 @@ const characters = {
img: "extension/术樱包/pve/images/十二生肖/chenlong_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/chenlong.mp3"]
},
// sishe_boss_shuying: {},
sishe_boss_shuying: {
sex: "female",
group: "qun",
hp: 4,
skills: ["sishe_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/sishe_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/sishe.mp3"]
},
wuma_boss_shuying: {
sex: "male",
group: "qun",
@@ -33,6 +75,7 @@ const characters = {
img: "extension/术樱包/pve/images/十二生肖/wuma_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/wuma_shuying.mp3"]
},
weiyang_boss_shuying: {
sex: "female",
group: "qun",
@@ -43,6 +86,7 @@ const characters = {
img: "extension/术樱包/pve/images/十二生肖/weiyang_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/weiyang.mp3"]
},
shenhou_boss_shuying: {
sex: "male",
group: "qun",
@@ -53,7 +97,18 @@ const characters = {
img: "extension/术樱包/pve/images/十二生肖/shenhou_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/shenhou.mp3"]
},
// youji_boss_shuying: {},
youji_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["youji_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/youji_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/youji.mp3"]
},
xvgou_boss_shuying: {
sex: "male",
group: "qun",
@@ -64,7 +119,17 @@ const characters = {
img: "extension/术樱包/pve/images/十二生肖/xvgou_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/xvgou.mp3"]
},
// haizhu_boss_shuying: {},
haizhu_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["haizhu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/haizhu_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/haizhu.mp3"]
},
};
export default characters;
@@ -0,0 +1,3 @@
const characterFilters = {};
export default characterFilters;
@@ -0,0 +1,3 @@
const characterTitles = {};
export default characterTitles;
@@ -0,0 +1,3 @@
const dynamicTranslates = {};
export default dynamicTranslates;
+29
View File
@@ -0,0 +1,29 @@
import characters from "./character.js";
import cards from "./card.js";
import pinyins from "./pinyin.js";
import skills from "./skill.js";
import translates from "./translate.js";
import characterTitles from "./characterTitle.js";
import characterIntros from "./intro.js";
import characterFilters from "./characterFilter.js";
import dynamicTranslates from "./dynamicTranslate.js";
import perfectPairs from "./perfectPairs.js";
import voices from "./voices.js";
import { characterSort, characterSortTranslate } from "./sort.js";
// 十二生肖主题数据片段,由活动 BOSS 根入口统一注册。
export default {
character: characters,
card: cards,
pinyins,
skill: skills,
translate: translates,
characterTitle: characterTitles,
characterIntro: characterIntros,
characterFilter: characterFilters,
dynamicTranslate: dynamicTranslates,
perfectPair: perfectPairs,
voices,
characterSort,
characterSortTranslate,
};
+3
View File
@@ -0,0 +1,3 @@
const characterIntros = {};
export default characterIntros;
@@ -0,0 +1,3 @@
const perfectPairs = {};
export default perfectPairs;
+3
View File
@@ -0,0 +1,3 @@
const pinyins = {};
export default pinyins;
+272
View File
@@ -71,6 +71,137 @@ const skills = {
},
},
//丑牛
chouniu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
trigger: {
player: "phaseJieshuBegin",
},
forced: true,
locked: true,
filter(event, player) {
return player.isDamaged() && player.isMinHp();
},
async content(event, trigger, player) {
await player.recover();
},
ai: {
threaten: 1.2,
},
},
//寅虎
yinhu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
enable: "phaseUse",
position: "he",
filter(event, player) {
const enemies = player.getEnemies(null, false);
return (
enemies.some(target => target.isIn()) &&
player.hasCard(card => lib.skill.yinhu_shuying.filterCard(card, player), "he")
);
},
filterCard(card, player) {
if (!lib.filter.cardDiscardable(card, player)) return false;
return !player.getStorage("yinhu_shuying_used").some(cardx => {
return get.type2(cardx[2]) == get.type2(card);
});
},
filterTarget(card, player, target) {
return (
target != player &&
target.isIn() &&
player.getEnemies(null, false).includes(target)
);
},
check(card) {
return 8 - get.value(card);
},
async content(event, trigger, player) {
const card = event.cards[0];
const target = event.target;
player.addTempSkill("yinhu_shuying_used", "phaseUseAfter");
player.markAuto("yinhu_shuying_used", [
[get.translation(get.type2(card)), "", card.name],
]);
player.line(target);
const damageEvent = target.damage(1, player);
await damageEvent;
const causedDying = game.getGlobalHistory("everything", evt => {
return evt.name == "dying" && evt.getParent(damageEvent.name) === damageEvent;
}).length > 0;
if (causedDying) {
player.tempBanSkill("yinhu_shuying");
}
},
ai: {
order: 7,
result: {
target(player, target) {
if (!player.getEnemies(null, false).includes(target)) return 0;
return get.damageEffect(target, player, target);
},
},
},
subSkill: {
used: {
charlotte: true,
onremove: true,
intro: {
name: "已弃置的牌类型",
mark(dialog, content = []) {
if (content.length) {
dialog.addSmall([content, "vcard"]);
}
},
},
},
},
},
//卯兔
maotu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
trigger: {
global: "dieAfter",
},
forced: true,
locked: true,
filter(event, player) {
return !player.hasSkill("maotu_shuying_effect", null, false, false);
},
async content(event, trigger, player) {
player.addTempSkill("maotu_shuying_effect", {
player: "phaseBegin",
});
},
subSkill: {
effect: {
charlotte: true,
mark: true,
marktext: "兔",
intro: {
content: "你不是体力值大于等于你的其他角色使用牌的合法目标",
},
mod: {
targetEnabled(card, source, target) {
if (source != target && source.getHp() >= target.getHp()) {
return false;
}
},
},
},
},
},
//辰龙
chenlong_shuying: {
mode: ["boss"],
@@ -133,6 +264,55 @@ const skills = {
},
},
//巳蛇
sishe_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
trigger: {
player: "damageEnd",
},
logTarget: "source",
filter(event, player) {
return (
event.num > 0 &&
event.source?.isIn() &&
player.getEnemies(null, false).includes(event.source)
);
},
async cost(event, trigger, player) {
event.result = await player
.chooseBool(get.prompt2(event.skill, trigger.source))
.set("ai", () => {
const player = get.player();
const trigger = get.event().getTrigger();
return (
player.getEnemies(null, false).includes(trigger.source) &&
get.damageEffect(trigger.source, player, player) > 0
);
})
.forResult();
},
async content(event, trigger, player) {
const source = trigger.source;
player.line(source);
await source.damage(trigger.num, player);
},
ai: {
threaten: 0.6,
maixie: true,
effect: {
target(card, source, target) {
if (
get.tag(card, "damage") &&
target.getEnemies(null, false).includes(source)
) {
return [1, 0, 0, -0.7];
}
},
},
},
},
//午马
wuma_shuying: {
mode: ["boss"],
@@ -177,6 +357,7 @@ const skills = {
},
},
},
//未羊
weiyang_shuying: {
mode: ["boss"],
@@ -257,6 +438,26 @@ const skills = {
},
},
//酉鸡
youji_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
trigger: {
player: "phaseDrawBegin2",
},
forced: true,
locked: true,
filter(event, player) {
return game.roundNumber > 0 && !event.numFixed;
},
async content(event, trigger, player) {
trigger.num += Math.min(5, game.roundNumber);
},
ai: {
threaten: 1.4,
},
},
//戌狗
xvgou_shuying: {
mode: ["boss"],
@@ -292,6 +493,77 @@ const skills = {
},
},
//亥猪
haizhu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
trigger: {
player: "phaseZhunbeiBegin",
global: ["loseAfter", "loseAsyncAfter"],
},
forced: true,
locked: true,
filter(event, player) {
if (event.name == "phaseZhunbei") {
return player.isMaxHandcard();
}
if (event.type != "discard" || event.getlx === false) {
return false;
}
return game.hasPlayer(target => {
if (target == player) return false;
return event.getl?.(target)?.cards2?.some(card => {
return (
get.color(card) == "black" &&
get.position(card, true) == "d"
);
});
});
},
async content(event, trigger, player) {
if (trigger.name == "phaseZhunbei") {
await player.loseHp();
return;
}
const cards = game
.filterPlayer(target => {
if (target == player) return false;
return trigger.getl?.(target)?.cards2?.some(card => {
return (
get.color(card) == "black" &&
get.position(card, true) == "d"
);
});
})
.reduce((list, target) => {
return list.addArray(
trigger
.getl(target)
.cards2.filter(card => {
return (
get.color(card) == "black" &&
get.position(card, true) == "d"
);
})
);
}, []);
if (!cards.length) return;
if (trigger.delay === false) {
await game.delay();
}
await player.gain(cards, "gain2");
},
ai: {
threaten: 1.6,
},
},
};
export default skills;
+16
View File
@@ -0,0 +1,16 @@
const characterSort = {
shuYing_pve_shiershengxiao: [
"zishu_boss_shuying",
"chenlong_boss_shuying",
"wuma_boss_shuying",
"weiyang_boss_shuying",
"shenhou_boss_shuying",
"xvgou_boss_shuying",
],
};
const characterSortTranslate = {
shuYing_pve_shiershengxiao: "十二生肖",
};
export { characterSort, characterSortTranslate };
+23
View File
@@ -3,10 +3,26 @@ const translates = {
zishu_shuying: "子鼠",
zishu_shuying_info: "出牌阶段限一次,你可以获得手牌数大于你的其他角色一张手牌,你可以重复此流程,直到你的手牌数为全场最多。",
chouniu_boss_shuying: "丑牛",
chouniu_shuying: "丑牛",
chouniu_shuying_info: "锁定技,结束阶段,若你的体力值为全场最小,则你回复1点体力。",
yinhu_boss_shuying: "寅虎",
yinhu_shuying: "寅虎",
yinhu_shuying_info: "出牌阶段,你可以弃置一张牌(以此法弃置的牌须类型各不相同),然后对一名其他角色造成1点伤害;若你以此法导致一名角色进入濒死状态,则此技能失效直到回合结束。",
maotu_boss_shuying: "卯兔",
maotu_shuying: "卯兔",
maotu_shuying_info: "锁定技,场上有角色阵亡时,你获得【卯兔】标记,你的回合开始时,你移除【卯兔标记】(【卯兔】标记:你不是体力大于等于你的其他角色使用牌的合法目标)。",
chenlong_boss_shuying: "辰龙",
chenlong_shuying: "辰龙",
chenlong_shuying_info: "限定技,出牌阶段,你可以失去任意点体力(至多为5),然后对一名其他角色造成等量的伤害。若你以此法进入濒死状态,则你将体力值回复至1,然后减少1点体力上限。",
sishe_boss_shuying: "巳蛇",
sishe_shuying: "巳蛇",
sishe_shuying_info: "当你受到伤害后,你可以对伤害来源造成等量伤害。",
wuma_boss_shuying: "午马",
wuma_shuying: "午马",
wuma_shuying_info: "锁定技,你不能被翻面;你的阶段不能被跳过;当你成为其他角色使用锦囊牌的目标后,摸一张牌。",
@@ -19,10 +35,17 @@ const translates = {
shenhou_shuying: "申猴",
shenhou_shuying_info: "当你成为【杀】的目标时,你可以进行判定,若结果为红色,则此【杀】对你无效。",
youji_boss_shuying: "酉鸡",
youji_shuying: "酉鸡",
youji_shuying_info: "锁定技,摸牌阶段,你多摸X张牌(X为游戏轮数且最多为5)。",
xvgou_boss_shuying: "戌狗",
xvgou_shuying: "戌狗",
xvgou_shuying_info: "锁定技,红色【杀】对你无效;你使用红色【杀】无距离限制且造成伤害+1.",
haizhu_boss_shuying: "亥猪",
haizhu_shuying: "亥猪",
haizhu_shuying_info: "锁定技,当其他角色的黑色牌因弃置而置入弃牌堆后,你获得这些牌;准备阶段开始时,若你的手牌数为场上最多的或之一,你失去1点体力。",
};
export default translates;
+39
View File
@@ -0,0 +1,39 @@
const voices = {
"#zishu_shuying1": "这些牌都归我吧!",
"#zishu_boss_shuying:die": "油米全没了。",
"#chouniu_shuying1": "牛角之歌,自保足以。",
"#chouniu_boss_shuying:die": "请将我埋于此地吧。",
"#yinhu_shuying1": "尝尝我的厉害吧。",
"#yinhu_boss_shuying:die": "百兽之王也有终老。",
"#maotu_shuying1": "想抓到我,不可能!",
"#maotu_boss_shuying:die": "这灾祸,是躲不过了。",
"#chenlong_shuying1": "龙怒的威力,不是你所能承受的。",
"#chenlong_boss_shuying:die": "龙威不再,龙鳞已落。",
"#sishe_shuying1": "伤我者,一一奉还。",
"#sishe_boss_shuying:die": "我的毒液失效了。",
"#wuma_shuying1": "有我在,必成功。",
"#wuma_boss_shuying:die": "马有失蹄啊。",
"#weiyang_shuying1": "共享绵泽,同甘共苦。",
"#weiyang_boss_shuying:die": "看不到青草翠绿时。",
"#shenhou_shuying1": "百般变化,真假难辨。",
"#shenhou_boss_shuying:die": "这仙桃无用了。",
"#youji_shuying1": "鸡豚之息,虽微渐厚。",
"#youji_boss_shuying:die": "杀鸡取卵,不可取呀!",
"#xvgou_shuying1": "驱邪吠恶,遇凶斩杀。",
"#xvgou_boss_shuying:die": "不能守护家园了。",
"#haizhu_shuying1": "这些,都归我吧。",
"#haizhu_boss_shuying:die": "果然,还是吃太多了。",
};
export default voices;