import { requestRollFromTokens } from './helpers.js'; const enrichers = [ { id: 'mb-swade-damage', pattern: /@SWADEDamage\[\s*(?[\d+-dx]+)\s*\](?:\(\s*(?\d+)\s*\))?(?:\{(?[^}]+)\})?/g, enricher: swadeDamageEnricher, }, { id: 'mb-swade-trait', pattern: /@SWADERequestRoll\[\s*(?skill|attribute),(?[\w\s-]+)(?:,(?\d+))?\s*\](?:\(\s*(?[-+]?\d+)(?:,(?[^)]+))?\s*\))?(?:\{(?[^}]+)\})?/g, enricher: swadeTraitRollEnricher, }, ]; function swadeDamageEnricher(match, options) { if (!match.groups) { return null; } const roll = match.groups.roll; const ap = parseInt(match.groups.ap ?? '0'); const flavor = match.groups.flavor ?? ''; const dataset = { roll, ap, flavor, rollType: 'damage' }; let text = 'Damage'; if (flavor) { text += ` ${flavor}`; } text += `: ${roll}`; if (ap) { text += ` AP ${ap}`; } if (!game.user.isGM) { const span = document.createElement('span'); span.innerHTML = text; return span; } const anchor = document.createElement('a'); const classes = ['content-link', 'mb-swade-roll-damage-link', 'mb-swade-roll-link']; for (const cls of classes) { anchor.classList.add(cls); } for (let [k, v] of Object.entries(dataset)) { anchor.dataset[k] = v; } anchor.innerHTML = ` ${text}`; return anchor; } function swadeTraitRollEnricher(match, options) { if (!match.groups) { return null; } const traitType = match.groups.traitType; const traitName = match.groups.traitName; if (!traitType || !traitName) { return null; } const tn = parseInt(match.groups.tn ?? '4'); const modVal = parseInt(match.groups.modVal ?? '0'); const modDesc = match.groups.modDesc ?? 'Circumstance'; const flavor = match.groups.flavor ?? ''; const dataset = { traitType, traitName, tn, modVal, modDesc, flavor, rollType: 'trait' }; const displayTraitName = (traitName[0].toUpperCase() + traitName.slice(1).toLowerCase()).replace(/[-_]/, ' '); let text = `Request Roll: ${displayTraitName}`; if (modVal != 0) { text += ` ${modVal}`; } if (tn !== 4) { text += ` TN: ${tn}`; } if (flavor) { text += ` (${flavor})`; } const anchor = document.createElement('a'); const classes = ['content-link', 'mb-swade-roll-request-link', 'mb-swade-roll-link']; for (const cls of classes) { anchor.classList.add(cls); } for (let [k, v] of Object.entries(dataset)) { anchor.dataset[k] = v; } anchor.innerHTML = ` ${text}`; return anchor; } function onSwadeRollLink(ev) { console.log('SWADE ROLL', ev); const targetElement = ev.target; if (!targetElement.closest('a.mb-swade-roll-link')) return; ev.preventDefault(); const rollType = targetElement.dataset.rollType; switch (rollType) { case 'trait': return onRequestTraitRollLink(targetElement); case 'damage': return onDamageRollLink(targetElement); } } function onRequestTraitRollLink(targetElement) { const tokens = game.user.targets.size > 0 ? Array.from(game.user.targets) : canvas.tokens.controlled; console.log(tokens); if (tokens.length < 1) { foundry.ui.notifications.error('Please target or select some tokens.'); return; } const { traitType, traitName, modDesc, flavor } = targetElement.dataset; const tn = parseInt(targetElement.dataset.tn); const modVal = parseInt(targetElement.dataset.modVal); const options = { targetNumber: 4, flavor }; if (tn != 4) { options.targetNumber = tn; } if (modVal != 0) { options.mods = [{ label: modDesc, value: modVal }]; } requestRollFromTokens(tokens, traitType, traitName, options); } function onDamageRollLink(targetElement) { const roll = targetElement.dataset.roll; const ap = parseInt(targetElement.dataset.ap); let flavor = targetElement.dataset.flavor; const options = {}; if (ap > 0) { flavor = `${flavor ? flavor + ' - ' : ''}AP: ${ap}`; options.ap = ap; } new CONFIG.Dice.DamageRoll(roll, null, options).toMessage({ flavor }); } export function setupEnrichers() { Hooks.once('ready', async () => { for (const enricher of enrichers) { CONFIG.TextEditor.enrichers.push(enricher); } }); Hooks.on('renderApplicationV1', (application, html, data) => { $(html) .find('a.mb-swade-roll-link') .each((i, el) => $(el).click(onSwadeRollLink)); }); Hooks.on('renderApplicationV2', (application, element, context, options) => { element.querySelectorAll('a.mb-swade-roll-link').forEach((el) => el.addEventListener('click', onSwadeRollLink)); }); Hooks.on('renderChatMessageHTML', (message, html, context) => { html.querySelectorAll('a.mb-swade-roll-link').forEach((el) => el.addEventListener('click', onSwadeRollLink)); }); }