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 // 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 options.requestingUserId = shim.user.id const promises = [] for (const token in tokens) { const owner = shim.warpgateUtil.firstOwner(token.document) promises.append(shim.socket.executeAsUser(requestTokenRoll, owner.id, token.scene.id, token.id, rollType, rollDesc, options)) } results = await Promise.allSettled(promises) return results } export async function requestTokenRoll ( sceneId, tokenId, rollType, rollDesc, options ) { const requestingUser = shim.users.get(options.requestingUserId) const scene = shim.scenes.get(sceneId) const token = scene.tokens.get(tokenId) 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) } } let rollFunc = token.actor.rollAttribute let rollId = rollDesc.toLowerCase() if (rollType === 'skill') { rollFunc = token.actor.rollSkill rollId = token.actor.items.find(i => ( (i.system.swid === rollDesc.toLowerCase() || i.name.toLowerCase() === rollDesc.toLowerCase()) && i.type === 'skill')) } const rollOpts = { title: options?.title || `${requestingUser.name} requests a ${rollDesc} roll` } if (additionalMods.length > 0) { rollOpts.additionalMods = additionalMods } const result = await rollFunc(rollId, rollOpts) return { sceneId, tokenId, result } }