Release Healer Man 0.1.45

This commit is contained in:
phenom committed 2026-09-15 14:43:15 -04:00
1 parent 756ee4f64a
commit f82daf1c13
242 files changed
+1440 -101

No files matched your search

+103 -4
View File
@@ -560,23 +560,122 @@ describe("generated dungeon campaign catalog", () => {
dungeonId: string,
bossName: string,
attackName: string,
): { readonly effect?: unknown } | undefined => {
): { readonly damageMultiplier: number; readonly effect?: unknown } | undefined => {
const dungeon = generated.definitions.find((candidate) => candidate.id === dungeonId);
const entity = Object.values(dungeon?.entities ?? {}).find(
(candidate) => candidate.name === bossName,
) as undefined | {
readonly combat: {
readonly attacks: ReadonlyArray<{ readonly name: string; readonly effect?: unknown }>;
readonly attacks: ReadonlyArray<{
readonly name: string;
readonly damageMultiplier: number;
readonly effect?: unknown;
}>;
};
};
return entity?.combat.attacks.find((attack) => attack.name === attackName);
};
expect(attackFor("forge-of-souls", "Bronjahm", "Fear")).toMatchObject({
effect: { kind: "control", mechanic: "fear", durationMs: 4_500 },
effect: { kind: "control", mechanic: "fear", durationMs: 3_000 },
});
expect(attackFor("culling-of-stratholme", "Mal'Ganis", "Sleep")).toMatchObject({
effect: { kind: "control", mechanic: "sleep", durationMs: 4_500 },
effect: { kind: "control", mechanic: "sleep", durationMs: 10_000 },
});
expect(attackFor("blackrock-depths", "Warder Stilgiss", "Frostbolt")).toMatchObject({
damageMultiplier: 0,
effect: {
kind: "control",
mechanic: "slow",
durationMs: 8_000,
damageMultiplier: 1.35,
},
});
expect(attackFor("blackrock-depths", "Warder Stilgiss", "Frost Nova")).toMatchObject({
damageMultiplier: 0,
effect: {
kind: "control",
mechanic: "root",
durationMs: 8_000,
damageMultiplier: 0.82,
},
});
expect(attackFor("razorfen-kraul", "Aggem Thorncurse", "Summon Boar Spirit"))
.toMatchObject({
damageMultiplier: 0,
effect: { kind: "summon", creatureEntry: 6021, count: 1 },
});
expect(attackFor("blackrock-depths", "Bael'Gar", "Summon Spawn of Bael'Gar"))
.toMatchObject({
effect: {
kind: "composite",
effects: [
{ kind: "damage", multiplier: 1.35 },
{ kind: "summon", creatureEntry: 9436, count: 1 },
],
},
});
expect(attackFor("shattered-halls", "Grand Warlock Nethekurse", "Death Coil"))
.toMatchObject({
effect: {
kind: "composite",
effects: [
{ kind: "leech", damageMultiplier: 1.35, healMultiplier: 1.35 },
{ kind: "control", mechanic: "fear", durationMs: 4_000 },
],
},
});
expect(attackFor("magisters-terrace", "Kael'thas Sunstrider", "Shock Barrier"))
.toMatchObject({
effect: { kind: "aura", absorbMultiplier: 2.5, durationMs: 10_000 },
});
expect(attackFor("blackrock-spire", "General Drakkisath", "Pierce Armor"))
.toMatchObject({
effect: {
kind: "target-aura",
damageTakenMultiplier: 1.2,
damageSchool: "physical",
},
});
expect(attackFor("culling-of-stratholme", "Mal'Ganis", "Vampiric Touch"))
.toMatchObject({
effect: { kind: "aura", lifeStealPercent: 0.5, durationMs: 30_000 },
});
expect(attackFor("underbog", "The Black Stalker", "Summon Player"))
.toMatchObject({ effect: { kind: "pull", destination: "source" } });
const effectRegressionSpellIds = new Set([
246, 6_016, 7_645, 8_286, 8_398, 8_988, 9_080, 10_061, 10_180, 11_086,
11_700, 12_097, 12_479, 12_480, 12_556, 12_642, 13_323, 13_747, 13_895,
14_515, 14_907, 15_041, 15_044, 15_487, 15_530, 15_572, 15_859,
16_097, 17_235, 17_238, 17_279, 17_503, 17_773, 18_099, 18_327, 20_279, 21_707,
22_714, 30_500, 31_692, 32_358, 32_364, 32_365, 32_371, 32_424, 34_309,
34_557, 35_032, 35_280, 36_931, 36_932, 37_162, 38_245, 44_219, 44_294, 46_165,
49_037, 52_723, 53_030, 53_418, 66_043, 67_534, 67_705, 67_715,
]);
const observedEffectSpellIds = new Set<number>();
for (const dungeon of generated.definitions) {
for (const entity of Object.values(dungeon.entities)) {
if (entity.kind !== "boss") continue;
for (const attack of entity.combat.attacks) {
if (!effectRegressionSpellIds.has(attack.spellId ?? 0)) continue;
expect(attack.effect, `${dungeon.id}:${entity.name}:${attack.name}`).toBeDefined();
observedEffectSpellIds.add(attack.spellId!);
}
}
}
expect([...observedEffectSpellIds].sort((left, right) => left - right))
.toEqual([...effectRegressionSpellIds].sort((left, right) => left - right));
const auxiliarySpellIds = new Set([21_708, 47_669, 54_888]);
for (const dungeon of generated.definitions) {
for (const entity of Object.values(dungeon.entities)) {
if (entity.kind !== "boss") continue;
expect(
entity.combat.attacks.some((attack: { readonly spellId?: number }) => (
auxiliarySpellIds.has(attack.spellId ?? 0)
)),
`${dungeon.id}:${entity.name}:auxiliary-cast`,
).toBe(false);
}
}
expect(
attackFor("escape-from-durnholde", "Captain Skarloc", "Holy Light"),
).toMatchObject({