Update Healer Man server

This commit is contained in:
phenom committed 2026-09-23 16:14:19 -04:00
1 parent f90ba7d989
commit 189b94d6b7
51 files changed
+3448 -154

No files matched your search

+115 -3
View File
@@ -506,18 +506,130 @@ function effects(row: GeneratedSemanticRow): readonly AbilityEffect[] {
.filter((effect) => effect.kind === kind)
.sort((left, right) => (strongest ? -1 : 1) * (outputStrength(left) - outputStrength(right)))
.slice(0, 1);
const holySealDot = (strongest: boolean): readonly AbilityEffect[] => oneOutput("dot", strongest).map((effect) => (
effect.kind === "dot" ? { ...effect, tag: "rom-holy-seal" } : effect
));
// These source rows carry alternate/duplicate payloads, while their player
// tooltips specify a single projectile hit. The first attack component is
// the primary shot; executing every component also applies unrelated Shot
// stat modifiers and doubles Throw damage.
if (row.sourceSkillId === 490309 || row.sourceSkillId === 490423) {
return translated.filter((effect) => effect.kind === "damage").slice(0, 1);
}
if (row.sourceSkillId === 490313) return translated.filter((effect) => effect.kind === "damage");
// The source rows include auxiliary spell records alongside the tooltip's
// single hit or periodic heal. They are alternatives, not extra casts.
if (row.sourceSkillId === 491150 || row.sourceSkillId === 490204) {
return translated.filter((effect) => effect.kind === "damage").slice(0, 1);
}
if (row.sourceSkillId === 490252 || row.sourceSkillId === 490244) {
const hit = translated.find((effect) => effect.kind === "damage");
const hitCount = row.sourceSkillId === 490252 ? 5 : 3;
return [
...(hit ? Array.from({ length: hitCount }, () => hit) : []),
...(row.sourceSkillId === 490244
? translated.filter((effect) => effect.kind === "apply-aura")
: []),
];
}
if (row.sourceSkillId === 490256) {
return translated.filter((effect) => effect.kind === "damage");
}
if (row.sourceSkillId === 490269) {
return translated.filter((effect) => effect.kind === "hot").slice(0, 1);
}
if (row.sourceSkillId === 490304 || row.sourceSkillId === 490434) {
return translated.map((effect) => effect.kind === "apply-aura" ? {
...effect,
aura: { ...effect.aura, utilityTags: [...(effect.aura.utilityTags ?? []), "rom-self-health-drain"] },
} : effect);
}
if (row.sourceSkillId === 490506 || row.sourceSkillId === 490218) {
return translated.filter((effect) => effect.kind === "apply-aura");
}
if (row.sourceSkillId === 490420) {
return translated.filter((effect) => effect.kind === "damage"
|| (effect.kind === "apply-aura" && !effect.control));
}
if (row.sourceSkillId === 490242) {
return translated.filter((effect) => effect.kind === "damage"
|| (effect.kind === "apply-aura" && effect.control?.kind === "stun"));
}
if (row.sourceSkillId === 490344) {
return [{ kind: "movement", movement: "teleport", toward: "target" }];
}
if (row.sourceSkillId === 490311) {
return translated.filter((effect) => effect.kind === "damage" || effect.kind === "dot");
}
if (row.sourceSkillId === 490192) {
return translated.filter((effect) => effect.kind === "apply-aura").map((effect) => (
effect.kind === "apply-aura" && effect.aura.procs?.length ? {
...effect,
aura: {
...effect.aura,
durationMs: 30_000,
procs: effect.aura.procs.map((proc) => ({
...proc,
action: { kind: "custom" as const, id: "rom-shield-discipline-reflect" },
})),
},
} : effect
));
}
if (row.sourceSkillId === 490347) {
return [{ kind: "status", status: "sleep", durationMs: 10_000, maxTargets: 1, breakOnDamage: true }];
}
if (row.sourceSkillId === 490454) {
return [{ kind: "status", status: "root", durationMs: 10_000, maxTargets: 1, breakOnDamage: true }];
}
if (row.sourceSkillId === 490438) {
return [{ kind: "status", status: "stun", durationMs: 10_000, maxTargets: 1, breakOnDamage: true }];
}
if (row.sourceSkillId === 491172) {
return [{ kind: "status", status: "stun", durationMs: 10_000, maxTargets: 1, breakOnDamage: true }];
}
if (row.sourceSkillId === 490337) {
return translated.filter((effect) => effect.kind === "damage" || effect.kind === "dot"
|| (effect.kind === "apply-aura" && effect.control?.kind === "stun"));
}
if (row.sourceSkillId === 490507) {
const aura = translated.find((effect) => effect.kind === "apply-aura");
return aura?.kind === "apply-aura" ? [{
...aura,
aura: { ...aura.aura, utilityTags: ["next-offensive-critical", "rom-premeditation"] },
}] : translated;
}
if (row.sourceSkillId === 490354) {
return translated.map((effect) => effect.kind === "apply-aura" ? {
...effect,
aura: { ...effect.aura, utilityTags: ["stealth", "rom-vanish"] },
} : effect);
}
if (row.sourceSkillId === 490329) {
const aura = translated.find((effect) => effect.kind === "apply-aura");
return aura?.kind === "apply-aura" ? [{
...aura,
aura: { ...aura.aura, durationMs: 900_000, utilityTags: ["rom-poisonous"] },
}] : translated;
}
// RuneWaker's Knight uses Holy Seal as a target-scoped build/spend resource.
// Model it through the combat engine's combo authority so both players and
// companions build seals before Punishment instead of casting the payoff on
// an unsealed target. Source components contain one alternative payload per
// seal count; executing every branch at once greatly overstates the skills.
if (row.sourceSkillId === 490148) return [
...oneOutput("damage", true), ...oneOutput("dot", false), { kind: "combo", amount: 1 },
...oneOutput("damage", true), ...holySealDot(false), { kind: "combo", amount: 1 },
];
if (row.sourceSkillId === 490149) return [
...oneOutput("damage", true), ...oneOutput("dot", true), { kind: "combo", amount: 4 },
...oneOutput("damage", true), ...holySealDot(true), { kind: "combo", amount: 4 },
];
if (row.sourceSkillId === 490150) return [
{ kind: "movement", movement: "charge", toward: "target" },
...oneOutput("damage", true),
...translated.filter((effect) => effect.kind === "apply-aura" && effect.control?.kind === "stun").slice(0, 1),
...holySealDot(false),
{ kind: "combo", amount: 2 },
];
if (row.sourceSkillId === 490150) return [...translated, { kind: "combo", amount: 2 }];
if (row.sourceSkillId === 490151) return [
...oneOutput("damage", true), ...oneOutput("dot", true), { kind: "combo", amount: -5 },
];