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

+25 -2
View File
@@ -22,6 +22,7 @@ function isMeaningfulEffect(effect: AbilityEffect): boolean {
return (
output.coefficient > 0
|| (output.coefficientPerLevel ?? 0) > 0
|| (output.kind === "damage" && (output.weaponDpsCoefficient ?? 0) > 0)
|| (output.basePoints ?? 0) > 0
|| (output.pointsPerLevel ?? 0) > 0
|| (output.kind === "heal" && (output.percentMaxHealth ?? 0) > 0)
@@ -380,6 +381,23 @@ describe("executable RuneWaker ability mappings", () => {
});
it("gives every active base skill and playable rank a concrete runtime effect", () => {
const generatedSkillIds = new Set(generated.skills.map((skill) => skill.id));
const runtimeOnly = ROM_ALL_ABILITIES.filter((ability) => !generatedSkillIds.has(ability.id));
const generatedRankCount = generated.skills.reduce((count, skill) => count + skill.ranks.length, 0);
// Snapshot accounting is source-backed: 932 generated rows carry 937
// source ranks. Four explicit runtime additions have no separate ranks:
// Devotion Halo, CoA Blocking Stance, CoA Probing Attack, and CoA Enraged.
expect(generated.skills).toHaveLength(932);
expect(generatedRankCount).toBe(937);
expect(ROM_ALL_ABILITIES).toHaveLength(936);
expect(runtimeOnly.map((ability) => ability.id).sort()).toEqual([
"rom-priest-rom-knight-elite-70-devotion-halo",
"rom-warlock-rom-warrior-general-coa-499871",
"rom-warrior-rom-knight-elite-50-coa-493287",
"rom-warrior-rom-rogue-elite-50-coa-493283",
]);
expect(runtimeOnly.every((ability) => ability.ranks?.length === 0 || ability.ranks === undefined)).toBe(true);
const versions = ROM_ALL_ABILITIES.flatMap((ability) => [
{ name: ability.name, rank: 0, passive: ability.passive, effects: ability.effects },
...(ability.ranks ?? []).map((rank) => ({
@@ -390,7 +408,7 @@ describe("executable RuneWaker ability mappings", () => {
})),
]);
expect(versions).toHaveLength(1_864);
expect(versions).toHaveLength(1_873);
const scriptOnly = ROM_ALL_ABILITIES
.filter((ability) => !ability.passive && ability.effects.every((effect) => effect.kind === "scripted"))
.map((ability) => ability.name)
@@ -471,6 +489,11 @@ describe("executable RuneWaker ability mappings", () => {
expect(named("Holy Strike").effects.filter((effect) => effect.kind === "dot")).toHaveLength(1);
expect(named("Holy Seal").effects.filter((effect) => effect.kind === "dot")).toHaveLength(1);
expect(named("Punishment").effects.filter((effect) => effect.kind === "damage")).toHaveLength(1);
expect(named("Punishment").effects.filter((effect) => effect.kind === "dot")).toHaveLength(1);
expect(named("Punishment").effects.filter((effect) => effect.kind === "dot")).toHaveLength(0);
expect(sourceSkill(499909).effects).toEqual(expect.arrayContaining([
{ kind: "combo", amount: -5 },
expect.objectContaining({ kind: "damage" }),
]));
expect(sourceSkill(499909).effects.filter((effect) => effect.kind === "dot")).toHaveLength(0);
});
});