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
@@ -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);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user