Release Healer Man 0.1.20

This commit is contained in:
phenom committed 2026-09-06 14:38:59 -04:00
1 parent d9bebb4e81
commit 699fc858c9
22 files changed
+551 -295

No files matched your search

+51
View File
@@ -77,6 +77,57 @@ describe("generated dungeon campaign catalog", () => {
}
});
it("runs Wailing Caverns with the complete server population and authored presentation", () => {
const wailing = requireDungeonDefinition("wailing-caverns");
const runtimePopulation = wailing.staticSpawns.length
+ wailing.roamingPacks.reduce((total, pack) => total + pack.members.length, 0);
expect(runtimePopulation).toBeGreaterThan(250);
expect(wailing.staticSpawns.some((spawn) => spawn.id === "creature-18678")).toBe(true);
expect(wailing.staticSpawns.some((spawn) => spawn.id === "lady-anacondra-spawn")).toBe(true);
expect(wailing.roamingPacks.some((pack) => pack.id === "kresh-patrol")).toBe(true);
expect(wailing.entities["entry-3636"]).toMatchObject({
name: "Deviate Ravager",
combat: { serverEntry: 3636 },
visual: {
model: { url: "/assets/creatures/wailing-caverns/deviate-ravager-animated.glb" },
},
});
});
it("never replaces a generated dungeon with a smaller live population", () => {
for (const source of generated.definitions) {
const runtime = requireDungeonDefinition(source.id);
const sourcePopulation = source.staticSpawns.length
+ source.roamingPacks.reduce((total, pack) => total + pack.members.length, 0);
const runtimePopulation = runtime.staticSpawns.length
+ runtime.roamingPacks.reduce((total, pack) => total + pack.members.length, 0);
expect(runtimePopulation, source.id).toBeGreaterThanOrEqual(sourcePopulation);
}
});
it("preserves source-side random rare spawns without making rare bosses mandatory", () => {
const chanceSpawns = generated.definitions.flatMap((dungeon) => [
...dungeon.staticSpawns.filter((spawn) => "spawnChance" in spawn),
...dungeon.roamingPacks.filter((pack) => "spawnChance" in pack),
]) as unknown as ReadonlyArray<{ readonly spawnChance: number }>;
const optionalBosses = generated.definitions.flatMap((dungeon) => (
dungeon.objectiveOrder.filter((objective) => "optional" in objective && objective.optional)
));
expect(chanceSpawns).toHaveLength(24);
expect(chanceSpawns.every((spawn) => spawn.spawnChance > 0 && spawn.spawnChance < 1)).toBe(true);
expect(optionalBosses.map((boss) => boss.name)).toEqual([
"Earthcaller Halmgar",
"Ragglesnout",
"Crystal Fang",
"Spirestone Battle Lord",
"Spirestone Butcher",
"Meshlok the Harvester",
]);
});
it("reuses each complete optimized map package for dungeons and Manastorms", () => {
const packagesByMap = new Map(
manastormPackages.packages.map((assetPackage) => [assetPackage.mapId, assetPackage]),