Update Healer Man server

This commit is contained in:
phenom committed 2026-10-02 10:38:12 -04:00
1 parent 4c768fbec6
commit b16821e92e
330 files changed
+35406 -1760

No files matched your search

+131 -5
View File
@@ -1,8 +1,19 @@
import type { AbilityDefinition, AbilityEffect } from "./abilityCatalog";
import type { RomGeneratedAbilityLike } from "./romAbilitySemantics";
import { romWarlockPriestSpreadingPainEffects } from "./romWarlockPriestSpreadingPain";
import { romWarlockRogueShadowSliceEffects } from "./romWarlockRogueShadowSlice";
import {
ROM_WARLOCK_MAGE_WILLPOWER_BLADE_STATE_TAG,
romWarlockMageSoulBrandStingEffects,
} from "./romWarlockMageSoulBrandSting";
import {
isRomWarlockPriestSoulEnlightenment,
romWarlockPriestSoulEnlightenmentEffect,
} from "./romWarlockPriestSoulEnlightenment";
export const ROM_WARLOCK_STATE_TAGS = Object.freeze({
heartFence: "rom-warlock-state-501577",
willpowerBlade: ROM_WARLOCK_MAGE_WILLPOWER_BLADE_STATE_TAG,
perceptionExtraction: "rom-warlock-state-497960",
soulPain: "rom-warlock-state-497964",
soulPoisonedFang: "rom-warlock-state-498670",
@@ -22,6 +33,64 @@ function appendAuraTag(effect: AbilityEffect, tag: string): AbilityEffect {
};
}
function divineAssistanceAura(): AbilityEffect {
const schools = ["holy", "fire", "nature", "frost", "shadow", "arcane"] as const;
return {
kind: "apply-aura",
recipient: "caster",
aura: {
id: "rom-warlock-divine-assistance-498668",
name: "Divine Assistance",
disposition: "buff",
durationMs: null,
modifiers: [
...schools.map((school) => ({ kind: "damage" as const, direction: "dealt" as const, school, operation: "percent" as const, value: 0.16 })),
{ kind: "healing", direction: "done", operation: "percent", value: 0.16 },
],
},
sourceEffectType: -1,
sourceAuraType: -1,
miscValue: 16,
triggerSpellId: 498668,
};
}
function healingFortuneAura(durationMs = 20_000, requiresCriticalHit = false): AbilityEffect {
return {
kind: "apply-aura",
recipient: "caster",
requiresLandedHit: true,
...(requiresCriticalHit ? { requiresCriticalHit: true } : {}),
aura: {
id: "rom-warlock-healing-fortune-498633",
name: "Healing Fortune",
disposition: "buff",
durationMs,
modifiers: [
{ kind: "healing", direction: "done", operation: "percent", value: 0.12 },
{ kind: "stat", stat: "wisdom", operation: "percent", value: 0.12 },
],
},
sourceEffectType: -1,
sourceAuraType: -1,
miscValue: 12,
triggerSpellId: 498633,
};
}
function damageAsFriendlyHeal(effect: Extract<AbilityEffect, { kind: "damage" }>): AbilityEffect {
const {
kind: _kind,
school: _school,
weaponHand: _weaponHand,
falloffPerJump: _falloffPerJump,
bonusPerSunderStack: _bonusPerSunderStack,
onDamageResource: _onDamageResource,
...scaling
} = effect;
return { ...scaling, kind: "heal", recipient: "ability-target" };
}
/** Source-specific state markers and recipient mapping for the Warlock's paired skills. */
export function overrideRomWarlockEffects(
row: RomGeneratedAbilityLike,
@@ -29,6 +98,24 @@ export function overrideRomWarlockEffects(
): readonly AbilityEffect[] | null {
if (row.classId !== "rom-warlock") return null;
if (isRomWarlockPriestSoulEnlightenment(row)) {
// Current CoA 498649 replaces RuneWaker's maximum-HP/healing aura with
// damage dealt and received-healing modifiers on the exact pair.
return [romWarlockPriestSoulEnlightenmentEffect()];
}
if (row.sourceSkillId === 498642) {
// Current CoA Mind Transference spends 75 Rage and grants six Psi; the
// local component's unrelated physical-attack aura is superseded.
return [{ kind: "resource", resource: "psi", amount: 6 }];
}
if (row.sourceSkillId === 498633) return [];
if (row.sourceSkillId === 498668) return [divineAssistanceAura()];
const soulBrandSting = romWarlockMageSoulBrandStingEffects(row, translated);
if (soulBrandSting) return soulBrandSting;
if (row.sourceSkillId === 498549) {
// Defense Net's active component supplies the 5-second magic mitigation;
// the source tooltip also describes immunity to Helpless, Stun, Root, and
@@ -44,15 +131,14 @@ export function overrideRomWarlockEffects(
: effect);
}
if (row.sourceSkillId === 498710 || row.sourceSkillId === 498662) {
const targetAbilityName = row.sourceSkillId === 498710 ? "Flaming Heart Strike" : "Rising Tide";
if (row.sourceSkillId === 498662) {
return [
...translated.filter((effect) => effect.kind !== "cooldown-reset"),
{ kind: "cooldown-reset", mode: "reset", abilityName: targetAbilityName },
{ kind: "cooldown-reset", mode: "reset", abilityName: "Rising Tide" },
];
}
if ([498634, 498648, 498668].includes(row.sourceSkillId ?? 0)) {
if ([498634, 498648].includes(row.sourceSkillId ?? 0)) {
// These passive tooltips describe event-gated resets. Keep their cooldown
// riders out of the generic cast path until their source events are wired.
return translated.filter((effect) => effect.kind !== "cooldown-reset");
@@ -107,6 +193,14 @@ export function overrideRomWarlockEffects(
return [...selectedTargetEffects, partyReductionAura];
}
if (row.sourceSkillId === 497955) {
// Mark the locally generated aura by its actual state name. Current CoA
// lists the state-entry skill as 1494096; this does not bridge the IDs.
return translated.map((effect) => effect.kind === "apply-aura" && effect.aura.name === "Willpower Blade"
? appendAuraTag(effect, ROM_WARLOCK_STATE_TAGS.willpowerBlade)
: effect);
}
const stateTag = row.sourceSkillId === 497960
? ROM_WARLOCK_STATE_TAGS.perceptionExtraction
: row.sourceSkillId === 497964
@@ -148,8 +242,40 @@ export function romWarlockCastEffects(
targetTags: readonly string[],
learnedPassiveSpellIds: readonly number[] = [],
targetHealthPercent = 1,
selectedTargetRelationship: "friendly" | "hostile" = "hostile",
): readonly AbilityEffect[] {
if (ability.source !== "runewaker" || ability.classId !== "rom-warlock") return effects;
if (ability.source !== "runewaker") return effects;
const spreadingPainEffects = romWarlockPriestSpreadingPainEffects(ability, effects);
if (spreadingPainEffects) return spreadingPainEffects;
if (ability.classId === "rom-priest" && ability.dbcSpellId === 490256
&& learnedPassiveSpellIds.includes(498643)) {
return [
...effects,
{ kind: "resource", resource: "psi", amount: 1 },
...(learnedPassiveSpellIds.includes(498633) ? [healingFortuneAura(20_000, true)] : []),
];
}
if (ability.classId === "rom-priest" && ability.dbcSpellId === 491147
&& learnedPassiveSpellIds.includes(498648)) {
return [...effects, { kind: "resource", resource: "psi", amount: 1 }];
}
const shadowSliceEffects = romWarlockRogueShadowSliceEffects(ability, learnedPassiveSpellIds);
if (shadowSliceEffects) return shadowSliceEffects;
if (ability.classId !== "rom-warlock") return effects;
if (ability.dbcSpellId === 497957 && learnedPassiveSpellIds.includes(498633)) {
return [...effects, healingFortuneAura()];
}
if (ability.dbcSpellId === 497958 && learnedPassiveSpellIds.includes(498633)
&& selectedTargetRelationship === "friendly") {
return effects.map((effect) => effect.kind === "damage" ? damageAsFriendlyHeal(effect) : effect);
}
if (ability.dbcSpellId === 498544) {
return effects.flatMap((effect): AbilityEffect[] => {