forked from phenom/healer-man
Update Healer Man server
This commit is contained in:
1 parent
35dfdaed61
commit
4fb7a0b9c8
161 files changed
+24618
-529
No files matched your search
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user