Update Healer Man server

This commit is contained in:
phenom committed 2026-09-28 22:46:45 -04:00
1 parent 9d7e0e2f9e
commit 35dfdaed61
94 files changed
+17034 -418

No files matched your search

+78
View File
@@ -67,6 +67,49 @@ describe("talent runtime modifiers", () => {
]));
});
it("scopes Improved Rejuvenation's effect bonus to Rejuvenation healing", () => {
const improvedRejuvenation = TALENT_NODES.find((node) => node.id === "talent-830")!;
const modifiers = talentModifiersForRanks({ [improvedRejuvenation.id]: 3 }, "druid");
expect(modifiers).toContainEqual(expect.objectContaining({
kind: "healing-percent",
amount: 20,
sourceTalentId: "talent-830",
rank: 3,
}));
expect(applyTalentModifierValue(100, modifiers, "healing-percent", {
abilityName: "Rejuvenation",
tags: ["periodic", "healing", "nature"],
})).toBe(120);
expect(applyTalentModifierValue(100, modifiers, "healing-percent", {
abilityName: "Regrowth",
tags: ["periodic", "healing", "nature"],
})).toBe(100);
});
it("keeps Warrior named-ability damage and cooldown bonuses on their source abilities", () => {
const improvedExecute = TALENT_NODES.find((node) => node.name === "Improved Execute")!;
const executeModifiers = talentModifiersForRanks({ [improvedExecute.id]: 1 }, "warrior");
expect(applyTalentModifierValue(100, executeModifiers, "damage-percent", { abilityName: "Execute" })).toBe(108);
expect(applyTalentModifierValue(100, executeModifiers, "damage-percent", { abilityName: "Heroic Strike" })).toBe(100);
expect(applyTalentModifierValue(15, executeModifiers, "resource-cost-percent", { abilityName: "Heroic Strike" })).toBe(15);
const unrelentingAssault = TALENT_NODES.find((node) => node.name === "Unrelenting Assault")!;
const assaultModifiers = talentModifiersForRanks({ [unrelentingAssault.id]: 1 }, "warrior");
for (const abilityName of ["Overpower", "Revenge"]) {
expect(applyTalentModifierValue(100, assaultModifiers, "damage-percent", { abilityName })).toBeCloseTo(110);
expect(applyTalentModifierValue(10_000, assaultModifiers, "cooldown-flat-ms", { abilityName })).toBe(9_500);
}
expect(applyTalentModifierValue(100, assaultModifiers, "damage-percent", { abilityName: "Bloodthirst" })).toBe(100);
expect(applyTalentModifierValue(10_000, assaultModifiers, "cooldown-flat-ms", { abilityName: "Bloodthirst" })).toBe(10_000);
const improvedDisciplines = TALENT_NODES.find((node) => node.name === "Improved Disciplines")!;
const disciplineModifiers = talentModifiersForRanks({ [improvedDisciplines.id]: 1 }, "warrior");
expect(applyTalentModifierValue(300_000, disciplineModifiers, "cooldown-flat-ms", { abilityName: "Shield Wall" })).toBe(290_000);
expect(applyTalentModifierValue(30_000, disciplineModifiers, "cooldown-flat-ms", { abilityName: "Retaliation" })).toBe(20_000);
expect(applyTalentModifierValue(10_000, disciplineModifiers, "cooldown-flat-ms", { abilityName: "Mortal Strike" })).toBe(10_000);
});
it("keeps critical damage bonuses out of ordinary hit damage", () => {
const modifiers = parseTalentModifiers("Increases the critical damage of your spells by 150%.")
.map((modifier) => ({ ...modifier, sourceTalentId: "test", sourceTalentName: "Thunderous", rank: 1, description: "" }));
@@ -88,4 +131,39 @@ describe("talent runtime modifiers", () => {
tags: ["cast-time", "holy"],
})).toBe(20);
});
it("keeps Paladin activation and aura text out of persistent modifiers", () => {
for (const name of ["Aura Mastery", "Divine Favor"]) {
const talent = TALENT_NODES.find((node) => node.name === name);
expect(talent, name).toBeDefined();
expect(talentModifiersForRanks({ [talent!.id]: 1 }, "paladin"), name).toEqual([]);
}
});
it("scopes Improved Flash Heal critical chance and keeps its Inner Focus proc out of static cooldowns", () => {
const improvedFlashHeal = TALENT_NODES.find((node) => node.name === "Improved Flash Heal")!;
const modifiers = talentModifiersForRanks({ [improvedFlashHeal.id]: 3 }, "priest");
expect(applyTalentModifierValue(5, modifiers, "critical-chance-percent", { abilityName: "Flash Heal" })).toBe(20);
expect(applyTalentModifierValue(5, modifiers, "critical-chance-percent", { abilityName: "Greater Heal" })).toBe(5);
expect(modifiers.filter((modifier) => modifier.kind === "cooldown-flat-ms")).toEqual([]);
});
it("applies Black Ice to either Frost or Shadow damage", () => {
const blackIce = TALENT_NODES.find((node) => node.name === "Black Ice")!;
const modifiers = talentModifiersForRanks({ [blackIce.id]: blackIce.maxRank }, "death-knight");
expect(applyTalentModifierValue(100, modifiers, "damage-percent", {
abilityName: "Icy Touch",
tags: ["damage", "frost"],
})).toBeCloseTo(110);
expect(applyTalentModifierValue(100, modifiers, "damage-percent", {
abilityName: "Death Coil",
tags: ["damage", "shadow"],
})).toBeCloseTo(110);
expect(applyTalentModifierValue(100, modifiers, "damage-percent", {
abilityName: "Plague Strike",
tags: ["damage", "physical"],
})).toBe(100);
});
});