Files

60 lines
2.2 KiB
TypeScript

/**
* Macro parser. Reads hand-coded macro source files from `scripts/macros/*.js`
* and emits ParsedDoc[] for the build pipeline. Macros are not parsed from
* books - they're a curated set of GM/player utilities.
*/
import { readFileSync } from 'node:fs';
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import type { ParsedDoc, ParserContext, ParserFn } from './types';
const __dirname = dirname(fileURLToPath(import.meta.url));
const macrosDir = resolve(__dirname, '..', 'macros');
interface MacroDef {
id: string;
name: string;
file: string;
img: string;
}
const MACROS: MacroDef[] = [
{ id: 'pool-roll', name: 'Rzut Puli d6', file: 'pool-roll.js', img: 'icons/svg/d20.svg' },
{ id: 'attribute-check', name: 'Test Atrybutu', file: 'attribute-check.js', img: 'icons/svg/dice-target.svg' },
{ id: 'apply-condition', name: 'Nałóż Przypadłość', file: 'apply-condition.js', img: 'icons/svg/aura.svg' },
{ id: 'take-breather', name: 'Chwila Wytchnienia', file: 'take-breather.js', img: 'icons/svg/clockwork.svg' },
{ id: 'short-rest', name: 'Krótki Odpoczynek', file: 'short-rest.js', img: 'icons/svg/regen.svg' },
{ id: 'long-rest', name: 'Długi Odpoczynek', file: 'long-rest.js', img: 'icons/svg/sun.svg' },
{ id: 'group-cast-helper', name: 'Pomocnik Rzucania Grupowego', file: 'group-cast-helper.js', img: 'icons/svg/upgrade.svg' },
{ id: 'refill-zeal', name: 'Doładuj Zapał', file: 'refill-zeal.js', img: 'icons/svg/lightning.svg' },
];
export const parseMacros: ParserFn = async (_ctx: ParserContext): Promise<ParsedDoc[]> => {
const docs: ParsedDoc[] = [];
for (const m of MACROS) {
let command = '';
try {
command = readFileSync(resolve(macrosDir, m.file), 'utf8');
} catch (err) {
console.warn(`[macro-parser] could not read ${m.file}: ${(err as Error).message}`);
continue;
}
docs.push({
id: m.id,
name: m.name,
documentType: 'Item',
subType: 'macro',
pack: 'hbm-macros',
source: { book: 'podrecznik-gry' },
system: {
type: 'script',
scope: 'global',
command,
img: m.img,
},
});
}
return docs;
};