🎨 PVE文件夹重构,根据BOSS文件进行分包

📝 新增术樱包武将
This commit is contained in:
2026-08-11 15:59:31 +08:00
parent 6735fc2d35
commit 690e55736d
47 changed files with 4439 additions and 2725 deletions
+12 -224
View File
@@ -1,227 +1,15 @@
const characters = {
zishu_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["zishu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/zishu_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/zishu.mp3"]
},
// chouniu_boss_shuying: {},
// yinhu_boss_shuying: {},
// maotu_boss_shuying: {},
chenlong_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["chenlong_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/chenlong_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/chenlong.mp3"]
},
// sishe_boss_shuying: {},
wuma_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["wuma_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/wuma_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/wuma_shuying.mp3"]
},
weiyang_boss_shuying: {
sex: "female",
group: "qun",
hp: 4,
skills: ["weiyang_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/weiyang_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/weiyang.mp3"]
},
shenhou_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["shenhou_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/shenhou_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/shenhou.mp3"]
},
// youji_boss_shuying: {},
xvgou_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["xvgou_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/xvgou_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/xvgou.mp3"]
},
// haizhu_boss_shuying: {},
import shiershengxiao from "./sets/shiershengxiao/character.js";
import zhuoguiquxie from "./sets/zhuoguiquxie/character.js";
import qingqingzijin from "./sets/qingqingzijin/character.js";
import tianshu from "./sets/tianshu/character.js";
import mergeBossModules from "./merge.js";
heibaiwuchang_boss_shuying:
{
sex: "male",
group: "qun",
hp: 4,
skills: ["mizui_shuying", "qiangzheng_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/heibaiwuchang_boss_shuying.png"
},
niutoumamian_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["shiyv_shuying", "manji_shuying", "xiaoshou_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/niutoumamian_boss_shuying.png"
},
yvsai_boss_shuying: {
sex: "female",
group: "qun",
hp: 4,
skills: ["anchao_shuying", "guixi_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/yvsai_boss_shuying.png"
},
huangfeng_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["mingchong_shuying", "duzhen_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/huangfeng_boss_shuying.png"
},
riyeyoushen_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["huiyun_shuying", "yezhong_shuying", "zhoucha_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/riyeyoushen_boss_shuying.png"
},
caocao_boss_shuying: {
sex: "male",
group: "wei",
hp: 4,
skills: ["jianxiong_shuying", "lingba_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/caocao_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/caocao_boss_shuying.mp3"]
},
simayi_boss_shuying: {
sex: "male",
group: "wei",
hp: 4,
skills: ["fankui_shuying", "guicai_shuying", "langgu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/simayi_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/simayi_boss_shuying.mp3"]
},
lvbu_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["mashu", "wushuang_shuying", "shenij_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/lvbu_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/lvbu_boss_shuying.mp3"]
},
dongzhuo_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["jiuchi_shuying", "roulin_shuying", "baonue_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/dongzhuo_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/dongzhuo_boss_shuying.mp3"]
},
shuishengonggong_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["tuanliu_shuying", "juehong_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/shuishengonggong_boss_shuying.png"
},
// huoshenzhurong_boss_shuying: {},
baiqi_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["changsheng_shuying", "shashen_shuying", "wuan_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/baiqi_boss_shuying.png"
},
kuafu_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["shenqu_shuying", "lieben_shuying", "yinjiang_shuying", "zhuri_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/kuafu_boss_shuying.png"
},
shaohao_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["baiyi_shuying", "shenen_shuying",],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/shaohao_boss_shuying.png"
},
xuannv_boss_shuying: {
sex: "female",
group: "shen",
hp: 4,
skills: ["xuanlie_shuying", "jiutian_shuying", "dishi_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/xuannv_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/天书乱斗/xuannv_boss_shuying.mp3"]
},
hanba_boss_shuying: {
sex: "female",
group: "shen",
hp: 4,
skills: ["xinji_shuying", "zhiri_shuying", "fenshi_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/hanba_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/天书乱斗/hanba_boss_shuying.mp3"]
},
};
// 汇总所有主题武将,PVE 玩法只需引用唯一的 BOSS ID。
const characters = mergeBossModules("武将", [
["十二生肖", shiershengxiao],
["捉鬼驱邪", zhuoguiquxie],
["青青子衿", qingqingzijin],
["天书乱斗", tianshu],
]);
export default characters;
+10 -202
View File
@@ -1,205 +1,13 @@
import { lib, game, ui, get, ai, _status } from "../../../../noname.js";
import tianshuConfig from "../../tianshu/config.js";
import zhuoguiquxie from "./sets/zhuoguiquxie/dynamicTranslate.js";
import qingqingzijin from "./sets/qingqingzijin/dynamicTranslate.js";
import tianshu from "./sets/tianshu/dynamicTranslate.js";
import mergeBossModules from "./merge.js";
const getTianshuDifficulty = () => {
return _status[tianshuConfig.settings.difficultyStatusKey] || "normal";
};
const dynamicTranslates = {
//黑白无常
mizui_shuying(player, skill) {
const num = getTianshuDifficulty() == "normal" ? 1 : 2
return `锁定技,你的伤害牌造成伤害后,你随机弃置受伤角色的${num}张牌。`
},
qiangzheng_shuying(player, skill) {
let num = 2;
if (getTianshuDifficulty() == "hard") num = 4;
if (getTianshuDifficulty() == "nightmare") num = 6;
return `锁定技,敌方角色的结束阶段,若其手牌数小于${num},你获得其所有手牌。`
},
xixing_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
return "锁定技,准备阶段,你对每名敌方角色各造成2点雷电伤害,然后你回复等量体力";
}
return "锁定技,准备阶段,随机对敌方体力最多的一名角色造成2点雷电伤害,然后你回复等量体力。";
},
//鱼鳃
guixi_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1
return `锁定技,当你受到伤害后,你进行一次判定,若结果为红色,你回复1点体力;若结果不为红色,你摸${num}张牌。`;
},
//黄蜂
mingchong_shuying(player, skill) {
if (getTianshuDifficulty() == "nightmare") {
return "锁定技,你死亡时,杀死你的角色弃置所有牌。"
}
return "锁定技,你死亡时,杀死你的角色随机弃置一半的牌。"
},
duzhen_shuyingg(player, skill) {
if (getTianshuDifficulty() == "nightmare") {
return "锁定技,你使用牌指定单一敌方角色为目标后,该角色随机弃置1张牌(优先装备区的牌)。"
}
return "锁定技,你使用牌指定单一敌方角色为目标后,该角色随机弃置2张牌(优先装备区的牌)。"
},
//日夜游神
mingchong_shuying(player, skill) {
const num = getTianshuDifficulty() == "normal" ? 1 : 2
return `出牌阶段限一次,你可以展示一名敌方角色的手牌,并弃置其中至多两张牌。然后你可以弃置一张与该角色弃置牌牌名相同的牌,对其造成${num}点伤害。`
},
yezhong_shuying(player, skill) {
let num = 1;
if (getTianshuDifficulty() == "hard") num = 2;
if (getTianshuDifficulty() == "nightmare") num = 3;
return `锁定技,结束阶段,你进行一次判定并获得判定牌,若次牌为黑色,每名敌方角色随机弃${num}张手牌。`
},
zhoucha_shuying(player, skill) {
let num = 1;
if (getTianshuDifficulty() == "hard") num = 2;
if (getTianshuDifficulty() == "nightmare") num = 3;
return `锁定技,准备阶段,你进行一次判定并获得判定牌,若此牌为红色,你本回合使用【杀】的次数+${num}。`
},
//曹操
lingba_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1
return `锁定技,你的回合开始时,若你手牌数为全场最多,则对一名随机敌人造成${num}点伤害。若你手牌数大于等于你体力值的两倍,则改为对所有敌人造成伤害。`
},
yishen_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
return "当你回复体力时,可以改为获得所有敌人各一张随机装备。";
}
return "当你回复体力时,可以改为获得一名随机敌方角色一张随机装备。";
},
//司马懿
yuanlv_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
return "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成过1点伤害。";
}
return "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成1点伤害。";
},
//吕布
wushuang_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1
return `锁定技。①你使用的【杀】需两张【闪】才能抵消;与你进行【决斗】的角色每次需要打出两张【杀】。②每回合限${num}次,当你使用【杀】或【决斗】造成伤害时,若受伤角色没有使用或打出过【杀】或【闪】响应此牌,则此伤害+1。`;
},
shenij_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
let card = 2;
let sha = 1;
let target = 1;
if (difficulty == "hard") {
card = 3;
sha = 2;
} else if (difficulty == "nightmare") {
card = 4;
sha = 2;
target = 2;
}
return `判定阶段,你可以弃置两张手牌,然后弃置你判定区里的牌;摸牌阶段,你多摸${card}张牌;出牌阶段,你可以多使用${sha}张【杀】,你的【杀】可以多指定${target}名角色为目标。`;
},
zhanjia_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 3 : 2
return `锁定技,每回合限一次,当你受到大于2点的伤害时,将此伤害减至2点,然后摸${num}张牌。`
},
//董卓
baonue_shuying(player, skill) {
let num = 3;
if (getTianshuDifficulty() == "hard") num = 4;
if (getTianshuDifficulty() == "nightmare") num = 5;
return `锁定技,回合开始时,你摸X张牌并对至多X名角色造成1点伤害,然后你失去1点体力。X为你已损失体力且最大为${num}。`
},
//水神共工
tuanliu_shuying(player, skill) {
let hp = 2;
let card = 4;
let damage = 1;
if (getTianshuDifficulty() == "nightmare") {
hp = 3;
card = 6;
}
return `锁定技,结束阶段,若本回合进入弃牌堆的卡牌数量:大于4,你回复${hp}点体力;大于5,你摸${card}张牌;大于9,你对所有敌方角色造成${damage}点伤害。`
},
//少昊
baiyi_shuying(player, skill) {
let num = 1;
const difficulty = getTianshuDifficulty();
if (difficulty == "hard") {
num = 2;
} else if (difficulty == "nightmare") {
num = 3;
}
return `锁定技,每名敌方角色的回合开始时,若当前轮数小于3,你随机获得其${num}张牌;若当前轮数小于5,对其造成${num}点雷电伤害;若当前轮数小于7,其随机弃置${num}张牌。`;
},
//玄女
xuanlie_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
const num = difficulty == "normal" ? 1 : 2;
return `锁定技,回合结束时,对所有本回合你获得过其牌的敌方角色依次造成${num}点伤害。`;
},
jiutian_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
const num = difficulty == "normal" ? 1 : 2;
const extra =
difficulty == "normal" || difficulty == "hard"
? ""
: "若这些牌包含4种花色,这些角色再额外失去1点体力。";
return `锁定技,准备阶段,你获得所有敌方角色各${num}张手牌。若你以此法获得的牌包含2种颜色,则对所有你以此法获得其牌的敌方角色造成1点伤害。${extra}`;
},
xinji_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
const num = difficulty == "nightmare" ? 2 : 1;
return `锁定技,当友方于回合外因弃置而失去手牌时,你对当前角色造成${num}点伤害。`
},
zhiri_shuying(player, skill) {
let num = 1;
const difficulty = getTianshuDifficulty();
if (difficulty == "hard") {
num = 2;
} else if (difficulty == "nightmare") {
num = 3;
}
return `锁定技,当敌方角色使用红色锦囊牌指定目标后,你摸${num}张牌。`
},
};
// 汇总存在动态描述的主题技能;无动态描述的主题不需要空模块占位。
const dynamicTranslates = mergeBossModules("动态翻译", [
["捉鬼驱邪", zhuoguiquxie],
["青青子衿", qingqingzijin],
["天书乱斗", tianshu],
]);
export default dynamicTranslates;
+16
View File
@@ -0,0 +1,16 @@
// 合并各主题的同类数据;重复 ID 保留先加载项,跳过后加载项,避免中断整个 BOSS 包。
const mergeBossModules = (dataType, modules) => {
const result = {};
for (const [moduleName, data] of modules) {
for (const [id, value] of Object.entries(data || {})) {
if (Object.prototype.hasOwnProperty.call(result, id)) {
console.warn(`术樱包活动BOSS:跳过${moduleName}中重复的${dataType}ID“${id}”`);
continue;
}
result[id] = value;
}
}
return result;
};
export default mergeBossModules;
+44
View File
@@ -0,0 +1,44 @@
const characters = {
caocao_boss_shuying: {
sex: "male",
group: "wei",
hp: 4,
skills: ["jianxiong_shuying", "lingba_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/caocao_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/caocao_boss_shuying.mp3"]
},
simayi_boss_shuying: {
sex: "male",
group: "wei",
hp: 4,
skills: ["fankui_shuying", "guicai_shuying", "langgu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/simayi_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/simayi_boss_shuying.mp3"]
},
lvbu_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["mashu", "wushuang_shuying", "shenij_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/lvbu_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/lvbu_boss_shuying.mp3"]
},
dongzhuo_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["jiuchi_shuying", "roulin_shuying", "baonue_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/青青子衿/dongzhuo_boss_shuying.jpg",
dieAudios: ["ext:术樱包/pve/audio/dead/青青子衿/dongzhuo_boss_shuying.mp3"]
},
};
export default characters;
@@ -0,0 +1,71 @@
import { getTianshuDifficulty } from "../../shared.js";
const dynamicTranslates = {
//曹操
lingba_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1
return `锁定技,你的回合开始时,若你手牌数为全场最多,则对一名随机敌人造成${num}点伤害。若你手牌数大于等于你体力值的两倍,则改为对所有敌人造成伤害。`
},
yishen_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
return "当你回复体力时,可以改为获得所有敌人各一张随机装备。";
}
return "当你回复体力时,可以改为获得一名随机敌方角色一张随机装备。";
},
//司马懿
yuanlv_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
return "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成过1点伤害。";
}
return "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成1点伤害。";
},
//吕布
wushuang_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1
return `锁定技。①你使用的【杀】需两张【闪】才能抵消;与你进行【决斗】的角色每次需要打出两张【杀】。②每回合限${num}次,当你使用【杀】或【决斗】造成伤害时,若受伤角色没有使用或打出过【杀】或【闪】响应此牌,则此伤害+1。`;
},
shenij_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
let card = 2;
let sha = 1;
let target = 1;
if (difficulty == "hard") {
card = 3;
sha = 2;
} else if (difficulty == "nightmare") {
card = 4;
sha = 2;
target = 2;
}
return `判定阶段,你可以弃置两张手牌,然后弃置你判定区里的牌;摸牌阶段,你多摸${card}张牌;出牌阶段,你可以多使用${sha}张【杀】,你的【杀】可以多指定${target}名角色为目标。`;
},
zhanjia_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 3 : 2
return `锁定技,每回合限一次,当你受到大于2点的伤害时,将此伤害减至2点,然后摸${num}张牌。`
},
//董卓
baonue_shuying(player, skill) {
let num = 3;
if (getTianshuDifficulty() == "hard") num = 4;
if (getTianshuDifficulty() == "nightmare") num = 5;
return `锁定技,回合开始时,你摸X张牌并对至多X名角色造成1点伤害,然后你失去1点体力。X为你已损失体力且最大为${num}。`
},
};
export default dynamicTranslates;
+676
View File
@@ -0,0 +1,676 @@
import { lib, game, ui, get, ai, _status, getTianshuDifficulty } from "../../shared.js";
const skills = {
//曹操 over
jianxiong_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { player: "damageEnd" },
filter(event, player) {
return event.num > 0;
},
async cost(event, trigger, player) {
event.result = await player.chooseBool(get.prompt2(event.skill))
.set("ai", () => true)
.forResult();
},
async content(event, trigger, player) {
if (get.itemtype(trigger.cards) == "cards" && get.position(trigger.cards[0], true) == "o") {
await player.gain(trigger.cards, "gain2");
}
await player.draw();
},
ai: {
maixie: true,
maixie_hp: true,
effect: {
target(card, player, target) {
if (player.hasSkillTag("jueqing", false, target)) return [1, -1];
if (get.tag(card, "damage")) return [1, 0.6];
},
},
},
},
lingba_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { player: "phaseBegin" },
forced: true,
filter(event, player) {
return player.getEnemies(null, false).some(target => target.isIn()) && game.players.every(current => player.countCards("h") >= current.countCards("h"));
},
async content(event, trigger, player) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1
const enemies = player.getEnemies(null, false).filter(target => target.isIn());
if (player.countCards("h") >= player.hp * 2) {
for (const target of enemies) {
player.line(target);
await target.damage(num, player);
}
}
else {
const target = enemies.randomGet();
player.line(target);
await target.damage(num, player);
}
},
},
yishen_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { player: "recoverBegin" },
filter(event, player) {
return player.getEnemies(null, false).some(target => target.countGainableCards(player, "e") > 0);
},
async cost(event, trigger, player) {
event.result = await player.chooseBool(get.prompt2(event.skill))
.set("ai", () => {
const player = get.player();
const trigger = get.event().getTrigger();
if (player.hp <= 1) return false;
if (player.hp + trigger.num <= 2) return false;
const enemies = player.getEnemies(null, false).filter(target => {
return target.isIn() && target.countGainableCards(player, "e") > 0;
});
if (!enemies.length) return false;
const recoverEffect = get.recoverEffect(player, player, player);
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
let total = 0;
let max = 0;
for (const target of enemies) {
for (const card of target.getCards("e")) {
const value = get.value(card, target);
total += value;
if (value > max) max = value;
}
}
if (max < 5) return false;
return total >= recoverEffect + 4;
}
let best = 0;
for (const target of enemies) {
for (const card of target.getCards("e")) {
const value = get.value(card, target);
if (value > best) best = value;
}
}
if (best < 5) return false;
return best >= recoverEffect;
})
.forResult();
},
async content(event, trigger, player) {
const enemies = player.getEnemies(null, false).filter(target => target.countGainableCards(player, "e") > 0);
const difficulty = getTianshuDifficulty();
trigger.cancel();
if (difficulty == "nightmare") {
for (const target of enemies) {
player.line(target);
await player.gainPlayerCard({ target, position: "e", forced: true });
}
}
else {
const target = enemies.randomGet();
player.line(target);
await player.gainPlayerCard({ target, position: "e", forced: true });
}
},
ai: {
threaten: 1.4,
effect: {
target(card, player, target) {
if (get.tag(card, "recover") && target.hasSkill("yishen_shuying")) {
if (target.hp <= 1) return [1, 1.2];
if (target.hp <= 2) return [1, 0.8];
const enemies = target.getEnemies(null, false).filter(current => {
return current.isIn() && current.countGainableCards(target, "e") > 0;
});
if (!enemies.length) return;
let best = 0;
for (const enemy of enemies) {
for (const equip of enemy.getCards("e")) {
best = Math.max(best, get.value(equip, enemy));
}
}
if (best >= 5) return [1, 0.4];
}
},
},
},
},
//司马懿 over
fankui_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) &&
event.source.hasGainableCards(player, "he")
);
},
async content(event, trigger, player) {
await player.gainPlayerCard({
target: trigger.source,
position: "he",
forced: true,
});
},
ai: {
maixie_defend: true,
effect: {
target(card, player, target) {
if (player.countCards("he") > 1 && get.tag(card, "damage")) {
if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5];
if (target.getEnemies(null, false).includes(player)) return [1, 1];
}
},
},
},
},
guicai_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { global: "judge" },
filter(event, player) {
return player.countCards("hes") > 0;
},
async cost(event, trigger, player) {
event.result = await player.chooseCard(`${get.translation(trigger.player)}的${trigger.judgestr || ""}判定为${get.translation(trigger.player.judging[0])},${get.prompt(event.skill)}`, "hes", card => {
const player = get.player();
const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
if (mod2 != "unchanged") return mod2;
const mod = game.checkMod(card, player, "unchanged", "cardRespondable", player);
if (mod != "unchanged") return mod;
return true;
}).set("ai", card => {
const trigger = get.event().getTrigger(), player = get.player(), judging = trigger.player.judging[0];
const result = trigger.judge(card) - trigger.judge(judging);
const attitude = player.getEnemies(null, false).includes(trigger.player) ? -1 : 1;
let value = get.value(card, player);
value /= get.subtype(card) == "equip2" ? 2 : 4;
if (result == 0) return 0;
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(event.cards, event.name, "highlight", "noOrdering");
await next;
const { cards } = next;
if (cards?.length) {
if (trigger.player.judging[0].clone) {
trigger.player.judging[0].clone.classList.remove("thrownhighlight");
game.broadcast(card => {
if (card.clone) card.clone.classList.remove("thrownhighlight");
}, trigger.player.judging[0]);
game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone]));
}
await game.cardsDiscard(trigger.player.judging[0]);
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 } },
},
langgu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { player: "gainAfter" },
forced: true,
filter(event, player) {
if (player.hasSkill("langgu_shuying_used")) return false;
return game.hasPlayer(current => {
return (
current != player &&
player.getEnemies(null, false).includes(current) &&
event.getl?.(current)?.cards2?.length
);
});
},
async content(event, trigger, player) {
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");
const result = await player.judge(card => get.suit(card) == "spade" ? 2 : 0).forResult();
if (result.bool && source.isIn() && source.countDiscardableCards(player, "h") > 0) {
player.removeSkill("langgu_shuying_used");
player.line(source);
const card = source.getCards("h").randomGet();
await source.discard(card);
}
},
subSkill: {
used: { charlotte: true },
},
},
yuanlv_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { source: "damageBegin4" },
filter(event, player) {
return event.card && get.type2(event.card) == "trick" && event.player?.isIn() && player.getEnemies(null, false).includes(event.player);
},
async cost(event, trigger, player) {
event.result = await player.chooseBool(get.prompt(event.skill, trigger.player))
.set("ai", () => true)
.forResult();
},
async content(event, trigger, player) {
const target = trigger.player;
trigger.cancel();
await player.draw();
target.line(player);
if (getTianshuDifficulty() == "nightmare") {
await player.damage(1, target, "unreal");
}
else {
await player.damage(1, target);
}
},
},
//吕布 over
wushuang_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:2",
trigger: { source: "damageBegin1" },
forced: true,
locked: true,
usable(skill, player) {
return getTianshuDifficulty() == "nightmare" ? 2 : 1;
},
logTarget: "player",
filter(event, player) {
const target = event.player;
const evtx = event.getParent(2);
const card = event.card;
if (!card || !["sha", "juedou"].includes(card.name)) return false;
if (card.name == "sha") {
return !target.hasHistory("useCard", evt => {
return evt.card.name == "shan" && evt.respondTo && evt.getParent(3) == evtx;
});
}
return !target.hasHistory("respond", evt => {
return evt.card.name == "sha" && evt.respondTo && evt.getParent(3) == evtx;
});
},
async content(event, trigger, player) {
trigger.num++;
},
group: ["wushuang_shuying_1", "wushuang_shuying_2"],
subSkill: {
1: {
audio: "wushuang_shuying",
sourceSkill: "wushuang_shuying",
trigger: { player: "useCardToPlayered" },
forced: true,
logTarget: "target",
filter(event, player) {
return event.card.name == "sha" && !event.getParent().directHit.includes(event.target);
},
async content(event, trigger, player) {
const id = trigger.target.playerid;
const map = trigger.getParent().customArgs;
if (!map[id]) map[id] = {};
if (typeof map[id].shanRequired == "number") map[id].shanRequired++;
else map[id].shanRequired = 2;
},
ai: {
directHit_ai: true,
skillTagFilter(player, tag, arg) {
if (arg.card.name != "sha" || arg.target.countCards("h", "shan") > 1) return false;
},
},
},
2: {
audio: "wushuang_shuying",
sourceSkill: "wushuang_shuying",
trigger: { player: "useCardToPlayered", target: "useCardToTargeted" },
forced: true,
logTarget(trigger, player) {
return player == trigger.player ? trigger.target : trigger.player;
},
filter(event, player) {
return event.card.name == "juedou";
},
async content(event, trigger, player) {
const id = (player == trigger.player ? trigger.target : trigger.player).playerid;
const idt = trigger.target.playerid;
const map = trigger.getParent().customArgs;
if (!map[idt]) map[idt] = {};
if (!map[idt].shaReq) map[idt].shaReq = {};
if (!map[idt].shaReq[id]) map[idt].shaReq[id] = 1;
map[idt].shaReq[id]++;
},
ai: {
directHit_ai: true,
skillTagFilter(player, tag, arg) {
if (
arg.card.name != "juedou" ||
Math.floor(arg.target.countCards("h", "sha") / 2) > player.countCards("h", "sha")
) {
return false;
}
},
},
},
},
ai: {
threaten: 1.8,
directHit_ai: true,
},
},
shenij_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:2",
group: [
"shenij_shuying_judge",
"shenij_shuying_draw",
"shenij_shuying_sha",
"shenij_shuying_target",
],
subSkill: {
judge: {
audio: "shenij_shuying",
trigger: { player: "phaseJudgeBegin" },
filter(event, player) {
return player.countCards("h") >= 2 && player.countCards("j") > 0;
},
async cost(event, trigger, player) {
event.result = await player
.chooseToDiscard("h", 2, get.prompt2(event.skill))
.set("ai", card => {
const player = get.player();
if (!player.countCards("j")) return 0;
return 7 - get.value(card);
})
.forResult();
},
async content(event, trigger, player) {
const cards = player.getCards("j");
await player.discard(cards);
},
ai: {
effect: {
target(card, player, target) {
if (get.type(card) == "delay") return [0, 2];
},
},
},
},
draw: {
audio: "shenij_shuying",
trigger: { player: "phaseDrawBegin2" },
forced: true,
filter(event, player) {
return !event.numFixed;
},
async content(event, trigger, player) {
let num = 2;
if (getTianshuDifficulty() == "hard") num = 3;
if (getTianshuDifficulty() == "nightmare") num = 4;
trigger.num += num;
},
},
sha: {
audio: "shenij_shuying",
forced: true,
mod: {
cardUsable(card, player, num) {
let shaNum = 2;
if (getTianshuDifficulty() == "normal") shaNum = 1;
if (card.name == "sha") return num + shaNum;
},
},
},
target: {
audio: "shenij_shuying",
trigger: { player: "useCard2" },
filter(event, player) {
if (event.card.name != "sha") return false;
const info = get.info(event.card);
if (info.allowMultiple == false || info.multitarget || !event.targets) return false;
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1;
return game.countPlayer(current => {
return !event.targets.includes(current) &&
lib.filter.targetEnabled2(event.card, player, current) &&
lib.filter.targetInRange(event.card, player, current);
}) > 0;
},
async cost(event, trigger, player) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1;
event.result = await player
.chooseTarget(
get.prompt(event.skill),
`为此【杀】额外指定至多${get.cnNumber(num)}名目标`,
[1, num],
(card, player, target) => {
const trigger = get.event().getTrigger();
return !trigger.targets.includes(target) &&
lib.filter.targetEnabled2(trigger.card, player, target) &&
lib.filter.targetInRange(trigger.card, player, target);
}
)
.set("ai", target => {
const player = get.player();
if (!player.getEnemies(null, false).includes(target)) return 0;
return get.effect(target, get.event().getTrigger().card, player, player);
})
.forResult();
},
async content(event, trigger, player) {
for (const target of event.targets) {
player.line(target);
trigger.targets.add(target);
game.log(target, "成为了", trigger.card, "的额外目标");
}
},
ai: {
effect: {
player_use(card, player, target) {
if (card.name == "sha" && player.getEnemies(null, false).includes(target)) return [1, 0.5];
},
},
},
},
},
},
zhanjia_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:2",
trigger: { player: "damageBegin4" },
forced: true,
locked: true,
usable: 1,
filter(event, player) {
return event.num > 2;
},
async content(event, trigger, player) {
trigger.num = 2;
await player.draw(getTianshuDifficulty() == "nightmare" ? 3 : 2);
},
ai: {
filterDamage: true,
effect: {
target(card, player, target) {
if (get.tag(card, "damage")) {
if (player.hasSkillTag("jueqing", false, target)) return;
return [1, 0.8];
}
},
},
},
},
//董卓 over
jiuchi_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
enable: "chooseToUse",
filterCard(card, player) {
return get.suit(card, player) == "spade";
},
position: "h",
viewAs: { name: "jiu" },
viewAsFilter(player) {
return player.countCards("h", card => get.suit(card, player) == "spade") > 0;
},
prompt: "将一张黑桃手牌当【酒】使用",
check(card) {
return 6 - get.value(card);
},
ai: {
order: 3.5,
respondJiu: true,
skillTagFilter(player) {
return player.countCards("h", card => get.suit(card, player) == "spade") > 0;
},
},
},
roulin_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { player: "useCardToPlayered", target: "useCardToTargeted" },
forced: true,
locked: true,
logTarget(trigger, player) {
return player == trigger.player ? trigger.target : trigger.player;
},
filter(event, player) {
if (event.card.name != "sha") return false;
if (player == event.player) return event.target.hasSex("female");
return event.player.hasSex("female");
},
async content(event, trigger, player) {
const id = (player == trigger.player ? trigger.target : player).playerid;
const map = trigger.getParent().customArgs;
if (!map[id]) map[id] = {};
if (typeof map[id].shanRequired == "number") map[id].shanRequired++;
else map[id].shanRequired = 2;
},
ai: {
halfneg: true,
directHit_ai: true,
skillTagFilter(player, tag, arg) {
if (tag === "directHit_ai") return;
if (arg.card.name != "sha" || !arg.target.hasSex("female") || arg.target.countCards("h", "shan") > 1) {
return false;
}
},
},
},
baonue_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
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);
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();
if (result.bool) {
for (const target of result.targets) {
player.line(target);
await target.damage(1, player);
}
}
await player.loseHp();
},
ai: {
threaten: 2,
},
},
qubu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/青青子衿:1",
trigger: { global: "useCardToPlayered" },
forced: true,
locked: true,
filter(event, player) {
return (
event.card.name == "sha" &&
event.player?.isIn() &&
!player.getEnemies(null, false).includes(event.player) &&
event.targets?.length > 0
);
},
async content(event, trigger, player) {
const result = await player
.judge(card => get.color(card) == "black" ? 2 : -1)
.set("judge2", result => result.bool)
.forResult();
if (result.bool) {
const targets = trigger.targets.filter(target => target.isIn());
for (const target of targets) {
player.line(target);
await target.damage(1, player);
}
}
},
ai: {
threaten: 1.8,
},
},
};
export default skills;
+41
View File
@@ -0,0 +1,41 @@
const translates = {
caocao_boss_shuying: "曹操",
jianxiong_shuying: "奸雄",
jianxiong_shuying_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。",
lingba_shuying: "凌霸",
lingba_shuying_info: "锁定技,你的回合开始时,若你手牌数为全场最多,则对一名随机敌人造成1点伤害。若你手牌数大于等于你体力值的两倍,则改为对所有敌人造成伤害。",
yishen_shuying: "疑神",
yishen_shuying_info: "当你回复体力时,可以改为获得一名随机敌方角色一张随机装备。",
simayi_boss_shuying: "司马懿",
fankui_shuying: "反馈",
fankui_shuying_info: "当你受到1点伤害后,你可以获得伤害来源的一张牌。",
guicai_shuying: "鬼才",
guicai_shuying_info: "当一名角色的判定牌生效前,你可以打出一张牌代替之。",
langgu_shuying: "狼顾",
langgu_shuying_info: " 锁定技,每回合限一次,当你获得其他角色的牌时,进行一次判定:若结果为黑桃,随机弃置其1张手牌,且视为此技能本回合未发动过。",
yuanlv_shuying: "远虑",
yuanlv_shuying_info: "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成1点伤害。",
lvbu_boss_shuying: "吕布",
wushuang_shuying: "无双",
wushuang_shuying_info: "锁定技。①你使用的【杀】需两张【闪】才能抵消;与你进行【决斗】的角色每次需要打出两张【杀】。②每回合限1次,当你使用【杀】或【决斗】造成伤害时,若受伤角色没有使用或打出过【杀】或【闪】响应此牌,则此伤害+1。",
shenij_shuying: "神戟",
shenij_shuying_info: "判定阶段,你可以弃置两张手牌,然后弃置你判定区里的牌;摸牌阶段,你多摸两张牌;出牌阶段,你可以多使用一张【杀】,你的【杀】可以多指定一名角色为目标。",
zhanjia_shuying: "战甲",
zhanjia_shuying_info: "锁定技,每回合限一次,当你受到大于2点的伤害时,将此伤害减至2点,然后摸两张牌。",
dongzhuo_boss_shuying: "董卓",
jiuchi_shuying: "酒池",
jiuchi_shuying_info: "你可以将一张黑桃手牌当【酒】使用。",
roulin_shuying: "肉林",
roulin_shuying_info: "锁定技,你对女性角色使用的【杀】和女性角色对你使用的【杀】均需使用两张【闪】才能抵消。",
baonue_shuying: "暴虐",
baonue_shuying_info: "锁定技,回合开始时,你摸X张牌并对至多X名角色造成1点伤害,然后你失去1点体力。X为你已损失体力且最大为3。",
qubu_shuying: "驭布",
qubu_shuying_info: "锁定技,当友方角色使用【杀】指定目标时,进行一次判定:若结果为黑桃,你对此【杀】的所有目标造成1点伤害。",
};
export default translates;
+70
View File
@@ -0,0 +1,70 @@
const characters = {
zishu_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["zishu_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/zishu_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/zishu.mp3"]
},
// chouniu_boss_shuying: {},
// yinhu_boss_shuying: {},
// maotu_boss_shuying: {},
chenlong_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["chenlong_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/chenlong_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/chenlong.mp3"]
},
// sishe_boss_shuying: {},
wuma_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["wuma_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/wuma_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/wuma_shuying.mp3"]
},
weiyang_boss_shuying: {
sex: "female",
group: "qun",
hp: 4,
skills: ["weiyang_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/weiyang_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/weiyang.mp3"]
},
shenhou_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["shenhou_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/shenhou_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/shenhou.mp3"]
},
// youji_boss_shuying: {},
xvgou_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["xvgou_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/十二生肖/xvgou_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/十二生肖/xvgou.mp3"]
},
// haizhu_boss_shuying: {},
};
export default characters;
+297
View File
@@ -0,0 +1,297 @@
import { lib, game, ui, get, ai, _status, getTianshuDifficulty } from "../../shared.js";
const skills = {
//子鼠
zishu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
enable: "phaseUse",
usable: 1,
filter(event, player) {
return game.hasPlayer(current => {
return current != player && current.countCards("h") > player.countCards("h");
});
},
async content(event, trigger, player) {
while (player.isIn()) {
const max = Math.max(...game.players.map(current => current.countCards("h")));
if (player.countCards("h") >= max) break;
const targets = game.filterPlayer(current => {
return current != player && current.countCards("h") > player.countCards("h");
});
if (!targets.length) break;
const hasEnemy = targets.some(target => player.getEnemies(null, false).includes(target));
const result = await player
.chooseTarget("恣疏:获得一名手牌数大于你的角色一张手牌", (card, player, target) => {
return target != player && target.countCards("h") > player.countCards("h");
})
.set("ai", target => {
const player = get.player();
const enemies = player.getEnemies(null, false);
const isEnemy = enemies.includes(target);
const hasEnemy = game.hasPlayer(current => {
return current != player && current.countCards("h") > player.countCards("h") && enemies.includes(current);
});
if (hasEnemy && !isEnemy) return 0;
if (isEnemy) return 8 + target.countCards("h") - get.attitude(player, target);
return 1 + target.countCards("h") / 10;
})
.forResult();
if (!result.bool) break;
const target = result.targets[0];
player.line(target);
await player.gainPlayerCard({
target,
position: "h",
forced: true,
});
}
},
ai: {
order: 4.5,
result: {
player(player) {
const enemies = player.getEnemies(null, false);
if (game.hasPlayer(current => current != player && current.countCards("h") > player.countCards("h") && enemies.includes(current))) {
return 1;
}
if (game.hasPlayer(current => current != player && current.countCards("h") > player.countCards("h") && !enemies.includes(current))) {
return 0.2;
}
return 0;
},
},
threaten: 1.4,
},
},
//辰龙
chenlong_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
enable: "phaseUse",
limited: true,
skillAnimation: true,
animationColor: "fire",
selectTarget: 1,
filter(event, player) {
return !player.storage.chenlong_shuying_used && game.hasPlayer(current => current != player && player.getEnemies(null, false).includes(current));
},
filterTarget(card, player, target) {
return target != player && player.getEnemies(null, false).includes(target);
},
async content(event, trigger, player) {
const target = event.targets[0];
const result = await player.chooseControl([1, 2, 3, 4, 5])
.set("prompt", "失去任意点体力,然后对一名其他角色造成等量伤害")
.set("ai", () => 4)
.forResult();
const num = result.control;
if (!num) return;
player.storage.chenlong_shuying_used = true;
player.storage.chenlong_shuying_dying = true;
await player.loseHp(num);
delete player.storage.chenlong_shuying_dying;
player.awakenSkill(event.name);
if (target.isIn()) {
player.line(target);
await target.damage(num, player);
}
},
ai: {
order: 4,
result: {
target(player, target) {
if (!player.getEnemies(null, false).includes(target)) return 0;
const effect = get.damageEffect(target, player, target);
if (effect >= 0) return 0;
return target.hp <= 2 ? effect * 2 : effect;
},
},
},
group: "chenlong_shuying_dying",
subSkill: {
dying: {
trigger: { player: ["dying", "dyingAfter"] },
forced: true,
popup: false,
charlotte: true,
filter(event, player) {
return player.storage.chenlong_shuying_dying && player.hp <= 0;
},
async content(event, trigger, player) {
await player.recoverTo(1);
if (player.maxHp > 0) await player.loseMaxHp();
},
},
},
},
//午马
wuma_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
trigger: { target: "useCardToTargeted" },
forced: true,
locked: true,
filter(event, player) {
return event.player != player && get.type2(event.card) == "trick";
},
async content(event, trigger, player) {
await player.draw();
},
group: ["wuma_shuying_turn", "wuma_shuying_skip"],
subSkill: {
turn: {
audio: "wuma_shuying",
trigger: { player: "turnOverBefore" },
forced: true,
filter(event, player) {
return !player.isTurnedOver();
},
async content(event, trigger, player) {
trigger.cancel();
},
},
skip: {
audio: "wuma_shuying",
trigger: { player: ["phaseAnySkipped", "phaseAnyCancelled"] },
forced: true,
async content(event, trigger, player) {
game.log(player, "恢复了", trigger.name);
await player[trigger.name]();
},
},
},
ai: {
effect: {
target(card, player, target) {
if (player != target && get.type2(card) == "trick") return [1, 0.5];
},
},
},
},
//未羊
weiyang_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
enable: "phaseUse",
usable: 1,
position: "he",
selectCard: [1, Infinity],
filter(event, player) {
return game.hasPlayer(current => current.isDamaged() && !player.getEnemies(null, false).includes(current));
},
filterCard(card, player) {
const type = get.type(card);
const friends = game.countPlayer(current => current.isDamaged() && !player.getEnemies(null, false).includes(current));
return ui.selected.cards.length < friends && !ui.selected.cards.some(cardx => get.type(cardx) == type);
},
check(card) {
return 6 - get.value(card);
},
async content(event, trigger, player) {
const num = event.cards.length;
const friends = game.filterPlayer(current => current.isDamaged() && !player.getEnemies(null, false).includes(current));
if (!friends.length) return;
const result = await player.chooseTarget(`令至多${get.cnNumber(num)}名角色回复1点体力`, [1, Math.min(num, friends.length)], (card, player, target) => {
return target.isDamaged() && !player.getEnemies(null, false).includes(target);
}).set("ai", target => get.recoverEffect(target, get.player(), get.player())).forResult();
if (result.bool) {
for (const target of result.targets) {
player.line(target);
await target.recover();
}
}
},
ai: {
order: 6,
result: {
player(player) {
return game.hasPlayer(current => current.isDamaged() && !player.getEnemies(null, false).includes(current) && get.recoverEffect(current, player, player) > 0) ? 1 : 0;
},
},
},
},
//申猴
shenhou_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
trigger: { target: "useCardToTargeted" },
filter(event, player) {
return event.card.name == "sha";
},
async cost(event, trigger, player) {
event.result = await player
.chooseBool(get.prompt2(event.skill))
.set("ai", () => {
const player = get.player();
const trigger = get.event().getTrigger();
return get.effect(player, trigger.card, trigger.player, player) < 0;
})
.forResult();
},
async content(event, trigger, player) {
const result = await player
.judge(card => get.color(card) == "red" ? 2 : -1)
.set("judge2", result => result.bool)
.forResult();
if (result.bool) {
trigger.getParent().excluded.add(player);
}
},
ai: {
effect: {
target(card, player, target) {
if (card.name == "sha") return [1, 0.6];
},
},
},
},
//戌狗
xvgou_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/十二生肖:1",
forced: true,
group: ["xvgou_shuying_cancel", "xvgou_shuying_damage"],
mod: {
targetInRange(card, player, target) {
if (card.name == "sha" && get.color(card) == "red") return true;
},
},
subSkill: {
cancel: {
trigger: { target: "useCardToTargeted" },
forced: true,
filter(event, player) {
return event.card.name == "sha" && get.color(event.card) == "red";
},
async content(event, trigger, player) {
trigger.getParent().excluded.add(player);
},
},
damage: {
trigger: { source: "damageBegin1" },
forced: true,
filter(event, player) {
return event.card?.name == "sha" && get.color(event.card) == "red";
},
async content(event, trigger, player) {
trigger.num++;
},
},
},
},
};
export default skills;
+28
View File
@@ -0,0 +1,28 @@
const translates = {
zishu_boss_shuying: "子鼠",
zishu_shuying: "子鼠",
zishu_shuying_info: "出牌阶段限一次,你可以获得手牌数大于你的其他角色一张手牌,你可以重复此流程,直到你的手牌数为全场最多。",
chenlong_boss_shuying: "辰龙",
chenlong_shuying: "辰龙",
chenlong_shuying_info: "限定技,出牌阶段,你可以失去任意点体力(至多为5),然后对一名其他角色造成等量的伤害。若你以此法进入濒死状态,则你将体力值回复至1,然后减少1点体力上限。",
wuma_boss_shuying: "午马",
wuma_shuying: "午马",
wuma_shuying_info: "锁定技,你不能被翻面;你的阶段不能被跳过;当你成为其他角色使用锦囊牌的目标后,摸一张牌。",
weiyang_boss_shuying: "未羊",
weiyang_shuying: "未羊",
weiyang_shuying_info: "出牌阶段限一次,你可以弃置任意张不同类型的牌,然后令至多等量角色回复1点体力。",
shenhou_boss_shuying: "申猴",
shenhou_shuying: "申猴",
shenhou_shuying_info: "当你成为【杀】的目标时,你可以进行判定,若结果为红色,则此【杀】对你无效。",
xvgou_boss_shuying: "戌狗",
xvgou_shuying: "戌狗",
xvgou_shuying_info: "锁定技,红色【杀】对你无效;你使用红色【杀】无距离限制且造成伤害+1.",
};
export default translates;
+65
View File
@@ -0,0 +1,65 @@
const characters = {
shuishengonggong_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["tuanliu_shuying", "juehong_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/shuishengonggong_boss_shuying.png"
},
// huoshenzhurong_boss_shuying: {},
baiqi_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["changsheng_shuying", "shashen_shuying", "wuan_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/baiqi_boss_shuying.png"
},
kuafu_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["shenqu_shuying", "lieben_shuying", "yinjiang_shuying", "zhuri_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/kuafu_boss_shuying.png"
},
shaohao_boss_shuying:
{
sex: "male",
group: "shen",
hp: 4,
skills: ["baiyi_shuying", "shenen_shuying",],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/shaohao_boss_shuying.png"
},
xuannv_boss_shuying: {
sex: "female",
group: "shen",
hp: 4,
skills: ["xuanlie_shuying", "jiutian_shuying", "dishi_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/xuannv_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/天书乱斗/xuannv_boss_shuying.mp3"]
},
hanba_boss_shuying: {
sex: "female",
group: "shen",
hp: 4,
skills: ["xinji_shuying", "zhiri_shuying", "fenshi_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/天书乱斗/hanba_boss_shuying.png",
dieAudios: ["ext:术樱包/pve/audio/dead/天书乱斗/hanba_boss_shuying.mp3"]
},
};
export default characters;
+67
View File
@@ -0,0 +1,67 @@
import { getTianshuDifficulty } from "../../shared.js";
const dynamicTranslates = {
//水神共工
tuanliu_shuying(player, skill) {
let hp = 2;
let card = 4;
let damage = 1;
if (getTianshuDifficulty() == "nightmare") {
hp = 3;
card = 6;
}
return `锁定技,结束阶段,若本回合进入弃牌堆的卡牌数量:大于4,你回复${hp}点体力;大于5,你摸${card}张牌;大于9,你对所有敌方角色造成${damage}点伤害。`
},
//少昊
baiyi_shuying(player, skill) {
let num = 1;
const difficulty = getTianshuDifficulty();
if (difficulty == "hard") {
num = 2;
} else if (difficulty == "nightmare") {
num = 3;
}
return `锁定技,每名敌方角色的回合开始时,若当前轮数小于3,你随机获得其${num}张牌;若当前轮数小于5,对其造成${num}点雷电伤害;若当前轮数小于7,其随机弃置${num}张牌。`;
},
//玄女
xuanlie_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
const num = difficulty == "normal" ? 1 : 2;
return `锁定技,回合结束时,对所有本回合你获得过其牌的敌方角色依次造成${num}点伤害。`;
},
jiutian_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
const num = difficulty == "normal" ? 1 : 2;
const extra =
difficulty == "normal" || difficulty == "hard"
? ""
: "若这些牌包含4种花色,这些角色再额外失去1点体力。";
return `锁定技,准备阶段,你获得所有敌方角色各${num}张手牌。若你以此法获得的牌包含2种颜色,则对所有你以此法获得其牌的敌方角色造成1点伤害。${extra}`;
},
xinji_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
const num = difficulty == "nightmare" ? 2 : 1;
return `锁定技,当友方于回合外因弃置而失去手牌时,你对当前角色造成${num}点伤害。`
},
zhiri_shuying(player, skill) {
let num = 1;
const difficulty = getTianshuDifficulty();
if (difficulty == "hard") {
num = 2;
} else if (difficulty == "nightmare") {
num = 3;
}
return `锁定技,当敌方角色使用红色锦囊牌指定目标后,你摸${num}张牌。`
},
};
export default dynamicTranslates;
+584
View File
@@ -0,0 +1,584 @@
import { lib, game, ui, get, ai, _status, getTianshuDifficulty } from "../../shared.js";
const skills = {
//水神共工 over
shuishen_shuying: {
mode: ["boss"],
forced: true,
group: ["shuishen_shuying_recover", "shuishen_shuying_draw", "shuishen_shuying_damage"],
subSkill: {
recover: {
trigger: { player: "recoverBegin" },
audio: false,
forced: true,
filter(event, player) {
return game.shuying_getDiscardNamesNum() >= 4;
},
async content(event, trigger, player) {
trigger.num++;
},
},
draw: {
trigger: { player: "phaseDrawBegin2" },
audio: false,
forced: true,
filter(event, player) {
return !event.numFixed && game.shuying_getDiscardNamesNum() >= 5;
},
async content(event, trigger, player) {
trigger.num += 5;
},
},
damage: {
trigger: { source: "damageBegin1" },
audio: false,
forced: true,
filter(event, player) {
return game.shuying_getDiscardNamesNum() >= 9;
},
async content(event, trigger, player) {
trigger.num++;
},
},
},
},
tuanliu_shuying: {
mode: ["boss"],
trigger: { player: "phaseJieshuBegin" },
audio: false,
forced: true,
filter(event, player) {
return game.shuying_getDiscardNum() > 4;
},
async content(event, trigger, player) {
let hp = 2;
let card = 4;
let damage = 1;
if (getTianshuDifficulty() == "nightmare") {
hp = 3;
card = 6;
}
const num = game.shuying_getDiscardNum();
if (num > 4) await player.recover(hp);
if (num > 5) await player.draw(card);
if (num > 9) {
for (const target of player.getEnemies(null, false).filter(target => target.isIn())) {
player.line(target);
await target.damage(player, damage);
}
}
},
},
juehong_shuying: {
mode: ["boss"],
trigger: { player: "phaseZhunbeiBegin" },
audio: false,
forced: true,
filter(event, player) {
return player.getEnemies(null, false).some(target => target.isIn());
},
async content(event, trigger, player) {
for (const target of player.getEnemies(null, false).filter(target => target.isIn())) {
player.line(target);
if (target.countCards("e")) await target.chooseToDiscard("e", true, target.countCards("e"));
else if (target.countCards("h")) await target.discard(target.getCards("h").randomGets(Math.min(2, target.countCards("h"))));
}
},
},
//白起
changsheng_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill:1",
forced: true,
mod: {
targetInRange(card, player, target) {
if (card.name == "sha") return true;
},
},
},
shashen_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill:1",
enable: ["chooseToUse", "chooseToRespond"],
filterCard: true,
position: "h",
viewAs: { name: "sha" },
viewAsFilter(player) {
return player.countCards("h") > 0;
},
prompt: "将一张手牌当【杀】使用或打出",
check(card) {
return 6 - get.value(card);
},
group: "shashen_shuying_draw",
subSkill: {
draw: {
trigger: { source: "damageEnd" },
filter(event, player) {
return event.card?.name == "sha";
},
async content(event, trigger, player) {
await player.draw(3);
},
},
},
ai: {
respondSha: true,
skillTagFilter(player) {
return player.countCards("h") > 0;
},
order: 4,
},
},
wuan_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill:1",
forced: true,
mod: {
cardUsable(card, player, num) {
if (card.name == "sha") return num + 3;
},
},
trigger: { source: "damageBegin1" },
filter(event, player) {
return event.card?.name == "sha";
},
async content(event, trigger, player) {
trigger.num++;
},
},
//盘古
shenqu_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill:1",
trigger: { player: "damageEnd" },
forced: true,
filter(event, player) {
return player.countCards("h", card => get.color(card) == "red") > 0;
},
async content(event, trigger, player) {
const cards = player.getCards("h", card => get.color(card) == "red");
await player.lose(cards, ui.cardPile, "insert");
await player.draw(cards.length);
},
},
lieben_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill:1",
trigger: { player: "useCardToPlayered" },
forced: true,
filter(event, player) {
return event.card.name == "sha" && ui.cardPile.lastChild;
},
async content(event, trigger, player) {
const judge = player.judge(card => get.color(card) == "red" ? 2 : -1);
judge.directresult = ui.cardPile.lastChild;
judge.judge2 = result => result.bool;
const result = await judge.forResult();
if (result.bool) {
trigger.getParent().addCount = false;
trigger.getParent().baseDamage++;
}
},
},
yinjiang_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill:1",
trigger: { player: "drawEnd" },
forced: true,
filter(event, player) {
return player.isPhaseUsing() && !player.hasSkill("yinjiang_shuying_disabled") && ui.cardPile.lastChild;
},
async content(event, trigger, player) {
const card = ui.cardPile.lastChild;
await player.gain(card, "gain2");
if (get.color(card) == "red") {
let count = 0;
for (const target of player.getEnemies(null, false).filter(target => target.isIn())) {
player.line(target);
await target.damage(player);
count++;
}
player.storage.yinjiang_shuying_count = (player.storage.yinjiang_shuying_count || 0) + count;
if (player.storage.yinjiang_shuying_count >= 2) player.addTempSkill("yinjiang_shuying_disabled", { player: "phaseUseEnd" });
}
},
group: "yinjiang_shuying_clear",
subSkill: {
clear: {
trigger: { player: "phaseUseEnd" },
silent: true,
async content(event, trigger, player) {
delete player.storage.yinjiang_shuying_count;
},
},
disabled: { charlotte: true },
},
},
zhuri_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill:1",
forced: true,
group: ["zhuri_shuying_draw", "zhuri_shuying_bottom"],
subSkill: {
draw: {
trigger: { player: "useCard" },
forced: true,
filter(event, player) {
return get.color(event.card) == "red";
},
async content(event, trigger, player) {
await player.draw();
},
},
bottom: {
trigger: { global: "useCardAfter" },
forced: true,
filter(event, player) {
return event.targets?.includes(player) && (event.card.name == "sha" || get.type(event.card) == "trick") && event.cards?.filterInD("d").length;
},
async content(event, trigger, player) {
const cards = trigger.cards.filterInD("d");
game.log(cards, "被置于牌堆底");
for (const card of cards) ui.cardPile.appendChild(card);
},
},
},
},
//少昊 over
baiyi_shuying: {
mode: ["boss"],
trigger: { global: "phaseBegin" },
forced: true,
logTarget: "player",
filter(event, player) {
return (
game.roundNumber < 7 &&
event.player?.isIn() &&
player.getEnemies(null, false).includes(event.player)
);
},
async content(event, trigger, player) {
let num = 1;
const target = trigger.player;
player.line(target);
const difficulty = getTianshuDifficulty();
if (difficulty == "hard") {
num = 2;
} else if (difficulty == "nightmare") {
num = 3;
}
if (game.roundNumber < 3 && target.countGainableCards(player, "he") > 0) {
const cards = target.getCards("he").randomGets(Math.min(num, target.countCards("he")));
await player.gain(cards, target, "giveAuto");
}
if (game.roundNumber < 5 && target.isIn()) {
await target.damage(num, "thunder", player);
}
if (game.roundNumber < 7 && target.isIn()) {
const cards = target
.getCards("he")
.filter(card => lib.filter.cardDiscardable(card, target, "baiyi_shuying"))
.randomGets(num);
if (cards.length) {
await target.discard(cards);
}
}
},
ai: {
threaten: 3,
},
},
shenen_shuying: {
mode: ["boss"],
forced: true,
global: "shenen_shuying_global",
subSkill: {
global: {
mod: {
targetInRange(card, player, target) {
const owner = game.findPlayer(current => current.hasSkill("shenen_shuying"));
if (owner && !owner.getEnemies(null, false).includes(player)) return true;
},
},
},
},
ai: {
threaten: 1.5,
},
},
//玄女 over
xuanlie_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/天书乱斗:1",
trigger: { player: "phaseJieshuBegin" },
forced: true,
locked: true,
filter(event, player) {
return game.hasPlayer(current => {
return (
current.isIn() &&
player.getEnemies(null, false).includes(current) &&
player.getHistory("gain", evt => evt.getl?.(current)?.cards2?.length).length
);
});
},
async content(event, trigger, player) {
const targets = game.filterPlayer(current => {
return (
current.isIn() &&
player.getEnemies(null, false).includes(current) &&
player.getHistory("gain", evt => evt.getl?.(current)?.cards2?.length).length
);
});
let num = 2;
if (getTianshuDifficulty() == "normal") num = 1;
for (const target of targets) {
player.line(target);
await target.damage(num, player);
}
},
ai: {
threaten: 2,
},
},
jiutian_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/天书乱斗:1",
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
locked: true,
filter(event, player) {
return player.getEnemies(null, false).some(target => target.isIn() && target.countGainableCards(player, "h") > 0);
},
async content(event, trigger, player) {
let num = 2;
const difficulty = getTianshuDifficulty();
if (difficulty == "normal") num = 1;
const targets = player.getEnemies(null, false).filter(target => target.isIn() && target.countGainableCards(player, "h") > 0);
const gained = [];
for (const target of targets) {
const cards = target.getCards("h").randomGets(Math.min(num, target.countCards("h")));
if (cards.length) {
player.line(target);
await player.gain(cards, target, "giveAuto");
gained.addArray(cards);
}
}
if (!gained.length) return;
const colors = gained.map(card => get.color(card, player)).unique();
const suits = gained.map(card => get.suit(card, player)).unique();
if (colors.length >= 2) {
for (const target of targets) {
if (!target.isIn()) continue;
player.line(target);
target.damage(1, player);
}
}
if (difficulty == "nightmare" && suits.length >= 4) {
for (const target of targets) {
if (!target.isIn()) continue;
player.line(target);
await target.loseHp();
}
}
},
ai: {
threaten: 3,
},
},
dishi_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/天书乱斗:1",
trigger: { player: "useCard2" },
filter(event, player) {
if (!event.targets?.length) return false;
if (event.card.name != "sha" && get.type(event.card) != "trick") return false;
const info = get.info(event.card);
if (event.targets.length == 1) {
if (info.allowMultiple == false || info.multitarget) return false;
return game.hasPlayer(current => {
return (
!event.targets.includes(current) &&
lib.filter.targetEnabled2(event.card, player, current) &&
lib.filter.targetInRange(event.card, player, current)
);
});
}
return event.targets.length > 1;
},
async cost(event, trigger, player) {
if (trigger.targets.length == 1) {
event.result = await player
.chooseTarget(get.prompt(event.skill), `为${get.translation(trigger.card)}增加一个目标`, (card, player, target) => {
const trigger = get.event().getTrigger();
return (
!trigger.targets.includes(target) &&
lib.filter.targetEnabled2(trigger.card, player, target) &&
lib.filter.targetInRange(trigger.card, player, target)
);
})
.set("ai", target => {
const player = get.player();
const trigger = get.event().getTrigger();
const effect = get.effect(target, trigger.card, player, player);
if (player.getEnemies(null, false).includes(target)) return effect;
return Math.min(0, effect);
})
.forResult();
}
else {
event.result = await player
.chooseTarget(get.prompt(event.skill), `令${get.translation(trigger.card)}减少一个目标`, (card, player, target) => {
return get.event().getTrigger().targets.includes(target);
})
.set("ai", target => {
const player = get.player();
const trigger = get.event().getTrigger();
return -get.effect(target, trigger.card, player, player);
})
.forResult();
}
},
async content(event, trigger, player) {
const target = event.targets[0];
player.line(target);
if (trigger.targets.includes(target)) {
trigger.targets.remove(target);
game.log(target, "不再是", trigger.card, "的目标");
}
else {
trigger.targets.add(target);
game.log(target, "成为了", trigger.card, "的额外目标");
}
},
ai: {
threaten: 1.6,
},
},
//旱魃
xinji_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/天书乱斗:2",
trigger: { global: "loseAfter" },
forced: true,
locked: true,
filter(event, player) {
return (
_status.currentPhase &&
_status.currentPhase.isIn() &&
event.player?.isIn() &&
event.player != _status.currentPhase &&
!player.getEnemies(null, false).includes(event.player) &&
event.type == "discard" &&
event.cards2?.some(card => get.position(card, true) == "d" && event.hs?.includes(card))
);
},
async content(event, trigger, player) {
const difficulty = getTianshuDifficulty();
const num = difficulty == "nightmare" ? 2 : 1;
const target = _status.currentPhase;
player.line(target);
await target.damage(num, player);
},
ai: {
threaten: 1.6,
},
},
zhiri_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/天书乱斗:2",
trigger: { global: "useCardToPlayered" },
forced: true,
locked: true,
filter(event, player) {
return (
event.isFirstTarget &&
event.player?.isIn() &&
player.getEnemies(null, false).includes(event.player) &&
get.type2(event.card) == "trick" &&
get.color(event.card) == "red"
);
},
async content(event, trigger, player) {
let num = 1;
const difficulty = getTianshuDifficulty();
if (difficulty == "hard") {
num = 2;
} else if (difficulty == "nightmare") {
num = 3;
}
await player.draw(num);
},
ai: {
threaten: 1.4,
},
},
fenshi_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/天书乱斗:2",
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
locked: true,
filter(event, player) {
const num = player.countCards("h") - player.hp;
if (num < 0) return true;
if (num > 0) return player.getEnemies(null, false).some(target => target.isIn());
return false;
},
async content(event, trigger, player) {
const num = player.countCards("h") - player.hp;
if (num < 0) {
await player.draw(-num);
return;
}
const enemies = player.getEnemies(null, false).filter(target => target.isIn());
const map = new Map();
for (let i = 0; i < num && enemies.length; i++) {
const target = enemies.randomGet();
map.set(target, (map.get(target) || 0) + 1);
}
for (const [target, damage] of map) {
if (!target.isIn()) continue;
player.line(target);
await target.damage(damage, player);
}
},
ai: {
threaten: 2,
},
},
};
export default skills;
+53
View File
@@ -0,0 +1,53 @@
const translates = {
shuishengonggong_boss_shuying: "水神共工",
shuishen_shuying: "水神",
shuishen_shuying_info: "锁定技,弃牌堆中,不同牌名的牌数达到4时,你回复体力时回复量+1;达到5时,摸牌阶段额外摸5张牌;达到9时,你造成伤害时伤害+1。",
tuanliu_shuying: "湍流",
tuanliu_shuying_info: "锁定技,结束阶段,若本回合进入弃牌堆的卡牌数量:大于4,你回复2点体力;大于5,你摸4张牌;大于9,你对所有敌方角色造成1点伤害。",
juehong_shuying: "决洪",
juehong_shuying_info: "锁定技,准备阶段,你令所有敌方角色自己弃置自己的装备区内的所有牌,若其装备区内没有牌,则改为随机弃置2张手牌",
baiqi_boss_shuying: "白起",
changsheng_shuying: "常胜",
changsheng_shuying_info: "锁定技,你使用【杀】无距离限制。",
shashen_shuying: "杀神",
shashen_shuying_info: "你可以将手牌中的任意牌当【杀】使用或打出。你使用的【杀】造成伤害后,摸三张牌。",
wuan_shuying: "武安",
wuan_shuying_info: "锁定技,你可使用的【杀】的次数+3,【杀】造成的伤害+1。",
kuafu_boss_shuying: "盘古",
shenqu_shuying: "神躯",
shenqu_shuying_info: "锁定技,当你受到伤害后,将所有红色手牌置于牌堆底,并摸等量的牌。",
lieben_shuying: "烈奔",
lieben_shuying_info: "锁定技,当你使用【杀】指定目标后,使用牌堆底的牌进行一次判定:若判定结果为红色,则此杀不计入出牌阶段使用次数且伤害+1。",
yinjiang_shuying: "饮江",
yinjiang_shuying_info: "锁定技,当你在出牌阶段摸牌后,获得牌堆底的1张牌。若该牌为红色,则对所有敌方角色造成1点伤害。当你在同一个阶段内以此法造成过两次活更多的伤害后,该技能失效直到回合结束。",
zhuri_shuying: "逐日",
zhuri_shuying_info: "锁定技,你使用红色牌时摸1张牌。当你成为【杀】或普通锦囊牌的目标后,结算完毕后将该牌放置在牌堆底。",
shaohao_boss_shuying: "少昊",
baiyi_shuying: "白仪",
baiyi_shuying_info: "锁定技,每名敌方角色的回合开始时,若当前轮数小于3,你随机获得其1张牌;若当前轮数小于5,对其造成1点雷电伤害;若当前轮数小于7,其随机弃置1张牌。",
shenen_shuying: "神恩",
shenen_shuying_info: "锁定技,所有己方角色使用牌锁定技,所有己方角色使用牌没有距离限制。",
xuannv_boss_shuying: "玄女",
xuanlie_shuying: "玄烈",
xuanlie_shuying_info: "锁定技,回合结束时,对所有本回合你获得过其牌的敌方角色依次造成1点伤害。",
jiutian_shuying: "九天",
jiutian_shuying_info: "锁定技,准备阶段,你获得所有敌方角色各1张手牌。若你以此法获得的牌包含2种颜色,则对所有你以此法获得其牌的敌方角色造成1点伤害。",
dishi_shuying: "帝师",
dishi_shuying_info: "当你使用【杀】或普通锦囊牌指定目标时,如果目标数为1,可以增加一个目标;如果目标数大于1,你可以减少一个目标。",
hanba_boss_shuying: "旱魃",
xinji_shuying: "心悸",
xinji_shuying_info: "锁定技,当友方于回合外因弃置而失去手牌时,你对当前角色造成1点伤害。",
zhiri_shuying: "炙日",
zhiri_shuying_info: "锁定技,当敌方角色使用红色锦囊牌指定目标后,你摸1张牌。",
fenshi_shuying: "焚世",
fenshi_shuying_info: "锁定技,准备阶段,若你的手牌数小于体力值,则将手牌摸至于体力值相等;若你的手牌数大于体力值,则你对敌方角色造成共计X点伤害,点数随机分配(X为手牌数减体力值)。",
};
export default translates;
+50
View File
@@ -0,0 +1,50 @@
const characters = {
heibaiwuchang_boss_shuying:
{
sex: "male",
group: "qun",
hp: 4,
skills: ["mizui_shuying", "qiangzheng_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/heibaiwuchang_boss_shuying.png"
},
niutoumamian_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["shiyv_shuying", "manji_shuying", "xiaoshou_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/niutoumamian_boss_shuying.png"
},
yvsai_boss_shuying: {
sex: "female",
group: "qun",
hp: 4,
skills: ["anchao_shuying", "guixi_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/yvsai_boss_shuying.png"
},
huangfeng_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["mingchong_shuying", "duzhen_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/huangfeng_boss_shuying.png"
},
riyeyoushen_boss_shuying: {
sex: "male",
group: "qun",
hp: 4,
skills: ["huiyun_shuying", "yezhong_shuying", "zhoucha_shuying"],
isHiddenBoss: true,
isBossAllowed: true,
img: "extension/术樱包/pve/images/捉鬼驱邪/riyeyoushen_boss_shuying.png"
},
};
export default characters;
@@ -0,0 +1,74 @@
import { getTianshuDifficulty } from "../../shared.js";
const dynamicTranslates = {
//黑白无常
mizui_shuying(player, skill) {
const num = getTianshuDifficulty() == "normal" ? 1 : 2
return `锁定技,你的伤害牌造成伤害后,你随机弃置受伤角色的${num}张牌。`
},
qiangzheng_shuying(player, skill) {
let num = 2;
if (getTianshuDifficulty() == "hard") num = 4;
if (getTianshuDifficulty() == "nightmare") num = 6;
return `锁定技,敌方角色的结束阶段,若其手牌数小于${num},你获得其所有手牌。`
},
xixing_shuying(player, skill) {
const difficulty = getTianshuDifficulty();
if (difficulty == "nightmare") {
return "锁定技,准备阶段,你对每名敌方角色各造成2点雷电伤害,然后你回复等量体力";
}
return "锁定技,准备阶段,随机对敌方体力最多的一名角色造成2点雷电伤害,然后你回复等量体力。";
},
//鱼鳃
guixi_shuying(player, skill) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1
return `锁定技,当你受到伤害后,你进行一次判定,若结果为红色,你回复1点体力;若结果不为红色,你摸${num}张牌。`;
},
//黄蜂
mingchong_shuying(player, skill) {
if (getTianshuDifficulty() == "nightmare") {
return "锁定技,你死亡时,杀死你的角色弃置所有牌。"
}
return "锁定技,你死亡时,杀死你的角色随机弃置一半的牌。"
},
duzhen_shuying(player, skill) {
if (getTianshuDifficulty() == "nightmare") {
return "锁定技,你使用牌指定单一敌方角色为目标后,该角色随机弃置1张牌(优先装备区的牌)。"
}
return "锁定技,你使用牌指定单一敌方角色为目标后,该角色随机弃置2张牌(优先装备区的牌)。"
},
//日夜游神
huiyun_shuying(player, skill) {
const num = getTianshuDifficulty() == "normal" ? 1 : 2
return `出牌阶段限一次,你可以展示一名敌方角色的手牌,并弃置其中至多两张牌。然后你可以弃置一张与该角色弃置牌牌名相同的牌,对其造成${num}点伤害。`
},
yezhong_shuying(player, skill) {
let num = 1;
if (getTianshuDifficulty() == "hard") num = 2;
if (getTianshuDifficulty() == "nightmare") num = 3;
return `锁定技,结束阶段,你进行一次判定并获得判定牌,若次牌为黑色,每名敌方角色随机弃${num}张手牌。`
},
zhoucha_shuying(player, skill) {
let num = 1;
if (getTianshuDifficulty() == "hard") num = 2;
if (getTianshuDifficulty() == "nightmare") num = 3;
return `锁定技,准备阶段,你进行一次判定并获得判定牌,若此牌为红色,你本回合使用【杀】的次数+${num}。`
},
};
export default dynamicTranslates;
+570
View File
@@ -0,0 +1,570 @@
import { lib, game, ui, get, ai, _status, getTianshuDifficulty } from "../../shared.js";
const skills = {
//黑白无常 over
mizui_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { source: "damageEnd" },
forced: true,
filter(event, player) {
return event.player?.isIn() && event.player.countDiscardableCards(player, "he") > 0 && event.card && get.is.damageCard(event.card);
},
async content(event, trigger, player) {
const num = getTianshuDifficulty() == "normal" ? 1 : 2;
player.line(trigger.player);
await player.discardPlayerCard(trigger.player, num, "he", true);
},
ai: { expose: 0.2 },
},
qiangzheng_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { global: "phaseEnd" },
forced: true,
logTarget: "player",
filter(event, player) {
let num = 2;
if (getTianshuDifficulty() == "hard") num = 4;
if (getTianshuDifficulty() == "nightmare") num = 6;
return event.player?.isIn() && player.getEnemies(null, false).includes(event.player) && event.player.countCards("h") > 0 && event.player.countCards("h") < num;
},
async content(event, trigger, player) {
player.line(trigger.player);
await player.gain(trigger.player.getCards("h"), trigger.player, "giveAuto");
},
},
xixing_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
filter(event, player) {
return player.getEnemies(null, false).some(target => target.isIn());
},
async content(event, trigger, player) {
const enemies = player.getEnemies(null, false).filter(target => target.isIn());
if (difficulty == "nightmare") {
for (const target of enemies) {
player.line(target, "thunder");
await target.damage(2, "thunder", player);
}
} else {
const max = Math.max(...enemies.map(target => target.hp));
const target = enemies.filter(target => target.hp == max).randomGet();
player.line(target, "thunder");
await target.damage(2, "thunder", player);
}
await player.recover(2);
},
},
taiping_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "damageEnd" },
forced: true,
locked: true,
logTarget: "source",
filter(event, player) {
return (
event.num > 0 &&
event.source?.isIn() &&
player.getEnemies(null, false).includes(event.source)
);
},
async content(event, trigger, player) {
const source = trigger.source;
player.line(source);
const result = await source
.chooseToDiscard("h", 2, `太平:弃置两张花色不同的手牌,否则失去1点体力`, card => {
const cards = ui.selected.cards;
return !cards.some(cardx => get.suit(cardx) == get.suit(card));
})
.set("ai", card => {
const player = get.player();
if (player.hp <= 1) return 8 - get.value(card);
return 6 - get.value(card);
})
.forResult();
if (!result.bool) {
await source.loseHp();
}
},
ai: {
maixie_defend: true,
effect: {
target(card, player, target) {
if (get.tag(card, "damage") && target.getEnemies(null, false).includes(player)) {
if (player.countCards("h") < 2) return [1, -1];
return [1, 0.4];
}
},
},
},
},
//牛头马面
shiyv_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "phaseDrawBegin2" },
forced: true,
filter(event, player) {
return !event.numFixed;
},
async content(event, trigger, player) {
trigger.num = 0;
const cards = [];
for (const suit of lib.suit) {
const card = get.cardPile(card => get.suit(card) == suit, "cardPile", "random");
if (card) cards.push(card);
}
if (cards.length) await player.gain(cards, "gain2");
},
},
manji_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "useCardToPlayered" },
filter(event, player) {
return event.card.name == "sha" && event.targets?.length == 1 && player.getEnemies(null, false).includes(event.target) && event.target.countDiscardableCards(player, "h") > 0;
},
async cost(event, trigger, player) {
event.result = await player.chooseBool(get.prompt(event.skill, trigger.target))
.set("ai", () => get.attitude(get.player(), get.event().getTrigger().target) < 0)
.forResult();
},
async content(event, trigger, player) {
const target = trigger.target;
player.line(target);
const cards = target.getCards("h").randomGets(Math.min(2, target.countCards("h")));
await target.discard(cards);
if (cards.some(card => get.name(card, target) == "sha")) trigger.getParent().baseDamage++;
},
ai: { expose: 0.2 },
},
xiaoshou_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
filter(event, player) {
return player.getEnemies(null, false).some(target => target.isIn());
},
async content(event, trigger, player) {
const target = player.getEnemies(null, false).filter(target => target.isIn()).randomGet();
player.line(target);
await target.damage(2, player);
},
},
//鱼鳃 over
anchao_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
forced: true,
locked: true,
group: ["anchao_shuying_gain", "anchao_shuying_start"],
marktext: "潮",
intro: {
name: "暗潮",
content: "mark",
},
subSkill: {
gain: {
audio: "anchao_shuying",
trigger: { global: "phaseJieshuBegin" },
forced: true,
logTarget: "player",
filter(event, player) {
return (
event.player?.isIn() &&
!player.getEnemies(null, false).includes(event.player) &&
!event.player.getHistory("sourceDamage", evt => evt.num > 0).length
);
},
async content(event, trigger, player) {
trigger.player.addMark("anchao_shuying", 1);
},
},
start: {
audio: "anchao_shuying",
trigger: { global: "phaseBegin" },
forced: true,
logTarget: "player",
filter(event, player) {
return (
event.player?.isIn() &&
!player.getEnemies(null, false).includes(event.player) &&
event.player.countMark("anchao_shuying") > 0
);
},
async content(event, trigger, player) {
const target = trigger.player;
target.storage.anchao_shuying_effect = target.countMark("anchao_shuying");
target.addTempSkill("anchao_shuying_effect", { player: "phaseAfter" });
},
},
effect: {
charlotte: true,
group: ["anchao_shuying_draw", "anchao_shuying_damage"],
onremove(player) {
delete player.storage.anchao_shuying_effect;
},
},
draw: {
audio: "anchao_shuying",
trigger: { player: "phaseDrawBegin2" },
forced: true,
filter(event, player) {
return !event.numFixed && player.storage.anchao_shuying_effect > 0;
},
async content(event, trigger, player) {
trigger.num += player.storage.anchao_shuying_effect;
},
},
damage: {
audio: "anchao_shuying",
trigger: { source: "damageBegin1" },
forced: true,
filter(event, player) {
return (
player.storage.anchao_shuying_effect > 0 &&
event.player?.isIn() &&
player.getEnemies(null, false).includes(event.player)
);
},
async content(event, trigger, player) {
trigger.num += player.storage.anchao_shuying_effect;
},
},
},
ai: {
threaten: 2,
},
},
guixi_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "damageEnd" },
forced: true,
locked: true,
filter(event, player) {
return event.num > 0;
},
async content(event, trigger, player) {
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1;
const result = await player
.judge(card => get.color(card) == "red" ? 2 : 0)
.set("judge2", result => result.bool)
.forResult();
if (result.bool && player.isDamaged()) {
await player.recover();
}
else {
await player.draw(num);
}
},
ai: {
maixie: true,
maixie_hp: true,
effect: {
target(card, player, target) {
if (get.tag(card, "damage")) {
if (player.hasSkillTag("jueqing", false, target)) return [1, -1];
return [1, 0.7];
}
},
},
},
},
//黄蜂 over
mingchong_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "die" },
forced: true,
locked: true,
forceDie: true,
logTarget: "source",
filter(event, player) {
return event.source?.isIn() && event.source.countDiscardableCards(player, "he") > 0;
},
async content(event, trigger, player) {
const source = trigger.source;
player.line(source);
const cards = source
.getCards("he")
.filter(card => lib.filter.cardDiscardable(card, source, "mingchong_shuying"));
if (cards.length) {
if (getTianshuDifficulty() == "nightmare") {
await source.discard(cards);
}
else {
await source.discard(cards.randomGets(Math.ceil(cards.length / 2)));
}
}
},
ai: {
threaten: 0.8,
effect: {
target(card, player, target) {
if (get.tag(card, "damage") && target.hp <= 1 && player.countCards("he") > 2) {
return [1, -0.8];
}
},
},
},
},
duzhen_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "useCardToPlayered" },
forced: true,
locked: true,
logTarget: "target",
filter(event, player) {
return (
event.targets?.length == 1 &&
event.target?.isIn() &&
player.getEnemies(null, false).includes(event.target) &&
event.target.countDiscardableCards(player, "he") > 0
);
},
async content(event, trigger, player) {
const target = trigger.target;
const num = getTianshuDifficulty() == "nightmare" ? 2 : 1;
const cards = [];
player.line(target);
const equips = target
.getCards("e")
.filter(card => lib.filter.cardDiscardable(card, target, "duzhen_shuying"))
.randomGets(num);
cards.addArray(equips);
if (cards.length < num) {
const hands = target
.getCards("h")
.filter(card => lib.filter.cardDiscardable(card, target, "duzhen_shuying"))
.randomGets(num - cards.length);
cards.addArray(hands);
}
if (cards.length) {
await target.discard(cards);
}
},
ai: {
threaten: 1.8,
effect: {
player_use(card, player, target) {
if (target && player.getEnemies(null, false).includes(target) && target.countCards("he") > 0) {
return [1, 0.5];
}
},
},
},
},
//日夜游神 over
huiyun_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
enable: "phaseUse",
usable: 1,
filter(event, player) {
return player.getEnemies(null, false).some(target => target.isIn() && target.countCards("h") > 0);
},
filterTarget(card, player, target) {
return target.isIn() && player.getEnemies(null, false).includes(target) && target.countCards("h") > 0;
},
async content(event, trigger, player) {
const target = event.targets[0];
const hs = target.getCards("h");
player.line(target);
await target.showCards(hs, `${get.translation(player)}对${get.translation(target)}发动了【${get.translation(event.name)}】`);
const result = await player
.choosePlayerCard(target, "h", [1, 2], `弃置${get.translation(target)}至多两张手牌`)
.set("filterButton", button => {
const player = get.player();
const target = get.event().target;
return lib.filter.canBeDiscarded(button.link, player, target);
})
.set("ai", button => {
const card = button.link;
const player = get.player();
const target = get.event().target;
let value = get.value(card, target);
if (get.name(card, target) == "tao") value += 3;
if (get.name(card, target) == "shan") value += 1;
return value;
})
.set("target", target)
.forResult();
if (!result.bool || !result.cards?.length) return;
const names = result.cards.map(card => get.name(card, target)).unique();
await target.discard(result.cards);
if (!target.isIn()) return;
const result2 = await player
.chooseToDiscard("he", `是否弃置一张同名牌,对${get.translation(target)}造成2点伤害?`, card => {
return get.event().names.includes(get.name(card));
})
.set("names", names)
.set("ai", card => {
const player = get.player();
const target = get.event().target;
if (!player.getEnemies(null, false).includes(target)) return 0;
const effect = get.damageEffect(target, player, player);
if (effect <= 0) return 0;
return effect * 3 - get.value(card);
})
.set("target", target)
.forResult();
if (result2.bool) {
const num = getTianshuDifficulty() == "normal" ? 1 : 2
player.line(target);
await target.damage(num, player);
}
},
ai: {
order: 5,
result: {
target(player, target) {
if (!player.getEnemies(null, false).includes(target)) return 0;
return -Math.min(2, target.countCards("h"));
},
},
threaten: 1.6,
},
},
yezhong_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "phaseJieshuBegin" },
forced: true,
locked: true,
async content(event, trigger, player) {
const result = await player
.judge(card => get.color(card) == "black" ? 2 : -1)
.set("judge2", result => result.bool)
.forResult();
if (result.card) {
await player.gain(result.card, "gain2");
}
if (result.bool) {
let num = 1;
if (getTianshuDifficulty() == "hard") num = 2;
if (getTianshuDifficulty() == "nightmare") num = 3;
const targets = player.getEnemies(null, false).filter(target => target.isIn() && target.countCards("h") > 0);
for (const target of targets) {
player.line(target);
const cards = target
.getCards("h")
.filter(card => lib.filter.cardDiscardable(card, target, "yezhong_shuying"))
.randomGets(num);
if (cards.length) {
await target.discard(cards);
}
}
}
},
ai: {
threaten: 1.8,
},
},
zhoucha_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { player: "phaseZhunbeiBegin" },
forced: true,
locked: true,
async content(event, trigger, player) {
const result = await player
.judge(card => get.color(card) == "red" ? 2 : -1)
.set("judge2", result => result.bool)
.forResult();
if (result.card) {
await player.gain(result.card, "gain2");
}
if (result.bool) {
player.addTempSkill("zhoucha_shuying_effect", { player: "phaseAfter" });
}
},
subSkill: {
effect: {
charlotte: true,
mod: {
cardUsable(card, player, num) {
let number = 1;
if (getTianshuDifficulty() == "hard") number = 2;
if (getTianshuDifficulty() == "nightmare") number = 3;
if (card.name == "sha") return num + number;
},
},
},
},
ai: {
threaten: 1.4,
},
},
duane_shuying: {
mode: ["boss"],
audio: "ext:术樱包/pve/audio/skill/驱鬼逐邪:1",
trigger: { global: "phaseDiscardEnd" },
forced: true,
locked: true,
logTarget: "player",
filter(event, player) {
const target = event.player;
return (
target?.isIn() &&
player.getEnemies(null, false).includes(target) &&
target.getHistory("lose", evt => {
return (
evt.type == "discard" &&
evt.getParent("phaseDiscard") == event &&
evt.cards2?.some(card => get.color(card, target) == "black")
);
}).length
);
},
async content(event, trigger, player) {
const target = trigger.player;
player.line(target);
await target.loseHp(2);
},
ai: {
threaten: 1.5,
},
},
};
export default skills;
+45
View File
@@ -0,0 +1,45 @@
const translates = {
heibaiwuchang_boss_shuying: "黑白无常",
mizui_shuying: "迷醉",
mizui_shuying_info: "锁定技,你的伤害牌造成伤害后,你随机弃置受伤角色的1张牌。",
qiangzheng_shuying: "强征",
qiangzheng_shuying_info: "锁定技,敌方角色的结束阶段,若其手牌数小于4,你获得其所有手牌。",
xixing_shuying: "吸星",
xixing_shuying_info: "锁定技,准备阶段,随机对敌方体力最多的一名角色造成2点雷电伤害,然后你回复等量体力",
taiping_shuying: "太平",
taiping_shuying_info: "锁定技,当你受到敌方角色造成的伤害后,伤害来源须弃置两张花色不同的手牌,否则失去1点体力。",
niutoumamian_boss_shuying: "牛头马面",
shiyv_shuying: "施狱",
shiyv_shuying_info: "锁定技,摸牌阶段,你放弃摸牌改为随机获得牌堆中每种花色的牌各一张。",
manji_shuying: "蛮击",
manji_shuying_info: "你使用【杀】指定单一目标后,你可以弃置该角色2张手牌。若其中有【杀】,你本次【杀】造成的伤害+1。",
xiaoshou_shuying: "枭首",
xiaoshou_shuying_info: "锁定技,准备阶段,你对随机一名敌方角色造成2点伤害",
yvsai_boss_shuying: "鱼鳃",
anchao_shuying: "暗潮",
anchao_shuying_info: "锁定技,己方角色的回合结束时,若此回合该角色没有造成过伤害,则获得一个“暗潮”标记。己方回合开始时,若该角色有“暗潮”标记,则本回合摸牌阶段多摸X张牌且对敌方角色造成的伤害+X(X为“暗潮”标记数)",
guixi_shuying: "鬼吸",
guixi_shuying_info: "锁定技,当你受到伤害后,你进行一次判定,若结果为红色,你回复1点体力;若结果不为红色,你摸1张牌。",
huangfeng_boss_shuying: "黄蜂",
mingchong_shuying: "冥虫",
mingchong_shuying_info: "锁定技,你死亡时,杀死你的角色随机弃置一半的牌。",
duzhen_shuying: "毒针",
duzhen_shuying_info: "锁定技,你使用牌指定单一敌方角色为目标后,该角色随机弃置1张牌(优先装备区的牌)。",
riyeyoushen_boss_shuying: "日夜游神",
huiyun_shuying: "晦运",
huiyun_shuying_info: "出牌阶段限一次,你可以展示一名敌方角色的手牌,并弃置其中至多两张牌。然后你可以弃置一张与该角色弃置牌牌名相同的牌,对其造成2点伤害。",
yezhong_shuying: "夜冢",
yezhong_shuying_info: "锁定技,结束阶段,你进行一次判定并获得判定牌,若次牌为黑色,每名敌方角色随机弃1张手牌。",
zhoucha_shuying: "昼刹",
zhoucha_shuying_info: "锁定技,准备阶段,你进行一次判定并获得判定牌,若此牌为红色,你本回合使用【杀】的次数+1。",
duane_shuying: "断恶",
duane_shuying_info: "锁定技,敌方角色的弃牌阶段结束时,若其此阶段弃置了黑色牌,则该角色失去2点体力。",
};
export default translates;
+9
View File
@@ -0,0 +1,9 @@
import { lib, game, ui, get, ai, _status } from "../../../../noname.js";
import tianshuConfig from "../../tianshu/config.js";
// 统一提供活动 BOSS 技能依赖与天书难度,避免各主题模块重复维护加载路径。
const getTianshuDifficulty = () => {
return _status[tianshuConfig.settings.difficultyStatusKey] || "normal";
};
export { lib, game, ui, get, ai, _status, getTianshuDifficulty };
+13 -2116
View File
File diff suppressed because it is too large Load Diff
+12 -150
View File
@@ -1,153 +1,15 @@
const translates = {
zishu_boss_shuying: "子鼠",
zishu_shuying: "子鼠",
zishu_shuying_info: "出牌阶段限一次,你可以获得手牌数大于你的其他角色一张手牌,你可以重复此流程,直到你的手牌数为全场最多。",
import shiershengxiao from "./sets/shiershengxiao/translate.js";
import zhuoguiquxie from "./sets/zhuoguiquxie/translate.js";
import qingqingzijin from "./sets/qingqingzijin/translate.js";
import tianshu from "./sets/tianshu/translate.js";
import mergeBossModules from "./merge.js";
chenlong_boss_shuying: "辰龙",
chenlong_shuying: "辰龙",
chenlong_shuying_info: "限定技,出牌阶段,你可以失去任意点体力(至多为5),然后对一名其他角色造成等量的伤害。若你以此法进入濒死状态,则你将体力值回复至1,然后减少1点体力上限。",
wuma_boss_shuying: "午马",
wuma_shuying: "午马",
wuma_shuying_info: "锁定技,你不能被翻面;你的阶段不能被跳过;当你成为其他角色使用锦囊牌的目标后,摸一张牌。",
weiyang_boss_shuying: "未羊",
weiyang_shuying: "未羊",
weiyang_shuying_info: "出牌阶段限一次,你可以弃置任意张不同类型的牌,然后令至多等量角色回复1点体力。",
shenhou_boss_shuying: "申猴",
shenhou_shuying: "申猴",
shenhou_shuying_info: "当你成为【杀】的目标时,你可以进行判定,若结果为红色,则此【杀】对你无效。",
xvgou_boss_shuying: "戌狗",
xvgou_shuying: "戌狗",
xvgou_shuying_info: "锁定技,红色【杀】对你无效;你使用红色【杀】无距离限制且造成伤害+1.",
heibaiwuchang_boss_shuying: "黑白无常",
mizui_shuying: "迷醉",
mizui_shuying_info: "锁定技,你的伤害牌造成伤害后,你随机弃置受伤角色的1张牌。",
qiangzheng_shuying: "强征",
qiangzheng_shuying_info: "锁定技,敌方角色的结束阶段,若其手牌数小于4,你获得其所有手牌。",
xixing_shuying: "吸星",
xixing_shuying_info: "锁定技,准备阶段,随机对敌方体力最多的一名角色造成2点雷电伤害,然后你回复等量体力",
niutoumamian_boss_shuying: "牛头马面",
shiyv_shuying: "施狱",
shiyv_shuying_info: "锁定技,摸牌阶段,你放弃摸牌改为随机获得牌堆中每种花色的牌各一张。",
manji_shuying: "蛮击",
manji_shuying_info: "你使用【杀】指定单一目标后,你可以弃置该角色2张手牌。若其中有【杀】,你本次【杀】造成的伤害+1。",
xiaoshou_shuying: "枭首",
xiaoshou_shuying_info: "锁定技,准备阶段,你对随机一名敌方角色造成2点伤害",
yvsai_boss_shuying: "鱼鳃",
anchao_shuying: "暗潮",
anchao_shuying_info: "锁定技,己方角色的回合结束时,若此回合该角色没有造成过伤害,则获得一个“暗潮”标记。己方回合开始时,若该角色有“暗潮”标记,则本回合摸牌阶段多摸X张牌且对敌方角色造成的伤害+X(X为“暗潮”标记数)",
guixi_shuying: "鬼吸",
guixi_shuying_info: "锁定技,当你受到伤害后,你进行一次判定,若结果为红色,你回复1点体力;若结果不为红色,你摸1张牌。",
huangfeng_boss_shuying: "黄蜂",
mingchong_shuying: "冥虫",
mingchong_shuying_info: "锁定技,你死亡时,杀死你的角色随机弃置一半的牌。",
duzhen_shuying: "毒针",
duzhen_shuying_info: "锁定技,你使用牌指定单一敌方角色为目标后,该角色随机弃置1张牌(优先装备区的牌)。",
riyeyoushen_boss_shuying: "日夜游神",
huiyun_shuying: "晦运",
huiyun_shuying_info: "出牌阶段限一次,你可以展示一名敌方角色的手牌,并弃置其中至多两张牌。然后你可以弃置一张与该角色弃置牌牌名相同的牌,对其造成2点伤害。",
yezhong_shuying: "夜冢",
yezhong_shuying_info: "锁定技,结束阶段,你进行一次判定并获得判定牌,若次牌为黑色,每名敌方角色随机弃1张手牌。",
zhoucha_shuying: "昼刹",
zhoucha_shuying_info: "锁定技,准备阶段,你进行一次判定并获得判定牌,若此牌为红色,你本回合使用【杀】的次数+1。",
duane_shuying: "断恶",
duane_shuying_info: "锁定技,敌方角色的弃牌阶段结束时,若其此阶段弃置了黑色牌,则该角色失去2点体力。",
caocao_boss_shuying: "曹操",
jianxiong_shuying: "奸雄",
jianxiong_shuying_info: "当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。",
lingba_shuying: "凌霸",
lingba_shuying_info: "锁定技,你的回合开始时,若你手牌数为全场最多,则对一名随机敌人造成1点伤害。若你手牌数大于等于你体力值的两倍,则改为对所有敌人造成伤害。",
yishen_shuying: "疑神",
yishen_shuying_info: "当你回复体力时,可以改为获得一名随机敌方角色一张随机装备。",
simayi_boss_shuying: "司马懿",
fankui_shuying: "反馈",
fankui_shuying_info: "当你受到1点伤害后,你可以获得伤害来源的一张牌。",
guicai_shuying: "鬼才",
guicai_shuying_info: "当一名角色的判定牌生效前,你可以打出一张牌代替之。",
langgu_shuying: "狼顾",
langgu_shuying_info: " 锁定技,每回合限一次,当你获得其他角色的牌时,进行一次判定:若结果为黑桃,随机弃置其1张手牌,且视为此技能本回合未发动过。",
yuanlv_shuying: "远虑",
yuanlv_shuying_info: "当你使用锦囊牌对敌方角色造成伤害时,你可以防止该伤害,改为摸一张牌且该敌方角色对你造成1点伤害。",
lvbu_boss_shuying: "吕布",
wushuang_shuying: "无双",
wushuang_shuying_info: "锁定技。①你使用的【杀】需两张【闪】才能抵消;与你进行【决斗】的角色每次需要打出两张【杀】。②每回合限1次,当你使用【杀】或【决斗】造成伤害时,若受伤角色没有使用或打出过【杀】或【闪】响应此牌,则此伤害+1。",
shenij_shuying: "神戟",
shenij_shuying_info: "判定阶段,你可以弃置两张手牌,然后弃置你判定区里的牌;摸牌阶段,你多摸两张牌;出牌阶段,你可以多使用一张【杀】,你的【杀】可以多指定一名角色为目标。",
zhanjia_shuying: "战甲",
zhanjia_shuying_info: "锁定技,每回合限一次,当你受到大于2点的伤害时,将此伤害减至2点,然后摸两张牌。",
dongzhuo_boss_shuying: "董卓",
jiuchi_shuying: "酒池",
jiuchi_shuying_info: "你可以将一张黑桃手牌当【酒】使用。",
roulin_shuying: "肉林",
roulin_shuying_info: "锁定技,你对女性角色使用的【杀】和女性角色对你使用的【杀】均需使用两张【闪】才能抵消。",
baonue_shuying: "暴虐",
baonue_shuying_info: "锁定技,回合开始时,你摸X张牌并对至多X名角色造成1点伤害,然后你失去1点体力。X为你已损失体力且最大为3。",
qubu_shuying: "驭布",
qubu_shuying_info: "锁定技,当友方角色使用【杀】指定目标时,进行一次判定:若结果为黑桃,你对此【杀】的所有目标造成1点伤害。",
shuishengonggong_boss_shuying: "水神共工",
shuishen_shuying: "水神",
shuishen_shuying_info: "锁定技,弃牌堆中,不同牌名的牌数达到4时,你回复体力时回复量+1;达到5时,摸牌阶段额外摸5张牌;达到9时,你造成伤害时伤害+1。",
tuanliu_shuying: "湍流",
tuanliu_shuying_info: "锁定技,结束阶段,若本回合进入弃牌堆的卡牌数量:大于4,你回复2点体力;大于5,你摸4张牌;大于9,你对所有敌方角色造成1点伤害。",
juehong_shuying: "决洪",
juehong_shuying_info: "锁定技,准备阶段,你令所有敌方角色自己弃置自己的装备区内的所有牌,若其装备区内没有牌,则改为随机弃置2张手牌",
baiqi_boss_shuying: "白起",
changsheng_shuying: "常胜",
changsheng_shuying_info: "锁定技,你使用【杀】无距离限制。",
shashen_shuying: "杀神",
shashen_shuying_info: "你可以将手牌中的任意牌当【杀】使用或打出。你使用的【杀】造成伤害后,摸三张牌。",
wuan_shuying: "武安",
wuan_shuying_info: "锁定技,你可使用的【杀】的次数+3,【杀】造成的伤害+1。",
kuafu_boss_shuying: "盘古",
shenqu_shuying: "神躯",
shenqu_shuying_info: "锁定技,当你受到伤害后,将所有红色手牌置于牌堆底,并摸等量的牌。",
lieben_shuying: "烈奔",
lieben_shuying_info: "锁定技,当你使用【杀】指定目标后,使用牌堆底的牌进行一次判定:若判定结果为红色,则此杀不计入出牌阶段使用次数且伤害+1。",
yinjiang_shuying: "饮江",
yinjiang_shuying_info: "锁定技,当你在出牌阶段摸牌后,获得牌堆底的1张牌。若该牌为红色,则对所有敌方角色造成1点伤害。当你在同一个阶段内以此法造成过两次活更多的伤害后,该技能失效直到回合结束。",
zhuri_shuying: "逐日",
zhuri_shuying_info: "锁定技,你使用红色牌时摸1张牌。当你成为【杀】或普通锦囊牌的目标后,结算完毕后将该牌放置在牌堆底。",
shaohao_boss_shuying: "少昊",
baiyi_shuying: "白仪",
baiyi_shuying_info: "锁定技,每名敌方角色的回合开始时,若当前轮数小于3,你随机获得其1张牌;若当前轮数小于5,对其造成1点雷电伤害;若当前轮数小于7,其随机弃置1张牌。",
shenen_shuying: "神恩",
shenen_shuying_info: "锁定技,所有己方角色使用牌锁定技,所有己方角色使用牌没有距离限制。",
xuannv_boss_shuying: "玄女",
xuanlie_shuying: "玄烈",
xuanlie_shuying_info: "锁定技,回合结束时,对所有本回合你获得过其牌的敌方角色依次造成1点伤害。",
jiutian_shuying: "九天",
jiutian_shuying_info: "锁定技,准备阶段,你获得所有敌方角色各1张手牌。若你以此法获得的牌包含2种颜色,则对所有你以此法获得其牌的敌方角色造成1点伤害。",
dishi_shuying: "帝师",
dishi_shuying_info: "当你使用【杀】或普通锦囊牌指定目标时,如果目标数为1,可以增加一个目标;如果目标数大于1,你可以减少一个目标。",
hanba_boss_shuying: "旱魃",
xinji_shuying: "心悸",
xinji_shuying_info: "锁定技,当友方于回合外因弃置而失去手牌时,你对当前角色造成1点伤害。",
zhiri_shuying: "炙日",
zhiri_shuying_info: "锁定技,当敌方角色使用红色锦囊牌指定目标后,你摸1张牌。",
fenshi_shuying: "焚世",
fenshi_shuying_info: "锁定技,准备阶段,若你的手牌数小于体力值,则将手牌摸至于体力值相等;若你的手牌数大于体力值,则你对敌方角色造成共计X点伤害,点数随机分配(X为手牌数减体力值)。",
};
// 汇总所有主题翻译,并阻止同名翻译在后加载模块中被覆盖。
const translates = mergeBossModules("翻译", [
["十二生肖", shiershengxiao],
["捉鬼驱邪", zhuoguiquxie],
["青青子衿", qingqingzijin],
["天书乱斗", tianshu],
]);
export default translates;