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 menuData = { inputs: [ { type: 'info', label: `Requesting roll from ${tokens.map(t => t.name).join(', ')}` }, { type: 'select', label: 'Trait to roll', options: [] }, { type: 'number', label: 'Roll Modifier', options: 0 }, { type: 'text', label: 'Roll Modifier Description', options: 'Roll Modifier' } ], buttons: [ { label: 'Request roll', value: 'ok', default: true }, { label: 'Cancel', value: 'cancel' } ] } const menuConfig = { title: 'Request roll...' } for (const attribute of ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor']) { menuData.inputs[1].options.push( { html: `Attribute | ${attribute}`, value: `a|${attribute.toLowerCase()}` } ) } const skillSet = new Set() for (const token of tokens) { const skills = token.actor.items.filter(i => i.type === 'skill' && !['Untrained', 'Unskilled Attempt'].includes(i.name)) for (const skill of skills) { skillSet.add(skill.name) } } for (const skill of Array.from(skillSet).sort()) { menuData.inputs[1].options.push( { html: `Skill | ${skill}`, value: `s|${skill.toLowerCase()}` }) } menuData.inputs[1].options.push( { html: 'Skill | Untrained', value: 's|NOSKILL' }) const result = await warpgate.menu(menuData, menuConfig) console.log(result) } main()