From ec5e9f770b495558bb1d39e7e42f7e3d96ffa1c7 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Mon, 4 Sep 2023 22:10:51 -0500 Subject: [PATCH] boost/lower added to new effect macro --- scripts/powerEffects.js | 117 +++++++++++++++++++++++++++++++++++----- scripts/shim.js | 7 ++- 2 files changed, 111 insertions(+), 13 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index aa9a9ae..cfc3070 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -116,20 +116,69 @@ function globalModifierEffects (inputs, basename, durationRounds) { return { effectDocs, inputIndex } } -class PowerMenus { - static blind (token, targets) { +const PowerMenus = { + blind: function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Blind') + return null + } const { menuOptions, menuData } = baseMenu('Blind', targets) menuData.inputs.push({ type: 'checkbox', label: 'Strong (+1 point)', options: false }) - return { menuOptions, menuData } + return { menuOptions, menuData, extra: {} } + }, + + 'boost/lower trait': function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Boost/Lower Trait') + return null + } + const { menuOptions, menuData } = baseMenu('Boost/Lower Trait', targets) + let traitOptions = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'] + const allSkills = [] + const traits = {} + for (const traitName of traitOptions) { + const lower = traitName.toLowerCase() + traits[traitName] = { + name: traitName, + type: 'attribute', + modkey: `system.attributes.${lower}.die.modifier`, + diekey: `system.attributes.${lower}.die.sides` + } + } + for (const token of targets) { + const skills = token.actor.items.filter(item => item.type === 'skill') + for (const skill of skills) { + const name = skill.name + traits[name] = { + name, + type: 'skill', + modkey: `@Skill{${name}}[system.die.modifier]`, + diekey: `@Skill{${name}}[system.die.sides]` + } + if (name !== 'Unskilled' && !allSkills.find(v => v === name)) { + allSkills.push(name) + } + } + traitOptions = traitOptions.concat(allSkills.sort()) + } + menuData.inputs.push({ + type: 'select', label: 'Trait', options: traitOptions + }) + menuData.inputs.push({ type: 'info', label: 'Boost or Lower?' }) + menuData.inputs.push({ type: 'radio', label: 'Boost', options: ['isBoost', true] }) + menuData.inputs.push({ type: 'radio', label: 'Lower', options: ['isBoost', false] }) + menuData.inputs.push({ type: 'checkbox', label: 'Greater', options: false }) + menuData.inputs.push({ type: 'checkbox', label: 'Strong (lower only)', options: false }) + return { menuOptions, menuData, extra: { traits } } } } -class PowerHandlers { - static async blind (token, targets, buttons, inputs) { +const PowerHandlers = { + blind: async function (token, targets, buttons, inputs, extra) { const raise = (buttons === 'raise') const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Blind', 1) const strong = !!inputs[inputIndex] @@ -138,25 +187,67 @@ class PowerHandlers { { key: 'system.stats.globalMods.trait', mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: -2, + value: '-2', priority: 0 } ] effectDocs.push( shim.createEffectDocument( - icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) + icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1, changes) ) - effectDocs[effectDocs.length - 1].changes = changes if (raise) { effectDocs.push( shim.createEffectDocument( - icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) + icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1, changes) ) - effectDocs[effectDocs.length - 1].changes = changes } for (const target of targets) { shim.applyActiveEffects(target, effectDocs) } + }, + + 'boost/lower trait': async function (token, targets, buttons, inputs, extra) { + const raise = (buttons === 'raise') + const direction = inputs[inputs.length - 4] ? 'Boost' : 'Lower' + const durationRounds = (direction === 'Boost' ? 5 : 1) + const { effectDocs, inputIndex } = globalModifierEffects( + inputs, 'Boost/Lower Trait', durationRounds) + const icon = (direction === 'Boost' + ? 'icons/magic/life/cross-embers-glow-yellow-purple.webp' + : 'icons/magic/movement/chevrons-down-yellow.webp') + const trait = extra.traits[inputs[inputIndex]] + const greater = !!inputs[inputIndex + 4] + const strong = !!inputs[inputIndex + 5] + + let namePart = `${direction} ${trait.name}` + const mods = [] + if (direction === 'Lower') { + mods.push(`Spirit${strong ? '-2' : ''} ends`) + } + if (greater) { + mods.push('greater') + } + if (mods.length > 0) { + namePart = `${namePart} (${mods.join(', ')})` + } + const mode = CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD + const modValue = (direction === 'Boost' ? '+2' : '-2') + const minorEffect = shim.createEffectDocument( + icon, `minor ${namePart}`, durationRounds, [ + { key: trait.diekey, mode, value: modValue, priority: 0 } + ]) + if (direction === 'Lower' && greater) { + minorEffect.changes.push({ key: trait.modkey, mode, value: modValue, priority: 0 }) + } + const majorEffect = shim.createEffectDocument( + icon, `major ${namePart}`, durationRounds, [ + { key: trait.diekey, mode, value: modValue, priority: 0 } + ]) + effectDocs.push(minorEffect) + if (raise) { effectDocs.push(majorEffect) } + for (const target of targets) { + shim.applyActiveEffects(target, effectDocs) + } } } @@ -172,10 +263,12 @@ export async function powerEffects (options = {}) { const lcName = name.toLowerCase() if (lcName in PowerMenus && lcName in PowerHandlers) { - const { menuOptions, menuData } = PowerMenus[lcName](token, targets) + const data = PowerMenus[lcName](token, targets) + if (data === null) { return } + const { menuOptions, menuData, extra } = data const { buttons, inputs } = await shim.warpgateMenu(menuData, menuOptions) if (buttons && buttons !== 'cancel') { - await PowerHandlers[lcName](token, targets, buttons, inputs) + await PowerHandlers[lcName](token, targets, buttons, inputs, extra) } } } diff --git a/scripts/shim.js b/scripts/shim.js index 5268000..aca15d1 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -24,13 +24,18 @@ export class shim { return game.user } - static createEffectDocument (icon, name, durationRounds) { + static createEffectDocument (icon, name, durationRounds, changes = null) { + if (changes === null) { + changes = [] + } return { icon, name, duration: { rounds: durationRounds }, + changes, flags: { swade: { + favorite: true, expiration: CONST.SWADE.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt } }