forked from phenom/healer-man
Release Healer Man 0.1.20
This commit is contained in:
1 parent
d9bebb4e81
commit
699fc858c9
22 files changed
+551
-295
No files matched your search
@@ -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]),
|
||||
|
||||
Reference in new issue
Block a user