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

+139 -1
View File
@@ -1,9 +1,69 @@
import type { AbilityDefinition, AbilityEffect } from "./abilityCatalog";
import type { AuraProcDefinition } from "./combatAuras";
import type { RomGeneratedAbilityLike } from "./romAbilitySemantics";
export const ROM_KNIGHT_DIVINE_PUNISHMENT_TAG = "rom-divine-punishment";
export const ROM_KNIGHT_GODS_VENGEANCE_TAG = "rom-gods-vengeance";
export const ROM_KNIGHT_SHIELD_OF_VALOR_TAG = "rom-shield-of-valor";
export const ROM_KNIGHT_HOLY_LIGHTS_FURY_TAG = "rom-holy-lights-fury";
export const ROM_KNIGHT_MASTER_OF_PARRY_TAG = "rom-knight-master-of-parry";
export const ROM_KNIGHT_MASTER_OF_PARRY_BLOCK_PROC = "rom-knight-master-of-parry-block";
/** Shield of Valor reduces Holy Seal's remaining cooldown only on an active-aura parry. */
export function romKnightShieldOfValorCooldownReductionMs(auraActive: boolean, parried: boolean): number {
return auraActive && parried ? 1_000 : 0;
}
export interface RomKnightWarriorWhirlwindAdjustment {
readonly rageCostReduction: number;
readonly cooldownReductionMs: number;
}
/** RuneWaker Knight/Warrior passive 491639 modifies only Warrior Whirlwind. */
export function romKnightWarriorWhirlwindAdjustment(
characterClassId: string,
secondaryClassId: string | null | undefined,
ability: Pick<AbilityDefinition, "source" | "classId" | "dbcSpellId">,
learnedPassiveSpellIds: readonly number[],
): RomKnightWarriorWhirlwindAdjustment {
if (characterClassId !== "rom-knight"
|| secondaryClassId !== "rom-warrior"
|| ability.source !== "runewaker"
|| ability.classId !== "rom-warrior"
|| ability.dbcSpellId !== 490133
|| !learnedPassiveSpellIds.includes(491639)) {
return { rageCostReduction: 0, cooldownReductionMs: 0 };
}
// The local 491639 tooltip explicitly says 10 Rage and 20 seconds.
return { rageCostReduction: 10, cooldownReductionMs: 20_000 };
}
/** RuneWaker Knight/Rogue passive 491621 boosts only Holy Strike's critical rate. */
export function romKnightRogueHolyStrikeCriticalRateIncreasePercent(
characterClassId: string,
secondaryClassId: string | null | undefined,
ability: Pick<AbilityDefinition, "source" | "classId" | "dbcSpellId">,
learnedPassiveSpellIds: readonly number[],
): number {
if (characterClassId !== "rom-knight"
|| secondaryClassId !== "rom-rogue"
|| ability.source !== "runewaker"
|| ability.classId !== "rom-knight"
|| ability.dbcSpellId !== 490148
|| !learnedPassiveSpellIds.includes(491621)) return 0;
// The populated local tooltip specifies a 40% Holy Strike critical-rate increase.
return 40;
}
const ROM_KNIGHT_MASTER_OF_PARRY_PROC: AuraProcDefinition = {
id: ROM_KNIGHT_MASTER_OF_PARRY_BLOCK_PROC,
triggers: "block",
chance: 1,
charges: 2,
action: { kind: "custom", id: ROM_KNIGHT_MASTER_OF_PARRY_BLOCK_PROC },
};
function divinePunishmentPassive(row: RomGeneratedAbilityLike): readonly AbilityEffect[] {
return [{
@@ -28,6 +88,31 @@ export function overrideRomKnightEffects(
row: RomGeneratedAbilityLike,
translated: readonly AbilityEffect[],
): readonly AbilityEffect[] | null {
if (row.sourceSkillId === 492935) {
const durationMs = Math.max(0, ...(row.source?.components ?? []).map((component) => (
Math.max(0, Number(component.effectTime ?? 0)) * 1_000
)));
return translated.map((effect) => {
if (effect.kind !== "apply-aura") return effect;
if (effect.aura.modifiers?.some((modifier) => (
modifier.kind === "stat" && modifier.stat === "parry"
))) return {
...effect,
aura: {
...effect.aura,
utilityTags: [...(effect.aura.utilityTags ?? []), ROM_KNIGHT_MASTER_OF_PARRY_TAG],
procs: [...(effect.aura.procs ?? []), ROM_KNIGHT_MASTER_OF_PARRY_PROC],
},
};
// Source component 503192 drives a periodic trigger for the same 15s
// effect. Keep that hidden trigger aura on the component's lifetime too.
if (effect.aura.procs?.some((proc) => proc.id.startsWith("rom-proc-trigger-492935-503192"))) return {
...effect,
aura: { ...effect.aura, durationMs: durationMs || effect.aura.durationMs },
};
return effect;
});
}
if (row.sourceSkillId === 491608 && row.passive) return divinePunishmentPassive(row);
if (row.sourceSkillId === 499934 && row.passive) return [{
kind: "apply-aura",
@@ -44,6 +129,21 @@ export function overrideRomKnightEffects(
miscValue: 0,
triggerSpellId: 499934,
}];
if (row.sourceSkillId === 491635 && row.passive) return [{
kind: "apply-aura",
recipient: "caster",
aura: {
id: "rom-knight-passive-491635",
name: row.name,
disposition: "buff",
durationMs: null,
utilityTags: [ROM_KNIGHT_HOLY_LIGHTS_FURY_TAG],
},
sourceEffectType: -1,
sourceAuraType: -1,
miscValue: 0,
triggerSpellId: 491635,
}];
if (row.sourceSkillId === 490468) return translated.map((effect) => effect.kind === "apply-aura" ? {
...effect,
aura: {
@@ -60,6 +160,23 @@ export function romKnightCastEffects(
effects: readonly AbilityEffect[],
passiveTags: readonly string[] | ReadonlySet<string> = [],
): readonly AbilityEffect[] {
const hasHolyLightsFury = Array.isArray(passiveTags)
? passiveTags.includes(ROM_KNIGHT_HOLY_LIGHTS_FURY_TAG)
: (passiveTags as ReadonlySet<string>).has(ROM_KNIGHT_HOLY_LIGHTS_FURY_TAG);
if (ability.source === "runewaker"
&& ability.classId === "rom-knight"
&& ability.dbcSpellId === 490149
&& hasHolyLightsFury) {
// RuneWaker's local tooltip gives a flat 3-second reduction to Holy Seal.
// The added damage rider has no numeric payload in this source snapshot.
return [...effects, {
kind: "cooldown-reset",
mode: "reduce",
abilityName: "Holy Seal",
amountMs: 3_000,
}];
}
if (ability.source !== "runewaker"
|| ability.classId !== "rom-knight"
|| ability.dbcSpellId !== 490151
@@ -67,7 +184,7 @@ export function romKnightCastEffects(
? passiveTags.includes(ROM_KNIGHT_DIVINE_PUNISHMENT_TAG)
: (passiveTags as ReadonlySet<string>).has(ROM_KNIGHT_DIVINE_PUNISHMENT_TAG))) return effects;
return effects.map((effect) => {
const increasedDamage = effects.map((effect) => {
if (effect.kind !== "damage" && effect.kind !== "dot") return effect;
return {
...effect,
@@ -78,4 +195,25 @@ export function romKnightCastEffects(
...(effect.bonusPowerCoefficient === undefined ? {} : { bonusPowerCoefficient: effect.bonusPowerCoefficient * 1.01 }),
};
});
// Generated passive 491608 includes component 502052: a ten-second, +1%
// Light-damage vulnerability. The generic modifier map treats type 225 as
// Light resistance, which would make the target take less damage despite
// the local tooltip explicitly saying it takes more Light damage.
return [...increasedDamage, {
kind: "apply-aura",
recipient: "ability-target",
aura: {
id: "rom-knight-divine-punishment-light-vulnerability",
name: "Divine Punishment",
disposition: "debuff",
durationMs: 10_000,
modifiers: [{ kind: "damage", direction: "taken", school: "holy", operation: "percent", value: 0.01 }],
dispelCategory: "magic",
},
sourceEffectType: -1,
sourceAuraType: 225,
miscValue: 1,
triggerSpellId: 502052,
}];
}