forked from phenom/healer-man
Release Healer Man 0.1.45
This commit is contained in:
1 parent
756ee4f64a
commit
f82daf1c13
242 files changed
+1440
-101
No files matched your search
@@ -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({
|
||||
|
||||
Reference in new issue
Block a user