const ICON = 'icons/weapons/swords/sword-flanged-lightning.webp' let tokens = []; let targets = Array.from(game.user.targets); if (targets.length > 0) { tokens = targets; } else if (canvas.tokens.controlled.length > 0) { tokens = canvas.tokens.controlled; } if (tokens.length > 0) { main(tokens); } else { ui.notifications.error("Please select or target a token"); } async function main(tokens) { let tokenList = tokens.map(t => t.name).join(", "); let menuOptions = { title: 'Smite', defaultButton: "cancel", options: {} } let menuData = { inputs: [ {type: 'header', label: 'Smite'}, {type: 'info', label: `Apply Smite to ${tokenList}`}, ], buttons: [ {label: "Apply", value: "apply"}, {label: "Apply with Raise", value: "raise"}, {label: "Cancel", value: "cancel"} ] } let tokenWeapons = {}; let index = 1; for (const token of tokens) { index += 2; tokenWeapons[token.id] = index; menuData.inputs.push({type: 'info', label: `

${token.name}

`}); let weapons = token.actor.items.filter(i => i.type == 'weapon').map(i => i.name); weapons.unshift(""); menuData.inputs.push({type: 'select', label: token.name, options: weapons}); } let {buttons, inputs} = await warpgate.menu(menuData, menuOptions); for (let tokenid in tokenWeapons) { tokenWeapons[tokenid] = inputs[tokenWeapons[tokenid]]; } if (buttons != "cancel") { await createEffect(tokens, tokenWeapons, buttons); } console.log(buttons, tokenWeapons); } async function createEffect(tokens, tokenWeapons, choice) { const effectIcon = ICON; const changeValue = (choice == 'raise' ? "+4" : "+2"); for (const token of tokens) { const weaponName = tokenWeapons[token.id]; const weaponId = token.actor.items.getName(weaponName)?.id const changeKey = `@Weapon{${weaponName}}[data.damage]` if (!weaponId) { continue } const effectName = `Smite (${weaponName})`; const effectId = `smite${choice}_${weaponId}`; let effectData = { icon: effectIcon, id: effectId, label: effectName, duration: {rounds: 5}, flags: { swade: { expiration: 3, loseTurnOnHold: true } }, changes: [ { key: changeKey, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, value: changeValue, priority: 0 } ], }; let mutate = { embedded: { ActiveEffect: { } } }; mutate.embedded.ActiveEffect[effectName] = effectData; let mutateOptions = { comparisonKeys: {'ActiveEffect': 'label'}, name: effectName, permanent: true, description: effectName, } await warpgate.mutate(token.document, mutate, {}, mutateOptions); } }