Update Healer Man server

This commit is contained in:
phenom committed 2026-09-19 21:01:51 -04:00
1 parent f8314e7de1
commit 1fedb9368d
76 files changed
+20556 -2523

No files matched your search

+48
View File
@@ -16,6 +16,7 @@ import {
import { spentTalentPoints, talentPointsForLevel, talentTreeById } from "./talentCatalog";
import type { InventoryItem } from "./lootTypes";
import { EMPTY_ITEM_STATS } from "./itemStats";
import { DEFAULT_COMPANION_SPEC_READINESS_POLICY } from "./companionSpecReadiness";
describe("dungeon party composition", () => {
beforeEach(() => usePartyStore.setState({
@@ -46,6 +47,53 @@ describe("dungeon party composition", () => {
}
});
it("uses only the five Ready Playerbots identities by default", () => {
const party = createDungeonParty("ready-only", 80, "damage");
expect(party.map((member) => member.name)).toEqual(expect.arrayContaining(["Aldren", "Quorin"]));
expect(party.every((member) => ["Aldren", "Quorin", "Liora", "Xavian", "Orin"].includes(member.name))).toBe(true);
expect(new Set(party.filter((member) => member.role === "damage").map((member) => member.specializationId)).size)
.toBe(party.filter((member) => member.role === "damage").length);
});
it("adds Beta specs only when opted in and still excludes Needs Testing", () => {
const policy = {
schemaVersion: 1 as const,
statuses: {
...DEFAULT_COMPANION_SPEC_READINESS_POLICY.statuses,
"mage:arcane": "beta" as const,
},
};
const defaultNames = new Set<string>();
const betaNames = new Set<string>();
for (let seed = 0; seed < 40; seed += 1) {
for (const member of createDungeonParty(`beta-${seed}`, 80, "damage", 5, "wow", { readinessPolicy: policy })) {
defaultNames.add(member.specializationId ?? "");
}
for (const member of createDungeonParty(`beta-${seed}`, 80, "damage", 5, "wow", { readinessPolicy: policy, includeBetaSpecs: true })) {
betaNames.add(member.specializationId ?? "");
}
}
expect(defaultNames.has("mage:arcane")).toBe(false);
expect(betaNames.has("mage:arcane")).toBe(true);
expect(betaNames.has("mage:frost")).toBe(false);
});
it("avoids the player's damage specialization when two alternatives can fill the NPC seats", () => {
const party = createDungeonParty("exclude-player", 80, "damage", 5, "wow", {
excludedPlayerSpecializationId: "mage:fire",
});
expect(party.filter((member) => member.role === "damage").map((member) => member.specializationId).sort())
.toEqual(["hunter:marksmanship", "rogue:assassination"]);
});
it("keeps RoM generation unchanged when WoW readiness is restrictive", () => {
const baseline = createDungeonParty("rom-readiness", 40, "damage", 5, "rom");
const filtered = createDungeonParty("rom-readiness", 40, "damage", 5, "rom", {
readinessPolicy: DEFAULT_COMPANION_SPEC_READINESS_POLICY,
});
expect(filtered).toEqual(baseline);
});
it("fills a dedicated healer when the player chooses tank or damage", () => {
for (const playerRole of ["tank", "damage"] as const) {
for (const seed of ["role-a", "role-b", "role-c", "role-d"]) {