fix: preserve broad target-state talent scopes (#20)

This commit is contained in:
warren authored and Codex (Root combat coordinator) committed 2026-10-15 09:10:55 -04:00
1 parent b3e0445e9c
commit 6a716fb8ca
2 files changed
+25 -1

No files matched your search

+20
View File
@@ -174,6 +174,26 @@ describe("talent runtime modifiers", () => {
expect(applyTalentModifierValue(10_000, disciplineModifiers, "cooldown-flat-ms", { abilityName: "Mortal Strike" })).toBe(10_000);
});
it("keeps Blood Frenzy's target-state damage scope broad", () => {
const bloodFrenzy = TALENT_NODES.find((node) => node.id === "talent-1664")!;
expect(bloodFrenzy.rankDescriptions[1]).toBe(
"Increases your melee attack speed by 4%. Rend and Deep Wounds increase all Physical damage caused to that target by 4%. Does not stack with similar effects.",
);
const modifiers = talentModifiersForRanks({ [bloodFrenzy.id]: 2 }, "warrior");
expect(modifiers).toContainEqual(expect.objectContaining({
kind: "damage-percent",
amount: 4,
scope: "all Physical damage caused to that target",
sourceTalentId: bloodFrenzy.id,
rank: 2,
}));
for (const abilityName of ["Mortal Strike", "Rend", "Deep Wounds"]) {
expect(applyTalentModifierValue(100, modifiers, "damage-percent", { abilityName }), abilityName)
.toBeCloseTo(104);
}
});
it("keeps Morbidity's Death Coil clauses and Death and Decay cooldown on their named spells", () => {
const morbidity = TALENT_NODES.find((node) => node.id === "talent-1933")!;
expect(morbidity.name).toBe("Morbidity");
+5 -1
View File
@@ -451,7 +451,11 @@ export interface TalentModifierContext {
function namedModifierTarget(scope: string): string | undefined {
const scopeWithoutAmount = scope.replace(/\s+by\s+-?\d+(?:\.\d+)?\s*(?:%|secs?)(?:\s*[.!?])?$/i, "");
const target = scopeWithoutAmount.match(/\b(?:of|on|with|for|to)\s+(?:your\s+)?([^,.!?]+)$/)?.[1]?.trim();
// These are the source tooltip forms used for named abilities (for example,
// "cooldown on Death and Decay" and "damage of your Fire Blast"). Other
// prepositions can describe a target condition instead, as in "damage
// caused to that target", and must leave the modifier broadly applicable.
const target = scopeWithoutAmount.match(/\b(?:of|on)\s+(?:your\s+)?([^,.!?]+)$/)?.[1]?.trim();
if (!target) return undefined;
// Generic descriptors describe a category of spells, effects, or targets.