forked from phenom/healer-man
Update Healer Man server
This commit is contained in:
1 parent
f90ba7d989
commit
189b94d6b7
51 files changed
+3448
-154
No files matched your search
@@ -21,6 +21,22 @@ function effectsOfKind<K extends AbilityEffect["kind"]>(
|
||||
}
|
||||
|
||||
describe("WoW 3.3.5 executable effect mapping", () => {
|
||||
it("combines each Holy Nova damage rank with its matching healing payload", () => {
|
||||
const nova = byId("wow335-priest-holy-nova");
|
||||
expect(nova.ranks).toHaveLength(9);
|
||||
for (const rank of nova.ranks ?? []) {
|
||||
expect(effectsOfKind(rank, "damage")).toHaveLength(1);
|
||||
expect(effectsOfKind(rank, "heal")).toHaveLength(1);
|
||||
expect(rank.cost.amount).toBeGreaterThan(0);
|
||||
}
|
||||
expect(abilityAtLevel(nova, 80)).toMatchObject({
|
||||
dbcSpellId: 48078,
|
||||
target: "self",
|
||||
radius: 10,
|
||||
castMode: "instant",
|
||||
});
|
||||
});
|
||||
|
||||
it("maps Envenom to Deadly Poison dose damage and its poison-frequency buff", () => {
|
||||
const envenom = abilityAtLevel(byId("wow335-rogue-envenom"), 80);
|
||||
expect(effectsOfKind(envenom, "finisher-damage")).toEqual([
|
||||
@@ -188,13 +204,85 @@ describe("WoW 3.3.5 executable effect mapping", () => {
|
||||
]));
|
||||
});
|
||||
|
||||
it("models Penance as the Discipline rotation's friendly heal", () => {
|
||||
it("models Penance as three healing or damaging pulses", () => {
|
||||
const penance = byId("wow335-priest-penance");
|
||||
expect(penance.target).toBe("friendly");
|
||||
expect(penance.target).toBe("any");
|
||||
expect(effectsOfKind(penance, "heal")).toEqual([
|
||||
expect.objectContaining({ coefficient: 1.8 }),
|
||||
expect.objectContaining({ coefficient: 0.6 }),
|
||||
]);
|
||||
expect(effectsOfKind(penance, "damage")).toEqual([]);
|
||||
expect(effectsOfKind(penance, "hot")).toEqual([
|
||||
expect.objectContaining({ coefficient: 0.6, ticks: 2, intervalMs: 1_000 }),
|
||||
]);
|
||||
expect(effectsOfKind(penance, "damage")).toEqual([
|
||||
expect.objectContaining({ coefficient: 0.6 }),
|
||||
]);
|
||||
expect(effectsOfKind(penance, "dot")).toEqual([
|
||||
expect.objectContaining({ coefficient: 0.6, ticks: 2, intervalMs: 1_000 }),
|
||||
]);
|
||||
});
|
||||
|
||||
it("maps the Ready-five missing spell payloads without cast-time damage on self buffs", () => {
|
||||
const devastate = abilityAtLevel(byId("wow335-warrior-devastate"), 80);
|
||||
expect(effectsOfKind(devastate, "damage")).toEqual([
|
||||
expect.objectContaining({ coefficient: 1, bonusPerSunderStack: 202 }),
|
||||
]);
|
||||
expect(effectsOfKind(devastate, "apply-aura")).toEqual([
|
||||
expect.objectContaining({ aura: expect.objectContaining({ id: "wow335:warrior:sunder-armor", maxStacks: 5 }) }),
|
||||
]);
|
||||
const lastStand = byId("wow335-warrior-last-stand");
|
||||
expect(lastStand.target).toBe("self");
|
||||
expect(effectsOfKind(lastStand, "heal")).toEqual([]);
|
||||
expect(effectsOfKind(lastStand, "apply-aura")).toEqual([
|
||||
expect.objectContaining({ aura: expect.objectContaining({
|
||||
modifiers: [{ kind: "stat", stat: "maximum-health", operation: "percent", value: 0.3 }],
|
||||
}) }),
|
||||
]);
|
||||
expect(effectsOfKind(byId("wow335-priest-divine-hymn"), "heal")).toEqual([
|
||||
expect.objectContaining({ scope: "party", maximumTargets: 3, radius: 40 }),
|
||||
]);
|
||||
expect(effectsOfKind(byId("wow335-hunter-chimera-shot"), "damage")).toEqual([
|
||||
expect.objectContaining({ coefficient: 1.25 }),
|
||||
]);
|
||||
expect(effectsOfKind(abilityAtLevel(byId("wow335-mage-living-bomb"), 80), "dot")).toHaveLength(1);
|
||||
const moltenArmor = abilityAtLevel(byId("wow335-mage-molten-armor"), 80);
|
||||
expect(moltenArmor.target).toBe("self");
|
||||
expect(effectsOfKind(moltenArmor, "damage")).toEqual([]);
|
||||
expect(effectsOfKind(byId("wow335-rogue-shiv"), "combo")).toEqual([{ kind: "combo", amount: 1 }]);
|
||||
expect(effectsOfKind(byId("wow335-rogue-cold-blood"), "apply-aura")).toEqual([
|
||||
expect.objectContaining({ aura: expect.objectContaining({
|
||||
utilityTags: ["next-offensive-critical"],
|
||||
modifiers: [{ kind: "stat", stat: "critical-strike", operation: "flat", value: 100 }],
|
||||
}) }),
|
||||
]);
|
||||
});
|
||||
|
||||
it("maps the remaining Ready-five cooldowns and defensive modifiers", () => {
|
||||
expect(effectsOfKind(byId("wow335-warrior-last-stand"), "apply-aura")[0]?.aura.durationMs).toBe(20_000);
|
||||
expect(byId("wow335-warrior-enraged-regeneration").target).toBe("self");
|
||||
const innerFire = abilityAtLevel(byId("wow335-priest-inner-fire"), 80);
|
||||
expect(effectsOfKind(innerFire, "apply-aura")[0]?.aura).toMatchObject({
|
||||
maxStacks: 20, initialStacks: 20,
|
||||
modifiers: [{ kind: "stat", stat: "armor", operation: "flat", value: 2440, perStack: false }],
|
||||
});
|
||||
const shadowfiend = byId("wow335-priest-shadowfiend");
|
||||
expect(effectsOfKind(shadowfiend, "summon")).toHaveLength(1);
|
||||
expect(effectsOfKind(shadowfiend, "resource")).toHaveLength(0);
|
||||
expect(effectsOfKind(abilityAtLevel(byId("wow335-hunter-kill-shot"), 80), "damage"))
|
||||
.toEqual([{ kind: "damage", coefficient: 2, bonusFlat: 325 }]);
|
||||
const combustion = byId("wow335-mage-combustion");
|
||||
expect(combustion.target).toBe("self");
|
||||
expect(effectsOfKind(combustion, "damage")).toHaveLength(0);
|
||||
expect(effectsOfKind(combustion, "apply-aura")[0]?.aura.utilityTags).toContain("fire-crit-stacking");
|
||||
expect(effectsOfKind(byId("wow335-mage-mirror-image"), "summon")).toHaveLength(3);
|
||||
const molten = abilityAtLevel(byId("wow335-mage-molten-armor"), 80);
|
||||
expect(effectsOfKind(molten, "apply-aura").flatMap((effect) => effect.aura.modifiers ?? []))
|
||||
.toEqual(expect.arrayContaining([
|
||||
expect.objectContaining({ stat: "incoming-critical-strike", value: -5 }),
|
||||
expect.objectContaining({ stat: "spirit-to-spell-crit-rating", value: 0.35 }),
|
||||
]));
|
||||
expect(effectsOfKind(abilityAtLevel(byId("wow335-rogue-evasion"), 80), "apply-aura")
|
||||
.flatMap((effect) => effect.aura.modifiers ?? []))
|
||||
.toEqual(expect.arrayContaining([expect.objectContaining({ stat: "incoming-ranged-hit", value: -25 })]));
|
||||
});
|
||||
|
||||
it("keeps triggered shield damage children out of learned Shaman ranks", () => {
|
||||
|
||||
Reference in new issue
Block a user