import { CONST, shim } from './shim.js' function baseMenu (title, targets) { const targetList = targets.map(t => t.name).join(', ') return { menuOptions: { title, defaultButton: 'Cancel', options: {} }, menuData: { inputs: [ { type: 'header', label: title }, { type: 'info', label: `Apply ${title} to ${targetList}` }, { type: 'header', label: 'Global Modifiers' }, { type: 'checkbox', label: 'Glow (+1)' }, { type: 'checkbox', label: 'Shroud (+1)' }, { type: 'checkbox', label: 'Hinder (+1)' }, { type: 'checkbox', label: 'Hurry (+1)' }, { type: 'header', label: 'Power Modifiers' } ], buttons: [ { label: 'Apply', value: 'apply' }, { label: 'Apply with Raise', value: 'raise' }, { label: 'Cancel', value: 'cancel' } ] } } } class ModifierEffects { static glow (basename, durationRounds) { const effectDoc = shim.createEffectDocument( 'icons/magic/light/orb-shadow-blue.webp', 'Glow', durationRounds ) effectDoc.changes = [ { key: '@Skill{Stealth}[system.die.modifier]', mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: -2, priority: 0 } ] return effectDoc } static shroud (basename, durationRounds) { const effectDoc = shim.createEffectDocument( 'icons/magic/perception/shadow-stealth-eyes-purple.webp', 'Shroud', durationRounds ) effectDoc.changes = [ { key: '@Skill{Stealth}[system.die.modifier]', mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: 1, priority: 0 } ] return effectDoc } static hinder (basename, durationRounds) { const effectDoc = shim.createEffectDocument( 'icons/magic/control/debuff-chains-shackle-movement-red.webp', 'Hinder', durationRounds ) effectDoc.changes = [ { key: 'system.stats.speed.value', mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: -2, priority: 0 } ] return effectDoc } static hurry (basename, durationRounds) { const effectDoc = shim.createEffectDocument( 'icons/skills/movement/feet-winged-sandals-tan.webp', 'Hurry', durationRounds ) effectDoc.changes = [ { key: 'system.stats.speed.value', mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: 2, priority: 0 } ] return effectDoc } } function globalModifierEffects (inputs, basename, durationRounds) { const effectDocs = [] const inputIndex = 8 if (inputs[3]) { // glow effectDocs.push(ModifierEffects.glow(basename, durationRounds)) } if (inputs[4]) { // shroud effectDocs.push(ModifierEffects.shroud(basename, durationRounds)) } if (inputs[5]) { // hinder effectDocs.push(ModifierEffects.hinder(basename, durationRounds)) } if (inputs[6]) { // hurry effectDocs.push(ModifierEffects.hurry(basename, durationRounds)) } return { effectDocs, inputIndex } } class PowerMenus { static blind (token, targets) { const { menuOptions, menuData } = baseMenu('Blind', targets) menuData.inputs.push({ type: 'checkbox', label: 'Strong (+1 point)', options: false }) return { menuOptions, menuData } } } class PowerHandlers { static async blind (token, targets, buttons, inputs) { const raise = (buttons === 'raise') const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Blind', 1) const strong = !!inputs[inputIndex] const icon = 'icons/skills/wounds/injury-eyes-blood-red.webp' const changes = [ { key: 'system.stats.globalMods.trait', mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: -2, priority: 0 } ] effectDocs.push( shim.createEffectDocument( icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) ) effectDocs[effectDocs.length - 1].changes = changes if (raise) { effectDocs.push( shim.createEffectDocument( icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) ) effectDocs[effectDocs.length - 1].changes = changes } for (const target of targets) { shim.applyActiveEffects(target, effectDocs) } } } export async function powerEffects (options = {}) { // options available const token = 'token' in options ? options.token : [] const targets = 'targets' in options ? Array.from(options.targets) : [] const item = 'item' in options ? options.item : null const name = 'name' in options ? options.name : ( item !== null ? item.name : null) const lcName = name.toLowerCase() if (lcName in PowerMenus && lcName in PowerHandlers) { const { menuOptions, menuData } = PowerMenus[lcName](token, targets) const { buttons, inputs } = await shim.warpgateMenu(menuData, menuOptions) if (buttons && buttons !== 'cancel') { await PowerHandlers[lcName](token, targets, buttons, inputs) } } }