forked from phenom/healer-man
Update Healer Man server
This commit is contained in:
1 parent
f90ba7d989
commit
189b94d6b7
51 files changed
+3448
-154
No files matched your search
@@ -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 },
|
||||
];
|
||||
|
||||
Reference in new issue
Block a user