Update class mechanics, stat rulesets, and CoA reference catalogs
This commit is contained in:
1 parent
b16821e92e
commit
39458d5de6
221 files changed
+2584962
-568
No files matched your search
@@ -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();
|
||||
|
||||
Reference in new issue
Block a user