Update class mechanics, stat rulesets, and CoA reference catalogs

This commit is contained in:
phenom committed 2026-10-04 12:56:30 -04:00
1 parent b16821e92e
commit 39458d5de6
221 files changed
+2584962 -568

No files matched your search

+108 -1
View File
@@ -11,7 +11,13 @@ import { clearPartyRuntimeRegistry, registerPartyRuntimePosition, updatePartyRun
import { resolveDamageValue, resolveStatValue } from "./combatAuras";
import { romAbilityNeedsRangedWeapon } from "./romCombatMechanics";
import { PLAYER_AURA_ENTITY_ID, useCombatStore } from "./combatStore";
import { romScoutRogueProcActionSpec } from "./romScoutRogueOverrides";
import {
overrideRomScoutRogueEffects,
ROM_SCOUT_MAGE_WIND_RETURN_TAG,
ROM_SCOUT_PRIEST_REVIVAL_ENGRAVING_TAG,
ROM_SCOUT_WARDEN_FOREST_GUIDANCE_TAG,
romScoutRogueProcActionSpec,
} from "./romScoutRogueOverrides";
describe("RoM Scout ranged weapon masteries", () => {
beforeEach(() => {
@@ -299,6 +305,107 @@ describe("RoM Scout ranged weapon masteries", () => {
});
});
describe("RoM Scout paired passive source markers", () => {
beforeEach(() => {
clearMobRuntimeRegistry();
clearPartyRuntimeRegistry();
resetPartyRuntimeClock();
});
it.each([
{
secondaryClassId: "rom-warden" as const,
sourceSkillId: 499575,
triggerSkillId: 499576,
name: "Forest Guidance",
tag: ROM_SCOUT_WARDEN_FOREST_GUIDANCE_TAG,
},
{
secondaryClassId: "rom-mage" as const,
sourceSkillId: 499548,
triggerSkillId: 499549,
name: "Wind Return",
tag: ROM_SCOUT_MAGE_WIND_RETURN_TAG,
},
{
secondaryClassId: "rom-priest" as const,
sourceSkillId: 499552,
triggerSkillId: 490443,
name: "Revival Engraving",
tag: ROM_SCOUT_PRIEST_REVIVAL_ENGRAVING_TAG,
},
])("keeps $name source components off the owner until their trigger is supported", ({
secondaryClassId, sourceSkillId, triggerSkillId, name, tag,
}) => {
const buildAbilities = abilitiesForCharacter("rom-scout", secondaryClassId);
const passive = buildAbilities.find((ability) => ability.dbcSpellId === sourceSkillId);
expect(passive?.passive).toBe(true);
expect(buildAbilities.some((ability) => ability.dbcSpellId === triggerSkillId)).toBe(false);
const marker = passive?.effects.find((effect) => effect.kind === "apply-aura");
expect(marker?.kind).toBe("apply-aura");
if (marker?.kind !== "apply-aura") return;
expect(marker.aura.utilityTags).toContain(tag);
expect(marker.aura.modifiers ?? []).toEqual([]);
expect(marker.aura.procs ?? []).toEqual([]);
useCombatStore.getState().initializeCharacter({
classId: "rom-scout",
secondaryClassId,
raceId: "rom-elf",
level: 79,
});
const ownerAuras = useCombatStore.getState().auras.filter((aura) => aura.targetId === PLAYER_AURA_ENTITY_ID);
const activeMarker = ownerAuras.find((aura) => aura.definition.utilityTags?.includes(tag));
expect(activeMarker).toBeDefined();
expect(activeMarker?.definition.modifiers ?? []).toEqual([]);
expect(ownerAuras.some((aura) => aura.definition.name.startsWith(name)
&& (aura.definition.modifiers?.length ?? 0) > 0)).toBe(false);
});
it("limits suppression to each exact passive row and pair", () => {
const translated = [{
kind: "apply-aura" as const,
recipient: "caster" as const,
aura: {
id: "source-forest-guidance-test",
name: "Forest Guidance source component",
disposition: "buff" as const,
durationMs: 10_000,
modifiers: [{
kind: "damage" as const,
direction: "taken" as const,
school: "physical" as const,
operation: "percent" as const,
value: 0.02,
}],
},
sourceEffectType: -1,
sourceAuraType: 143,
miscValue: -2,
triggerSpellId: 623117,
}];
const baseRow = {
name: "Forest Guidance",
description: "A source component test row.",
passive: true,
};
for (const [sourceSkillId, secondaryClassId, triggerSkillId] of [
[499575, "rom-warden", 499576],
[499548, "rom-mage", 499549],
[499552, "rom-priest", 490443],
] as const) {
expect(overrideRomScoutRogueEffects({
...baseRow, sourceSkillId, classId: "rom-scout", secondaryClassId: "rom-rogue",
}, translated)).toBeNull();
expect(overrideRomScoutRogueEffects({
...baseRow, sourceSkillId: triggerSkillId, classId: "rom-scout", secondaryClassId,
}, translated)).toBeNull();
}
});
});
describe("RoM Warrior/Scout Calm", () => {
beforeEach(() => {
clearMobRuntimeRegistry();