Release Healer Man 0.1.54

This commit is contained in:
phenom committed 2026-09-18 16:09:25 -04:00
1 parent d6976e6ef6
commit 2dbb0acfc1
26 files changed
+1893 -912

No files matched your search

+20
View File
@@ -12,6 +12,7 @@ import {
normalizeTalentRanks,
spentTalentPoints,
talentNodeById,
talentNodesForTree,
talentPointsForLevel,
talentTreeById,
} from "./talentCatalog";
@@ -27,10 +28,13 @@ const EXPECTED_SPECIALIZATIONS = [
["warrior", "Arms", "warrior-arms"],
["warrior", "Fury", "warrior-fury"],
["paladin", "Retribution", "paladin-retribution"],
["hunter", "Beast Mastery", "hunter-beast-mastery"],
["hunter", "Marksmanship", "hunter-marksmanship"],
["hunter", "Survival", "hunter-survival"],
["rogue", "Combat", "rogue-combat"],
["rogue", "Assassination", "rogue-assassination"],
["rogue", "Subtlety", "rogue-subtlety"],
["priest", "Discipline", "priest-discipline"],
["priest", "Shadow", "priest-shadow"],
["death-knight", "Frost", "death-knight-frost"],
["death-knight", "Unholy", "death-knight-unholy"],
@@ -41,7 +45,9 @@ const EXPECTED_SPECIALIZATIONS = [
["mage", "Frost", "mage-frost"],
["warlock", "Affliction", "warlock-affliction"],
["warlock", "Demonology", "warlock-demonology"],
["warlock", "Destruction", "warlock-destruction"],
["druid", "Balance", "druid-balance"],
["druid", "Feral (Bear)", "druid-feral-combat"],
["druid", "Feral (Cat)", "druid-feral-combat"],
] as const satisfies readonly (readonly [ClassId, string, string])[];
@@ -87,6 +93,20 @@ describe("party talent specialization plans", () => {
expect(selection.rank).toBeLessThanOrEqual(selection.maxRank);
}
}
}, 15_000);
it("reaches every primary-tree capstone before branching into a secondary tree", () => {
for (const { classId, specialization, primaryTreeId } of PARTY_TALENT_SPECIALIZATIONS) {
const level60 = learnedPartyTalentSelections(classId, specialization, 60);
const primary = level60.filter((selection) => selection.inPrimaryTree);
const deepestRow = Math.max(...talentNodesForTree(primaryTreeId).map((node) => node.row));
expect(primary).toHaveLength(51);
expect(
Math.max(...primary.map((selection) => talentNodeById(selection.nodeId)?.row ?? 0)),
`${classId}:${specialization}`,
)
.toBe(deepestRow);
}
});
it("spends exactly the points available at every level from 1 through 80", () => {