fixed # 补全部分卡牌

fixed # 修复部分已知BUG
This commit is contained in:
2026-10-04 19:32:38 +08:00
parent c448da39c2
commit 94a2a6724b
163 changed files with 14008 additions and 1537 deletions
+66
View File
@@ -0,0 +1,66 @@
import { createRaiderTrioBattlePlan } from "./raider-trio.js";
import { createInkletBattlePlan } from "./inklet-group.js";
import { createNibbitPairBattlePlan } from "./nibbit-pair.js";
import { createKinBattlePlan } from "./kin-group.js";
const monsters = Object.freeze({
crawler: "mengsan_fuzzy_wurm_crawler_shuying", nibbit: "mengsan_nibbit_shuying",
shrinker: "mengsan_shrinker_beetle_shuying", leafS: "mengsan_leaf_slime_s_shuying",
leafM: "mengsan_leaf_slime_m_shuying", twigS: "mengsan_twig_slime_s_shuying",
twigM: "mengsan_twig_slime_m_shuying", cubex: "mengsan_cubex_construct_shuying",
flyconid: "mengsan_flyconid_shuying", jaxfruit: "mengsan_snapping_jaxfruit_shuying",
fogmog: "mengsan_fogmog_shuying", mawler: "mengsan_mawler_shuying",
strangler: "mengsan_slithering_strangler_shuying", vine: "mengsan_vine_shambler_shuying",
byrdonis: "mengsan_byrdonis_shuying", effigy: "mengsan_bygone_effigy_shuying",
phrog: "mengsan_phrog_parasite_shuying", vantom: "mengsan_vantom_shuying",
beast: "mengsan_ceremonial_beast_shuying",
});
const group = (id, name, variants, tier = "normal") => ({
id: `act1.encounter.${id}`, name, tier,
variants: variants.map(members => members.map((member, index) => ({
id: `enemy_${index + 1}`, character: monsters[member], camp: "enemy",
tier, hand: 4, inheritSkills: false,
}))),
});
const single = (id, name, member, tier) => group(id, name, [[member]], tier);
const custom = (id, name, createBattlePlan, tier = "normal") => ({id: `act1.encounter.${id}`, name, tier, createBattlePlan});
// 一个条目是一种遭遇;条目中的 variants 等概率选一组,同组成员同时上场。
const weak = [
single("weak.crawler", "毛绒伏地虫", "crawler"),
single("weak.nibbit", "小啃兽", "nibbit"),
single("weak.shrinker", "缩小甲虫", "shrinker"),
group("weak.slimes", "史莱姆三只", [["leafS", "leafM", "twigS"], ["leafS", "twigM", "twigS"]]),
];
const strong = [
single("strong.cubex", "立柱构造体", "cubex"),
group("strong.slimeFlyconid", "中型史莱姆与飞蝇菌子", [["leafM", "flyconid"], ["twigM", "flyconid"]]),
group("strong.jaxfruitFlyconid", "闪光贾克斯果与飞蝇菌子", [["jaxfruit", "flyconid"]]),
single("strong.fogmog", "雾菇", "fogmog"),
custom("strong.inklets", "墨宝三只", createInkletBattlePlan),
single("strong.mawler", "蛮兽", "mawler"),
custom("strong.nibbits", "小啃兽双只", createNibbitPairBattlePlan),
group("strong.shrinkerCrawler", "缩小甲虫与毛绒伏地虫", [["shrinker", "crawler"]]),
custom("strong.raiders", "劫掠者团伙", createRaiderTrioBattlePlan),
group("strong.slimes", "史莱姆四只", [["leafM", "twigM", "leafS", "twigS"]]),
group("strong.stranglerParty", "蛇行扼杀者与同行怪物", [
["jaxfruit", "strangler"], ["leafM", "strangler"], ["twigM", "strangler"],
["leafS", "twigS", "strangler"],
]),
single("strong.vine", "藤蔓蹒跚者", "vine"),
];
const elite = [
single("elite.byrdonis", "多尼斯异鸟", "byrdonis", "elite"),
single("elite.effigy", "旧日雕像", "effigy", "elite"),
single("elite.phrog", "异蛙寄生虫", "phrog", "elite"),
];
const boss = [
single("boss.vantom", "墨影幻灵", "vantom", "boss"),
single("boss.beast", "仪式兽", "beast", "boss"),
custom("boss.kin", "同族神官与两名信徒", createKinBattlePlan, "boss"),
];
export const encounterPools = Object.freeze(Object.fromEntries(
Object.entries({weak, strong, elite, boss}).map(([key, entries]) => [key, Object.freeze(entries.map(entry => entry.id))]),
));
export const encounters = Object.fromEntries([...weak, ...strong, ...elite, ...boss].map(entry => [entry.id, entry]));
+2
View File
@@ -2,9 +2,11 @@ import liubeiOpening, { openingRewards } from "./stories/liubei-opening.js";
import actMap from "./map.js";
import { rewardPools } from "./rewards.js";
import forestAmbush from "./stories/forest-ambush.js";
import { encounters } from "./encounters.js";
export default {
map: actMap,
encounters,
nodeContents: {
[forestAmbush.id]: forestAmbush,
[liubeiOpening.id]: liubeiOpening,
+10
View File
@@ -0,0 +1,10 @@
import { KIN_PRIEST_CHARACTER, KIN_FOLLOWER_CHARACTER } from "../../../monsters/kin-intent.js";
// 一名神官、两名信徒;用角色默认/入场随机HP,不把超过99的神官HP写入关卡覆盖值。
export function createKinBattlePlan() {
return { units: [
{ id: "kin_priest", character: KIN_PRIEST_CHARACTER, camp: "enemy", tier: "boss", hand: 4, inheritSkills: false },
{ id: "kin_follower_1", character: KIN_FOLLOWER_CHARACTER, camp: "enemy", tier: "normal", hand: 4, inheritSkills: false, kinOwner: "kin_priest", after: "kin_priest" },
{ id: "kin_follower_2", character: KIN_FOLLOWER_CHARACTER, camp: "enemy", tier: "normal", hand: 4, inheritSkills: false, kinOwner: "kin_priest", after: "kin_follower_1" },
], rules: [] };
}
+10 -2
View File
@@ -1,6 +1,12 @@
import { encounterPools } from "./encounters.js";
const act1Map = {
id: "act1",
name: "第一关·初梦",
endsCurrentContent: true,
completionDialogue: [
{ type: "narrator", text: "战斗还未完结,等待后续更新。" },
],
floorNodes: [
1, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 1,
@@ -10,6 +16,7 @@ const act1Map = {
3, 3, 3, 3, 3, 3, 3, 1,
],
nodeWeights: { battle: 50, elite: 15, event: 15, rest: 10, shop: 10 },
encounterPools,
requiredFloors: { 2: "battle", 10: "chest", 16: "rest" },
chestRewardPool: "act1.pool.chest",
fixedNodes: [
@@ -27,8 +34,9 @@ const act1Map = {
"mengsan_nibbit_shuying", "mengsan_nibbit_pair_shuying", "mengsan_cubex_construct_shuying", "mengsan_shrinker_beetle_shuying", "mengsan_twig_slime_m_shuying", "mengsan_twig_slime_s_shuying", "mengsan_leaf_slime_m_shuying", "mengsan_leaf_slime_s_shuying", "mengsan_slithering_strangler_shuying", "mengsan_snapping_jaxfruit_shuying", "mengsan_fuzzy_wurm_crawler_shuying",
"mengsan_inklet_shuying",
],
eliteEnemies: ["re_xiahoudun", "re_zhangliao", "re_xuzhu", "mengsan_byrdonis_shuying", "mengsan_bygone_effigy_shuying", "mengsan_phrog_parasite_shuying"],
boss: "re_lvbu",
eliteEnemies: ["mengsan_byrdonis_shuying", "mengsan_bygone_effigy_shuying", "mengsan_phrog_parasite_shuying"],
boss: "mengsan_vantom_shuying",
bossEnemies: ["mengsan_vantom_shuying", "mengsan_kin_priest_shuying", "mengsan_ceremonial_beast_shuying"],
baseGold: 20,
};
@@ -59,6 +59,7 @@ const forestAmbush = {
},
],
rewardPool: "act1.pool.story.scoutGift",
allowSharedCardRewards: true,
rewardTitle: "斥候的谢礼(三选一)",
flags: {
"story.act1.helpedScout": true,
@@ -97,6 +98,7 @@ const forestAmbush = {
],
},
rewardPool: "act1.pool.story.ambushLoot",
allowSharedCardRewards: true,
rewardTitle: "伏兵战利品(三选一)",
description: "击败伏兵后,从随机出现的三个奖励中选择一个。",
},