const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens; async function main() { let tokens = Array.from(game.user.targets); if (tokens.length < 1) { tokens = canvas.tokens.controlled; } if (tokens.length < 1) { ui.notifications.error('Please target or select some tokens'); return; } const attributes = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor']; const skillSet = new Set(); for (const token of tokens) { const tokenSkills = token.actor.items.filter( (i) => i.type === 'skill' && !['Untrained', 'Untrained Attempt'].includes(i.name), ); for (const skill of tokenSkills) { skillSet.add(skill.name); } } const attributeOptions = attributes .map( (a) => ` `, ) .join(''); const skillOptions = Array.from(skillSet) .sort() .map( (s) => ` `, ) .join(''); const content = `
`; const buttons = { ok: { label: 'Request Roll', callback: (html) => { const form = html[0].querySelector('form'); const formDataObject = new FormDataExtended(form).object; const rollMod = parseInt(formDataObject.mod); const rollModDesc = formDataObject.modDesc; const rollParts = formDataObject.trait.split('|'); const rollType = rollParts[0] === 'a' ? 'attribute' : 'skill'; const rollDesc = rollParts[1]; const targetNumber = parseInt(formDataObject.tn); const options = { targetNumber }; if (rollMod !== 0) { options.mods = [{ label: rollModDesc, value: rollMod }]; } requestRollFromTokens(tokens, rollType, rollDesc, options); }, }, cancel: { label: 'Cancel', }, }; new Dialog({ title: 'Request roll', content, buttons, }).render(true); } main();