import { shim } from './shim.js' export async function requestRollFromTokens (tokens, rollType, rollDesc, options = {}) { // tokens: list of tokens to request a roll from // rollType: 'attribute' or 'skill // rollDesc: name of attribute or skill // options: // title: title for the roll dialog. Will have "- {{ token name }}" // appended // flavour: flavor text for the roll card. Defaults to title // mods: list of modifiers {label: "", value: 0, ignore: false} // modCallback: callback function that takes a token and returns a list of // modifiers in the same format as modifiers, above const requestingUser = shim.user const title = options?.title || `${requestingUser.name} requests a ${rollDesc} roll` const flavour = options?.flavour || options?.flavor || title const promises = [] for (const token of tokens) { const owner = shim.warpgateUtil.firstOwner(token.document) const rollOpts = { title: `${title} - ${token.name}`, flavour } const additionalMods = [] if ('mods' in options) { for (const mod of options.mods) { additionalMods.push(mod) } } if ('modCallback' in options) { const tokenMods = await options.modCallback(token) for (const tm of tokenMods) { additionalMods.push(tm) } } if (additionalMods.length > 0) { rollOpts.additionalMods = additionalMods } promises.push(shim.socket.executeAsUser(requestTokenRoll, owner.id, token.scene.id, token.id, rollType, rollDesc, rollOpts)) } const results = await Promise.allSettled(promises) return results } export async function requestTokenRoll ( sceneId, tokenId, rollType, rollDesc, options ) { const scene = shim.scenes.get(sceneId) const token = scene.tokens.get(tokenId) let rollFunc = 'rollAttribute' let rollId = rollDesc.toLowerCase() if (rollType === 'skill') { rollFunc = 'rollSkill' rollId = token.actor.items.filter(i => i.type === 'skill').find(i => ( i.system.swid === rollDesc.toLowerCase() || i.name.toLowerCase() === rollDesc.toLowerCase()))?.id } const result = await token.actor[rollFunc](rollId, options) return { sceneId, tokenId, result } }