Update Healer Man server

This commit is contained in:
phenom committed 2026-09-20 21:50:50 -04:00
1 parent fdb6739f8d
commit f90ba7d989
41 files changed
+1671 -118

No files matched your search

+26 -2
View File
@@ -10,6 +10,7 @@ import {
import { loadCoaAbilityCatalogShard } from "./coaAbilityCatalogLoader";
import { registerAbilityAnimationLookup } from "./abilityAnimationLookup";
import type { AuraDefinition, DamageSchool, DispelCategory } from "./combatAuras";
import { applyAbilityBalanceTuning, currentBalanceTuningPolicy } from "./balanceTuning";
export type RomSkillGroup = "primary" | "general" | "elite" | "passive";
@@ -890,6 +891,9 @@ const CLASSIC_CORE_ABILITIES: Readonly<Record<BaseClassId, readonly AbilityDefin
const abilitiesByClass: Partial<Record<ClassId, readonly AbilityDefinition[]>> = {
...CLASSIC_CORE_ABILITIES,
};
const sourceAbilitiesByClass: Partial<Record<ClassId, readonly AbilityDefinition[]>> = {
...CLASSIC_CORE_ABILITIES,
};
const abilityCatalog: Record<string, AbilityDefinition> = {};
let romEliteAbilities: readonly AbilityDefinition[] = [];
let romTriggeredAbilityResolver: ((spellId: number) => AbilityDefinition | null) | null = null;
@@ -904,8 +908,28 @@ export const ABILITY_CATALOG = abilityCatalog as Readonly<Record<string, Ability
function registerClassAbilities(classId: ClassId, abilities: readonly AbilityDefinition[]): void {
for (const previous of abilitiesByClass[classId] ?? []) delete abilityCatalog[previous.id];
abilitiesByClass[classId] = abilities;
for (const ability of abilities) abilityCatalog[ability.id] = ability;
sourceAbilitiesByClass[classId] = abilities;
const policy = currentBalanceTuningPolicy();
const tuned = abilities.map((ability) => applyAbilityBalanceTuning(ability, policy));
abilitiesByClass[classId] = tuned;
for (const ability of tuned) abilityCatalog[ability.id] = ability;
}
/** Rebuilds the live catalog after a local balance policy is published. */
export function refreshAbilityBalanceTuning(): void {
const policy = currentBalanceTuningPolicy();
for (const [classId, source] of Object.entries(sourceAbilitiesByClass)) {
if (!source) continue;
for (const previous of abilitiesByClass[classId as ClassId] ?? []) delete abilityCatalog[previous.id];
const tuned = source.map((ability) => applyAbilityBalanceTuning(ability, policy));
abilitiesByClass[classId as ClassId] = tuned;
for (const ability of tuned) abilityCatalog[ability.id] = ability;
}
}
/** Untuned source definitions used by the GM balance editor. */
export function sourceAbilitiesForClass(classId: ClassId): readonly AbilityDefinition[] {
return sourceAbilitiesByClass[classId] ?? [];
}
for (const classId of BASE_CLASS_IDS) {