Files
healer-man/src/game/partyRoles.ts
T
2026-08-14 15:56:39 -04:00

70 lines
2.5 KiB
TypeScript

import type { ClassId } from "../app/characterCatalog";
export type PartyRole = "tank" | "healer" | "damage";
export type PartySize = 1 | 2 | 3 | 4 | 5;
export const PARTY_ROLE_LABELS: Readonly<Record<PartyRole, string>> = Object.freeze({
tank: "Tank",
healer: "Healer",
damage: "DPS",
});
const roles = (...values: PartyRole[]): readonly PartyRole[] => Object.freeze(values);
const CLASS_PARTY_ROLES: Readonly<Record<ClassId, readonly PartyRole[]>> = Object.freeze({
warrior: roles("tank", "damage"),
paladin: roles("tank", "healer", "damage"),
hunter: roles("damage"),
rogue: roles("damage"),
priest: roles("healer", "damage"),
"death-knight": roles("tank", "damage"),
shaman: roles("healer", "damage"),
mage: roles("damage"),
warlock: roles("damage"),
druid: roles("tank", "healer", "damage"),
barbarian: roles("damage"),
"witch-doctor": roles("healer", "damage"),
felsworn: roles("tank", "damage"),
"witch-hunter": roles("tank", "damage"),
stormbringer: roles("damage"),
"knight-of-xoroth": roles("tank", "damage"),
guardian: roles("tank", "damage"),
templar: roles("tank", "damage"),
bloodmage: roles("tank", "healer", "damage"),
ranger: roles("damage"),
chronomancer: roles("healer", "damage"),
necromancer: roles("damage"),
pyromancer: roles("damage"),
cultist: roles("tank", "healer", "damage"),
starcaller: roles("tank", "healer", "damage"),
"sun-cleric": roles("tank", "healer", "damage"),
tinker: roles("healer", "damage"),
venomancer: roles("tank", "healer", "damage"),
reaper: roles("tank", "damage"),
primalist: roles("tank", "healer", "damage"),
runemaster: roles("tank", "damage"),
"rom-warrior": roles("tank", "damage"),
"rom-scout": roles("damage"),
"rom-rogue": roles("damage"),
"rom-mage": roles("damage"),
"rom-priest": roles("healer", "damage"),
"rom-knight": roles("tank", "damage"),
"rom-warden": roles("tank", "damage"),
"rom-druid": roles("healer", "damage"),
"rom-warlock": roles("damage"),
"rom-champion": roles("tank", "damage"),
});
export function partyRolesForClass(classId: ClassId): readonly PartyRole[] {
return CLASS_PARTY_ROLES[classId];
}
export function defaultPartyRoleForClass(classId: ClassId): PartyRole {
const available = partyRolesForClass(classId);
return available.includes("healer") ? "healer" : available.includes("damage") ? "damage" : available[0];
}
export function classCanFillPartyRole(classId: ClassId, role: PartyRole): boolean {
return partyRolesForClass(classId).includes(role);
}