Complete RoM pair elite mechanics and creature family rules

This commit is contained in:
phenom committed 2026-09-23 19:38:13 -04:00
1 parent c8b3a3d95a
commit 0206fda9e2
21 files changed
+1082 -134

No files matched your search

+64 -14
View File
@@ -161,10 +161,10 @@ export function overrideRomScoutRogueEffects(
customProc(493257, "hit", "rom-reclaim-energy", { chance: 0.25 }));
case 499476:
return taggedPassive(499476, "Toxic Splash", "rom-toxic-splash",
customProc(499476, "hit", "rom-toxic-splash"));
// 493296 replaces Infection and can generate 20 rage on a successful hit.
customProc(499476, "hit", "rom-infection-rage", { chance: 0.25 }));
case 499480:
return taggedPassive(499480, "Poison Battle Technique", "rom-poison-battle-technique",
customProc(499480, "hit", "rom-poison-battle-technique"));
return taggedPassive(499480, "Poison Battle Technique", "rom-poison-battle-technique");
default:
return null;
}
@@ -180,7 +180,8 @@ export function romScoutRogueCastEffects(
const passives = new Set(passiveTags);
const target = new Set(targetTags);
if (ability.dbcSpellId === 490457) {
const masteryFactor = passives.has("rom-master-reflected-shot") ? 1.2 : 1;
// Replacement 499535 / component 623051 raises ranged DPS from 0.75 to 0.85.
const masteryFactor = passives.has("rom-master-reflected-shot") ? 0.85 / 0.75 : 1;
return effects.map((effect) => effect.kind === "damage" ? {
...effect,
coefficient: effect.coefficient * masteryFactor,
@@ -192,6 +193,40 @@ export function romScoutRogueCastEffects(
falloffPerJump: passives.has("rom-poisonous-spit") ? 1 : effect.falloffPerJump,
} : effect);
}
if (ability.dbcSpellId === 490451 && passives.has("rom-meridian-attack")) {
// 499537/623061 replaces Wrist Attack: -30 physical and magical damage for 10s.
return effects.map((effect) => effect.kind === "apply-aura" && effect.recipient !== "caster"
? {
...effect,
aura: {
...effect.aura,
durationMs: 10_000,
modifiers: [
{ kind: "damage" as const, direction: "dealt" as const, school: "physical" as const, operation: "percent" as const, value: -0.30 },
{ kind: "damage" as const, direction: "dealt" as const, attackKind: "spell" as const, operation: "percent" as const, value: -0.30 },
],
},
} : effect);
}
if (ability.dbcSpellId === 492920 && passives.has("rom-toxic-splash")) {
// 499477 replaces Poison Spray. 493296 is its additional infection hit;
// 622992 is the six-second poison it spreads to nearby targets.
return [
...effects.filter((effect) => effect.kind !== "dot"),
// 620287: 0.85 main-hand DPS + 0.20 Dexterity, then +7.5% skill-level DPS.
{ kind: "damage", coefficient: 1.11375, coefficientPerLevel: 0.06375, sourceLevel: 1 },
{ kind: "dot", coefficient: 0, basePoints: 16.2, pointsPerLevel: 4.2,
sourceLevel: 1, ticks: 3, intervalMs: 2_000, tag: "rom-622992" },
];
}
if (ability.dbcSpellId === 490133 && passives.has("rom-poison-battle-technique")) {
// 499481/620286 raises Whirlwind's main-hand DPS coefficient 0.70 -> 0.75.
return effects.map((effect) => effect.kind === "damage" ? {
...effect,
coefficient: effect.coefficient * 0.75 / 0.70,
...(effect.coefficientPerLevel === undefined ? {} : { coefficientPerLevel: effect.coefficientPerLevel * 0.75 / 0.70 }),
} : effect);
}
if (ability.dbcSpellId === 490454 && passives.has("rom-lasso-master")) {
return [...effects, {
kind: "status",
@@ -216,6 +251,17 @@ export function romScoutRogueCastEffects(
return effects;
}
/** 499481/622993 adds a hit only to targets already carrying 622992's poison. */
export function romScoutRogueWhirlwindBonusEffect(
ability: AbilityDefinition,
passiveTags: readonly string[],
targetTags: readonly string[],
): Extract<AbilityEffect, { kind: "damage" }> | null {
if (ability.dbcSpellId !== 490133 || !passiveTags.includes("rom-poison-battle-technique")
|| !targetTags.includes("rom-622992")) return null;
return { kind: "damage", coefficient: 0.50, coefficientPerLevel: 0.03, sourceLevel: 1 };
}
export type RomScoutRogueProcActionSpec =
| {
readonly kind: "aura";
@@ -246,13 +292,13 @@ export type RomScoutRogueProcActionSpec =
/**
* A pure result for combat-store proc execution. `triggeringSourceSkillId` is
* the RuneWaker skill ID of the attack that generated the hit/crit event.
* The level-60/70 replacement skills 499477 and 499481 are absent from the
* playable source catalog; those unresolved actions deliberately return null.
* The level-60/70 replacement skills 499477 and 499481 are represented by
* their learned passive tags and base-ID cast upgrades, not custom procs.
*/
export function romScoutRogueProcActionSpec(
actionId: string,
triggeringSourceSkillId: number,
casterPoisonous: boolean,
_casterPoisonous: boolean,
): RomScoutRogueProcActionSpec | null {
switch (actionId) {
case "rom-exploiting-shot":
@@ -286,21 +332,21 @@ export function romScoutRogueProcActionSpec(
provenance: "hybrid-estimate",
};
case "rom-poisonous-spit":
if (!casterPoisonous || ![490457, 490424].includes(triggeringSourceSkillId)) return null;
if (![490457, 490424].includes(triggeringSourceSkillId)) return null;
return {
kind: "dot",
recipient: "target",
effect: {
kind: "dot",
coefficient: 0,
basePoints: 16,
pointsPerLevel: 8,
basePoints: 7.1,
pointsPerLevel: 2.1,
sourceLevel: 1,
ticks: 5,
ticks: 4,
intervalMs: 2_000,
tag: "rom-poisonous-spit",
},
provenance: "hybrid-estimate", // 501690 poison scale is a proxy; Poison Powder payload is not in this catalog.
provenance: "source", // 499535/503522. Poison Powder is supplied without inventory gating.
};
case "rom-reclaim-energy":
if (triggeringSourceSkillId === 490306) return {
@@ -310,8 +356,12 @@ export function romScoutRogueProcActionSpec(
kind: "resource", recipient: "caster", resource: "rage", amount: 10, provenance: "hybrid-estimate",
};
return null;
case "rom-toxic-splash": // Requires absent replacement skill 499477 and triggered payload 493296.
case "rom-poison-battle-technique": // Requires absent replacement skill 499481.
case "rom-infection-rage":
return triggeringSourceSkillId === 492625
? { kind: "resource", recipient: "caster", resource: "rage", amount: 20, provenance: "hybrid-estimate" }
: null;
case "rom-toxic-splash": // 499477 is applied as an upgrade of base 492920.
case "rom-poison-battle-technique": // 499481 is applied as an upgrade of base 490133.
return null;
default:
return null;