Release Healer Man 0.1.13

This commit is contained in:
phenom committed 2026-09-01 16:31:26 -04:00
1 parent 65e24f644e
commit 67d7a8ebe7
324 files changed
+917 -48

No files matched your search

@@ -3,10 +3,28 @@ import fs from "node:fs";
import path from "node:path";
import test from "node:test";
import { fileURLToPath } from "node:url";
import { decodeWotlkM2Effects, parseDbc, parseRunewakerImageRecords } from "./generate-manifest.mjs";
import {
decodeWotlkM2Effects,
decodeWotlkSpellVisualKitRow,
parseDbc,
parseRunewakerImageRecords,
} from "./generate-manifest.mjs";
const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
test("keeps WotLK SpellVisualKit SoundID out of the model effect list", () => {
const fields = Array.from({ length: 17 }, () => 0);
fields[3] = 101;
fields[14] = 112;
fields[15] = 3_085;
fields[16] = 999;
assert.deepEqual(decodeWotlkSpellVisualKitRow({ uint: (field) => fields[field] ?? 0 }), {
effects: [101, 112],
soundId: 3_085,
});
});
function tinyDbc() {
const strings = Buffer.from("\0hello\0", "utf8");
const buffer = Buffer.alloc(20 + 8 + strings.length);
@@ -257,6 +275,38 @@ test("decodes real local WotLK Holy Smite particles and ribbons", {
assert.ok(decoded.ribbons[0].tracks.visibility.firstSequence.samples.length > 0);
});
test("generated Priest mappings keep SpellVisualKit sounds out of visual phases", () => {
const manifest = JSON.parse(fs.readFileSync(
path.join(projectRoot, "public", "assets", "game", "combat-effects", "manifest.json"),
"utf8",
));
const entry = (spellId) => manifest.entries.find((candidate) => (
candidate.source === "wow335" && candidate.spellId === spellId
));
const models = (spellId, phase) => (entry(spellId)?.phases?.[phase] ?? []).map((asset) => asset.model);
const smiteRanks = [585, 591, 598, 984, 1004, 6060, 10933, 10934, 25363, 25364, 48122, 48123];
const shadowWordPainRanks = [589, 594, 970, 992, 2767, 10892, 10893, 10894, 25367, 25368, 48124, 48125];
for (const spellId of smiteRanks) {
assert.deepEqual(models(spellId, "cast-start"), ["Spells/Holy_Precast_Low_Hand.mdx"]);
assert.deepEqual(models(spellId, "impact"), ["Spells/HolySmite_Low_Chest.mdx"]);
}
for (const spellId of shadowWordPainRanks) {
assert.deepEqual(models(spellId, "cast-start"), ["Spells/Shadow_Precast_Low_Hand.mdx"]);
assert.deepEqual(models(spellId, "impact"), ["Spells/ShadowWordPain_Chest.mdx"]);
}
assert.deepEqual(models(17, "aura-start"), ["Spells/HolyDivineShield_State_Base.mdx"]);
const smite = entry(585);
assert.equal(smite.phases.impact[0].effectGraphUrl,
"/assets/game/combat-effects/original/wow335/priest/graphs/holysmite-low-chest-5e638a90a1be.json");
assert.ok((smite.sounds ?? []).some((sound) => sound.sourcePath === "Sound/Spells/HolyBolt.wav"));
const pain = entry(589);
assert.equal(pain.phases.impact[0].effectGraphUrl,
"/assets/game/combat-effects/original/wow335/priest/graphs/shadowwordpain-chest-8c57a0056fda.json");
assert.ok((pain.sounds ?? []).some((sound) => sound.sourcePath === "Sound/Spells/ShadowWordPainTarget.wav"));
});
test("generated coverage packages every referenced source sound", () => {
const manifest = JSON.parse(fs.readFileSync(path.join(projectRoot, "public", "assets", "game", "combat-effects", "manifest.json"), "utf8"));
assert.equal(manifest.coverage.requested, manifest.coverage.authentic + manifest.coverage.fallback);