Update Healer Man server

This commit is contained in:
phenom committed 2026-09-30 09:57:13 -04:00
1 parent 35dfdaed61
commit 4fb7a0b9c8
161 files changed
+24618 -529

No files matched your search

+65 -3
View File
@@ -19,9 +19,14 @@ import { overrideRomKnightEffects } from "./romKnightOverrides";
import { overrideRomWarriorEffects } from "./romWarriorOverrides";
import { overrideRomScoutRogueEffects } from "./romScoutRogueOverrides";
import { overrideRomMageWarlockEffects } from "./romMageWarlockOverrides";
import { overrideRomMageEffects } from "./romMageOverrides";
import { overrideRomWarlockEffects } from "./romWarlockOverrides";
import { overrideRomDruidEffects } from "./romDruidOverrides";
import { romPriestDescription } from "./romPriestTooltips";
import { overrideRomPriestMageEffects } from "./romPriestMageRuntime";
import { overrideRomPriestWarlockEffects } from "./romPriestWarlockOverrides";
import { overrideRomChampionEffects } from "./romChampionOverrides";
import { ROM_WARDEN_BRIAR_SHIELD_TAG } from "./romWardenOverrides";
export type RomSkillGroup = "primary" | "general" | "elite" | "passive";
@@ -344,17 +349,19 @@ function semanticEffect(row: GeneratedSemanticRow, semantic: RomAbilitySemantic,
if (semantic.kind === "dot" || semantic.kind === "hot") {
const intervalMs = durationMs(semantic.intervalSeconds || 2);
const ticks = Math.max(1, Math.round((semantic.durationSeconds || semantic.intervalSeconds || 2) / (semantic.intervalSeconds || 2)));
const percentHealthHot = semantic.kind === "hot" && semantic.resource === "health-percent";
return {
kind: semantic.kind,
coefficient: 0,
...(semantic.kind === "dot" && combatSchool(semantic.school)
? { school: combatSchool(semantic.school) }
: {}),
basePoints: Math.max(0, semantic.basePerTick) * (1 + Math.max(0, semantic.perSkillLevel) / 100),
pointsPerLevel: Math.max(0, semantic.basePerTick) * Math.max(0, semantic.perSkillLevel) / 100,
basePoints: percentHealthHot ? 0 : Math.max(0, semantic.basePerTick) * (1 + Math.max(0, semantic.perSkillLevel) / 100),
pointsPerLevel: percentHealthHot ? 0 : Math.max(0, semantic.basePerTick) * Math.max(0, semantic.perSkillLevel) / 100,
sourceLevel: 1,
ticks,
intervalMs,
...(percentHealthHot ? { percentMaxHealth: Math.max(0, semantic.basePerTick) / 100 } : {}),
...(semantic.kind === "dot" ? { tag: `rom-${effectId}` } : {}),
} as AbilityEffect;
}
@@ -557,6 +564,52 @@ function targetStateAuraEffect(row: GeneratedSemanticRow, stateId: string, name:
}
function specializedEffects(row: GeneratedSemanticRow): readonly AbilityEffect[] | null {
if (row.classId === "rom-druid" && row.secondaryClassId === "rom-warrior" && row.sourceSkillId === 499955) {
// Briar Technique's modifiers are applied by its named source skills on a
// landed hit; it is a marker here, not a permanent stat aura.
return [stateAuraEffect(row, "druid-warrior-briar-technique-learned", row.name, null)];
}
if (row.classId === "rom-druid" && row.secondaryClassId === "rom-warrior"
&& [494016, 494216].includes(row.sourceSkillId)) {
// The local trigger component 623080 is duplicated onto its two existing
// trigger skills; the hit-time runtime owns its stack application.
return translateRomAbilitySemantics(row)
.map((semantic, index) => semanticEffect(row, semantic, index))
.filter((effect) => effect.kind !== "apply-aura"
|| !effect.aura.id.includes("-623080-"));
}
if (row.sourceSkillId === 493642) {
// RuneWaker defines a 900-second +5% DEF self aura. Its separate
// component 503959 is handled on a qualifying physical hit. Do not treat
// it as damage dealt when Briar Shield is cast.
const defense = translateRomAbilitySemantics(row)
.filter((semantic): semantic is Extract<RomAbilitySemantic, { kind: "aura" }> => (
semantic.kind === "aura" && semantic.modifierType === 135
))
.map((semantic, index) => semanticEffect(row, semantic, index))
.find((effect) => effect.kind === "apply-aura");
if (!defense || defense.kind !== "apply-aura") return [];
return [{
...defense,
aura: {
...defense.aura,
id: "rom-briar-shield",
name: row.name,
disposition: "buff",
utilityTags: [...(defense.aura.utilityTags ?? []), ROM_WARDEN_BRIAR_SHIELD_TAG],
},
}];
}
if (row.classId === "rom-warden" && row.secondaryClassId === "rom-mage" && row.sourceSkillId === 494207) {
// Tough Oak's 1-second cooldown rider is handled per qualifying cast. Its
// +5% pet defense rider has no pet-stat representation in this runtime.
return [stateAuraEffect(row, "warden-tough-oak", row.name, null)];
}
if (row.classId === "rom-warden" && row.secondaryClassId === "rom-mage" && row.sourceSkillId === 494011) {
// Oak Blessing's local 620679 effect is conditional on Heart of the Oak;
// its buff and periodic heal are added when that parent skill is cast.
return [stateAuraEffect(row, "warden-oak-blessing", row.name, null)];
}
if (row.classId === "rom-warden" && row.sourceSkillId === 494610) {
// This passive is a trigger marker; its source damage reduction is applied
// to Frantic Briar's target, not permanently to the Warden.
@@ -739,7 +792,13 @@ function effects(row: GeneratedSemanticRow): readonly AbilityEffect[] {
utilityTags: [...(effect.aura.utilityTags ?? []), "rom-briar-shield"],
},
} : effect);
const druidOverride = row.classId === "rom-druid" ? overrideRomDruidEffects(row, translated) : null;
const priestMageOverride = overrideRomPriestMageEffects(row, translated);
if (priestMageOverride) return priestMageOverride;
const championOverride = overrideRomChampionEffects(row, translated);
if (championOverride) return championOverride;
const druidOverride = row.classId === "rom-druid" || row.sourceSkillId === 494331
? overrideRomDruidEffects(row, translated)
: null;
if (druidOverride) return druidOverride;
if (row.sourceSkillId === 498825) return [
...translated,
@@ -806,9 +865,12 @@ function effects(row: GeneratedSemanticRow): readonly AbilityEffect[] {
const weakenedDuration = row.source?.components?.find((component) => component.id === 501503)?.effectTime ?? 6;
return [...translated, targetStateAuraEffect(row, "weakened", "Weakened", durationMs(weakenedDuration))];
}
const mageOverride = overrideRomMageEffects(row, translated);
if (mageOverride) return mageOverride;
const pairOverride = overrideRomKnightEffects(row, translated)
?? overrideRomWarriorEffects(row, translated)
?? overrideRomPriestKnightEffects(row, translated)
?? overrideRomPriestWarlockEffects(row, translated)
?? overrideRomScoutRogueEffects(row, translated)
?? overrideRomMageWarlockEffects(row, translated)
?? overrideRomWarlockEffects(row, translated);