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 = `

Requesting roll from ${tokens.map((t) => t.name).join(', ')}.

`; const buttons = [ { action: "submit", label: 'Request Roll', callback: (event, button, dialog) => { const form = button.form; const formDataObject = new foundry.applications.ux.FormDataExtended(form).object; console.log(formDataObject); 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); }, }, { action: "cancel", label: 'Cancel', }, ]; new foundry.applications.api.DialogV2({ window { title: 'Request roll' }, content, buttons, }).render(true); } main();