forked from phenom/healer-man
Update Healer Man server
This commit is contained in:
1 parent
4c768fbec6
commit
b16821e92e
330 files changed
+35406
-1760
No files matched your search
@@ -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[] => {
|
||||
|
||||
Reference in new issue
Block a user