diff --git a/.gitattributes b/.gitattributes index eec4eb9..0a3d77e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,8 @@ -packs/** binary +packs/**/*.ldb binary +packs/**/MANIFEST-* binary +packs/**/CURRENT binary +packs/**/LOCK binary +packs/**/LOG* binary *.webp filter=lfs diff=lfs merge=lfs -text *.jpeg filter=lfs diff=lfs merge=lfs -text *.jpg filter=lfs diff=lfs merge=lfs -text diff --git a/CHANGELOG.md b/CHANGELOG.md index aab5487..e598133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## 2.2.0 +## [2.3.0] 2023-12-19 + +### Added + +- Trait and Damage Roll hooks to look for and apply modifiers for target + conditions: + - Vulnerable + - Deflection + - Arcane Protection + - Arcane Resistance + - Scale + - Gang Up + - Resistences and Weaknesses +- New Macro: Set token vision +- New Common Action: Illumination (for the darkness penalty effects) +- New macro: Quick Damage Roll +- New Vision mode: Low Light Vision +- Power Effect for Zombie +- Sample fixed request roll macro + +### Changed + +- Vision mode visual effects changed for Basic Vision and Darkvision +- Shape Change and Summon both set the disposition for their new tokens +- Shape Change and Summon both set vision to enabled for their new tokens + +## [2.2.0] ### Added @@ -20,7 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - API Documentation - Request Roll macro documentation -## 2.1.0 +## [2.1.0] ### Changed @@ -30,7 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 name. - Updates to documentation -## 2.0.0 +## [2.0.0] ### Changed @@ -47,7 +73,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Shape Change - Sloth/Speed -## 1.2.0 +## [1.2.0] ### Changed @@ -56,20 +82,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - incorporated glow, shroud, hurry, and hinder power modifiers into power effects -## 1.1.0 +## [1.1.0] ### Added - gold calculator macro for SWPF gold items - Actions for common rolls with links to SWPF rules -## 1.0.1 +## [1.0.1] ### Fixed - Summon macro now spawns tokens with prototype token's actual dimensions -## 1.0.0 +## [1.0.0] ### Added @@ -84,7 +110,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Protection and Smite macros now linked to swade system effects -## 0.9.0 +## [0.9.0] - Initial 'public' release diff --git a/macros/blind.js b/macros/blind.js deleted file mode 100644 index 30ad41e..0000000 --- a/macros/blind.js +++ /dev/null @@ -1,45 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const menuOptions = { - title: 'Blind', - defaultButton: 'Cancel', - options: {} - } - - const menuData = { - inputs: [ - { type: 'header', label: 'Blind' }, - { type: 'info', label: `Apply Blind to ${tokenList}` }, - { type: 'checkbox', label: 'Strong', options: false } - ], - buttons: [ - { label: 'Apply', value: 'apply' }, - { label: 'Raise', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - if (buttons && buttons !== 'cancel') { - const options = { - raise: (buttons === 'raise'), - strong: (!!inputs[2]) - } - await createEffect(tokens, options) - } -} - -async function createEffect (tokens, options) { - const effectDetails = (options.raise ? '-4' : '-2') - const effectEnd = (options.strong ? 'Vigor -2' : 'Vigor') - const effectName = `Blind (${effectDetails}) ${effectEnd} ends` - const baseEffect = CONFIG.statusEffects.find(se => se.label === 'EFFECT.StatusBlind') - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(baseEffect.icon, effectName, 1, []) - mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id } - const mutateOptions = swadeMBHelpers.defaultMutationOptions('Blind') - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/boost-lower-trait.js b/macros/boost-lower-trait.js deleted file mode 100644 index 98c1643..0000000 --- a/macros/boost-lower-trait.js +++ /dev/null @@ -1,133 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - 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` - } - } - - const tokenList = tokens.map(t => t.name).join(', ') - for (const token of tokens) { - const skills = token.actor.items.filter(item => item.type === 'skill') - for (const skill of skills) { - const name = skill.name - traits[name] = { - type: 'skill', - name, - 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()) - - const menuOptions = { - title: 'Boost/Lower Trait', - defaultButton: 'Cancel', - options: {} - } - const menuData = { - inputs: [ - { type: 'header', label: 'Boost/Lower Trait' }, - { type: 'info', label: `Affected Tokens ${tokenList}` }, - { type: 'select', label: 'Trait', options: traitOptions }, - { type: 'info', label: 'Boost or Lower?' }, - { type: 'radio', label: 'Boost', options: ['isBoost', true] }, - { type: 'radio', label: 'Lower', options: ['isBoost', false] }, - { type: 'checkbox', label: 'Greater', options: false }, - { type: 'checkbox', label: 'Strong (lower only)', options: false } - ], - buttons: [ - { label: 'Apply', value: 'apply' }, - { label: 'Apply with raise', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - if (buttons && buttons !== 'cancel') { - const options = { - action: buttons, - name: inputs[2], - trait: traits[inputs[2]], - direction: inputs[4] || inputs[5], - greater: inputs[6], - strong: inputs[7] - } - createEffect(tokens, options) - } -} - -const UPICON = 'icons/magic/life/cross-embers-glow-yellow-purple.webp' -const DOWNICON = 'icons/magic/movement/chevrons-down-yellow.webp' - -async function createEffect (tokens, options) { - const raise = (options.action === 'raise') - const icon = (options.direction === 'Boost' ? UPICON : DOWNICON) - let namePart = `${options.direction} ${options.trait.name}` - const mode = CONST.ACTIVE_EFFECT_MODES.ADD - const mods = [] - if (options.strong && options.direction === 'Lower') { - mods.push('strong') - } - if (options.greater) { - mods.push('greater') - } - if (mods.length > 0) { - namePart = `${namePart} (${mods.join(', ')})` - } - const minorEffect = swadeMBHelpers.createEffectDocument( - icon, `minor ${namePart}`, 5, [ - { - key: options.trait.diekey, - mode, - value: (options.direction === 'Boost' ? '+2' : '-2'), - priority: 0 - } - ] - ) - const majorEffect = swadeMBHelpers.createEffectDocument( - icon, `major ${namePart}`, 5, [ - { - key: options.trait.diekey, - mode, - value: (options.direction === 'Boost' ? '+2' : '-2'), - priority: 0 - } - ] - ) - if (options.direction === 'Lower' && options.greater === 'Greater') { - minorEffect.changes.push({ - key: options.trait.modkey, - mode, - value: '-2', - priority: 0 - }) - } - const mutate = { - embedded: { - ActiveEffect: { - } - } - } - mutate.embedded.ActiveEffect[minorEffect.id] = minorEffect - if (raise) { - mutate.embedded.ActiveEffect[majorEffect.id] = majorEffect - } - const mutateOptions = swadeMBHelpers.defaultMutationOptions(namePart) - for (const token of tokens) { - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/confusion.js b/macros/confusion.js deleted file mode 100644 index a60049c..0000000 --- a/macros/confusion.js +++ /dev/null @@ -1,62 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const menuOptions = { - title: 'Confusion', - defaultButton: 'Cancel', - options: {} - } - - const menuData = { - inputs: [ - { type: 'header', label: 'Confusion' }, - { type: 'info', label: `Apply Confusion to ${tokenList}` }, - { type: 'checkbox', label: 'Greater (adds shaken)', options: false } - ], - buttons: [ - { label: 'Distracted', value: 'distracted' }, - { label: 'Vulnerable', value: 'vulnerable' }, - { label: 'Raise (both)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - const greater = (inputs[2] === 'Greater (adds shaken)') - if (buttons && buttons !== 'cancel') { - await createEffect(tokens, buttons, greater) - } -} - -function getStatus (label, name) { - const effect = JSON.parse(JSON.stringify( - CONFIG.statusEffects.find(se => se.label === label))) - effect.label = name - effect.flags.core = { statusId: effect.id } - effect.id = name - return effect -} - -async function createEffect (tokens, choice, greater) { - const effects = [] - if (choice === 'distracted' || choice === 'raise') { - effects.push(getStatus('SWADE.Distr', 'Distracted')) - } - if (choice === 'vulnerable' || choice === 'raise') { - effects.push(getStatus('SWADE.Vuln', 'Vulnerable')) - } - if (greater) { - effects.push(getStatus('SWADE.Shaken', 'Shaken')) - } - for (const token of tokens) { - const mutateOptions = swadeMBHelpers.defaultMutationOptions('Confusion') - const mutate = { - embedded: { ActiveEffect: {} } - } - for (const effect of effects) { - mutate.embedded.ActiveEffect[effect.id] = effect - } - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/deflection.js b/macros/deflection.js deleted file mode 100644 index 630ca28..0000000 --- a/macros/deflection.js +++ /dev/null @@ -1,37 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const dialogOptions = { - title: 'Deflection', - content: `Apply Deflection to ${tokenList}`, - default: 'cancel', - buttons: [ - { label: 'Apply (melee)', value: 'melee' }, - { label: 'Apply (ranged)', value: 'ranged' }, - { label: 'Apply with raise (both)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const choice = await warpgate.buttonDialog(dialogOptions) - - if (choice && choice !== 'cancel') { - await createEffect(tokens, choice) - } -} - -async function createEffect (tokens, choice) { - const icon = 'icons/magic/defensive/shield-barrier-deflect-teal.webp' - let effectName = 'Deflection' - if (choice === 'raise') { - effectName = `${effectName} (all)` - } else { - effectName = `${effectName} (${choice})` - } - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, []) - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/entangle.js b/macros/entangle.js deleted file mode 100644 index 0f47916..0000000 --- a/macros/entangle.js +++ /dev/null @@ -1,74 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const menuOptions = { - title: 'Entangle', - defaultButton: 'Cancel', - options: {} - } - - const menuData = { - inputs: [ - { type: 'header', label: 'Entangle' }, - { type: 'info', label: `Apply Entangle to ${tokenList}` }, - { type: 'radio', label: 'Not Damaging', options: ['dmg', true] }, - { type: 'radio', label: 'Damaging', options: ['dmg', false] }, - { type: 'radio', label: 'Deadly', options: ['dmg', false] }, - { type: 'checkbox', label: 'Tough', options: false } - ], - buttons: [ - { label: 'Entangled', value: 'apply' }, - { label: 'Bound (raise)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - if (buttons && buttons !== 'cancel') { - const options = { - apply: (buttons === 'raise' ? 'bound' : 'entangled'), - damage: (inputs[3] ? '2d4' : (inputs[4] ? '2d6' : null)), - tough: (!!inputs[5]) - } - await createEffect(tokens, options) - } -} - -function getStatus (label, name) { - const effect = JSON.parse(JSON.stringify( - CONFIG.statusEffects.find(se => se.label === label))) - effect.label = name - if (!effect.flags) { - effect.flags = {} - } - effect.flags.core = { statusId: effect.id } - effect.id = name - return effect -} - -async function createEffect (tokens, options) { - const effectSearch = (options.apply === 'bound' ? 'SWADE.Bound' : 'SWADE.Entangled') - const effectName = (options.apply === 'bound' ? 'Bound' : 'Entangled') - const effect = getStatus(effectSearch, effectName) - const extraIcon = 'icons/magic/nature/root-vine-barrier-wall-brown.webp' - const extraEffect = swadeMBHelpers.createEffectDocument(extraIcon, 'Entangle Modifier', 1, []) - - if (options.damage) { - extraEffect.id = `${extraEffect.id} - ${options.damage} dmg` - extraEffect.label = `${extraEffect.label} - ${options.damage} dmg` - } - if (options.tough) { - extraEffect.id = `Tough ${extraEffect.id}` - extraEffect.label = `Tough ${extraEffect.label}` - } - for (const token of tokens) { - const mutateOptions = swadeMBHelpers.defaultMutationOptions('Entangle') - const mutate = { embedded: { ActiveEffect: {} } } - mutate.embedded.ActiveEffect[effect.id] = effect - if (options.damage || options.tough) { - mutate.embedded.ActiveEffect[extraEffect.id] = extraEffect - } - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/glow.js b/macros/glow.js deleted file mode 100644 index af28c53..0000000 --- a/macros/glow.js +++ /dev/null @@ -1,58 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const dialogOptions = { - title: 'Glow', - content: `Apply Glow to ${tokenList}`, - default: 'cancel', - buttons: [ - { label: 'OK', value: 'ok' }, - { label: 'Mutate token lighting', value: 'mutate' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const choice = await warpgate.buttonDialog(dialogOptions) - - if (choice === 'ok' || choice === 'mutate') { - await createEffect(tokens, choice) - } -} - -async function createEffect (tokens, choice) { - const icon = 'icons/magic/light/explosion-star-blue-large.webp' - const effectName = 'Glow' - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, []) - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - if (choice === 'mutate') { - const mutate2 = { - token: { - light: { - alpha: 0.5, - angle: 360, - attenuation: 0.5, - animation: { - intensity: 5, - reverse: false, - speed: 5, - type: 'starlight' - }, - bright: 0, - color: '#0f3fff', - coloration: 1, - contrast: 0, - dim: 0.5, - luminosity: 0.5, - saturation: 0, - shadows: 0 - } - } - } - mutateOptions.permanent = false - await warpgate.mutate(token.document, mutate2, {}, mutateOptions) - } - } -} diff --git a/macros/hinder.js b/macros/hinder.js deleted file mode 100644 index 0c1df96..0000000 --- a/macros/hinder.js +++ /dev/null @@ -1,38 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const dialogOptions = { - title: 'Hinder', - content: `Apply Hinder to ${tokenList}`, - default: 'cancel', - buttons: [ - { label: 'OK', value: 'ok' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const choice = await warpgate.buttonDialog(dialogOptions, 'column') - - if (choice === 'ok') { - await createEffect(tokens, choice) - } -} - -async function createEffect (tokens, choice) { - const icon = 'icons/magic/movement/abstract-ribbons-red-orange.webp' - const effectName = 'Hinder' - const changes = [ - { - key: 'system.stats.speed.value', - mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, - value: -2, - priority: 0 - } - ] - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, changes) - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/hurry.js b/macros/hurry.js deleted file mode 100644 index 6c5811f..0000000 --- a/macros/hurry.js +++ /dev/null @@ -1,38 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const dialogOptions = { - title: 'Hurry', - content: `Apply Hurry to ${tokenList}`, - default: 'cancel', - buttons: [ - { label: 'OK', value: 'ok' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const choice = await warpgate.buttonDialog(dialogOptions, 'column') - - if (choice === 'ok') { - await createEffect(tokens, choice) - } -} - -async function createEffect (tokens, choice) { - const icon = 'icons/skills/movement/feet-winged-boots-blue.webp' - const effectName = 'Hurry' - const changes = [ - { - key: 'system.stats.speed.value', - mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, - value: 2, - priority: 0 - } - ] - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, changes) - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/intangibility.js b/macros/intangibility.js deleted file mode 100644 index 8407b13..0000000 --- a/macros/intangibility.js +++ /dev/null @@ -1,41 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const menuOptions = { - title: 'Intangibility', - defaultButton: 'Cancel', - options: {} - } - - const menuData = { - inputs: [ - { type: 'header', label: 'Intangibility' }, - { type: 'info', label: `Apply Intangibility to ${tokenList}` }, - { type: 'checkbox', label: 'Duration', options: false } - ], - buttons: [ - { label: 'Apply', value: 'apply' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - if (buttons && buttons !== 'cancel') { - const options = { - duration: (!!inputs[2]) - } - await createEffect(tokens, options) - } -} - -async function createEffect (tokens, options) { - const effectName = 'Intangibility' - const duration = (options.duration ? 5 * 6 * 60 : 5) - const icon = 'icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp' - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, duration, []) - const mutateOptions = swadeMBHelpers.defaultMutationOptions('Intangibility') - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/invisibility.js b/macros/invisibility.js deleted file mode 100644 index 9e007fb..0000000 --- a/macros/invisibility.js +++ /dev/null @@ -1,44 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const menuOptions = { - title: 'Invisibility', - defaultButton: 'Cancel', - options: {} - } - - const menuData = { - inputs: [ - { type: 'header', label: 'Invisibility' }, - { type: 'info', label: `Apply Invisibility to ${tokenList}` }, - { type: 'checkbox', label: 'Duration', options: false } - ], - buttons: [ - { label: 'Apply', value: 'apply' }, - { label: 'Raise', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - if (buttons && buttons !== 'cancel') { - const options = { - raise: (buttons === 'raise'), - duration: (!!inputs[2]) - } - await createEffect(tokens, options) - } -} - -async function createEffect (tokens, options) { - const effectName = `${options.raise ? 'major' : 'minor'} Invisibility` - const baseEffect = CONFIG.statusEffects.find(se => se.label === 'EFFECT.StatusInvisible') - const duration = (options.duration ? 5 * 6 * 60 : 5) - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(baseEffect.icon, effectName, duration, []) - mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id } - const mutateOptions = swadeMBHelpers.defaultMutationOptions('Invisibility') - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/lingering-damage.js b/macros/lingering-damage.js deleted file mode 100644 index 1d1e6c4..0000000 --- a/macros/lingering-damage.js +++ /dev/null @@ -1,32 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const dialogOptions = { - title: 'Lingering Damage', - content: `Apply Lingering Damage to ${tokenList}`, - default: 'cancel', - buttons: [ - { label: 'Ok', value: 'ok' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const choice = await warpgate.buttonDialog(dialogOptions) - - if (choice === 'ok') { - await createEffect(tokens) - } -} - -async function createEffect (tokens) { - const icon = 'icons/magic/acid/dissolve-arm-flesh.webp' - const effectName = 'Lingering Damage' - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 1, []) - mutate.embedded.ActiveEffect['Lingering Damage'].flags.swade.expiration = - CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.StartOfTurnPrompt - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/protection.js b/macros/protection.js deleted file mode 100644 index d35e5ad..0000000 --- a/macros/protection.js +++ /dev/null @@ -1,45 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const dialogOptions = { - title: 'Protection', - content: `Apply Protection to ${tokenList}`, - default: 'cancel', - buttons: [ - { label: 'Apply (+2 armor)', value: 'apply' }, - { label: 'Apply with raise (+2 toughness)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const choice = await warpgate.buttonDialog(dialogOptions) - - if (choice && choice !== 'cancel') { - await createEffect(tokens, choice) - } -} - -async function createEffect (tokens, choice) { - const baseEffect = CONFIG.statusEffects.find(se => se.label === 'SWADE.Protection') - const changes = [ - { - key: 'system.stats.toughness.armor', - mode: foundry.CONST.ACTIVE_EFFECT_MODES.UPGRADE, - value: 2, - priority: 0 - } - ] - let effectName = 'minor Protection' - if (choice === 'raise') { - changes[0].key = 'system.stats.toughness.value' - effectName = 'major Protection' - } - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect( - baseEffect.icon, effectName, 5, changes) - mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id } - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/quickDamage.js b/macros/quickDamage.js new file mode 100644 index 0000000..50b316c --- /dev/null +++ b/macros/quickDamage.js @@ -0,0 +1,39 @@ +new Dialog({ + title: 'Damage Roll Configuration', + content: ` +
+
+ + +
+
+ + +
+
+ + +
+
+ `, + buttons: { + ok: { + label: 'Roll Damage', + callback: (html) => { + const damageRoll = html.find('input[name="damageRoll"]').val() + let flavor = html.find('input[name="flavor"]').val() + const ap = parseInt(html.find('input[name="ap"]').val()) || 0 + const options = {} + if (ap > 0) { + flavor = `${flavor ? flavor + ' - ' : ''}AP: ${ap}` + options.ap = ap + } + // Perform the damage roll and send the message + new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor }) + } + }, + cancel: { + label: 'Cancel' + } + } +}).render(true) diff --git a/macros/requestDialog.js b/macros/requestRoll.js similarity index 100% rename from macros/requestDialog.js rename to macros/requestRoll.js diff --git a/macros/setTokenVision.js b/macros/setTokenVision.js new file mode 100644 index 0000000..9d85961 --- /dev/null +++ b/macros/setTokenVision.js @@ -0,0 +1,115 @@ +const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null +// argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values +// will guess based on scene darkness +const BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark'] +const THRESHOLDS = { + dim: 0.4, + dark: 0.6, + pitchdark: 0.8 +} +const RANGES = { + basic: { + bright: 25, + dim: 25, + dark: 10, + pitchdark: 0 + }, + lowlight: { + bright: 25, + dim: 25, + dark: 10, + pitchdark: 0 + }, + darkvision: { + bright: 25, + dim: 25, + dark: 10, + pitchdark: 10 + }, + nightvision: { + bright: 200, + dim: 200, + dark: 200, + pitchdark: 200 + } +} +const SIGHT_NAMES = { + lowlight: 'low-light-vision', + darkvision: 'darkvision', + nightvision: 'night-vision' +} +const SIGHT_MODES = { + lowlight: 'lowlight', + darkvision: 'darkvision', + nightvision: 'darkvision', + basic: 'basic' +} + +function findAbility (token, swid) { + return token.actor.items.find(i => i.type === 'ability' && i.system.swid === swid) +} + +async function main () { + const scene = game.scenes.current + let sceneBright = BRIGHT_LEVELS[0] + if (scene.darkness > THRESHOLDS.pitchdark) { + sceneBright = BRIGHT_LEVELS[3] + } else if (scene.darkness > THRESHOLDS.dark) { + sceneBright = BRIGHT_LEVELS[2] + } else if (scene.darkness > THRESHOLDS.dim) { + sceneBright = BRIGHT_LEVELS[1] + } + let bright = sceneBright + if (argBright && BRIGHT_LEVELS.includes(argBright)) { + bright = argBright + } + const menuData = { + inputs: [ + { type: 'radio', label: 'Bright Light', options: ['bright', bright === BRIGHT_LEVELS[0]] }, + { type: 'radio', label: 'Dim Light', options: ['bright', bright === BRIGHT_LEVELS[1]] }, + { type: 'radio', label: 'Dark', options: ['bright', bright === BRIGHT_LEVELS[2]] }, + { type: 'radio', label: 'Pitch Dark', options: ['bright', bright === BRIGHT_LEVELS[3]] } + ], + buttons: [ + { label: 'Select Scene Brightness', value: 'ok', default: true }, + { label: 'Cancel', value: 'cancel' } + ] + } + const menuConfig = { title: 'Select scene brightness' } + const result = await warpgate.menu(menuData, menuConfig) + if (result.buttons !== 'ok') { return } + + for (let i = 0; i < 4; i++) { + if (result.inputs[i]) { bright = BRIGHT_LEVELS[i] } + } + + for (const tokenId of scene.tokens.map(t => t.id)) { + const token = scene.tokens.get(tokenId) + if (!token.sight.enabled) { + console.log(`Skipping ${token.name}, vision not enabled`) + continue + // don't set sight on a token where it's not enabled + } + let sightType = 'basic' + for (const sight in SIGHT_NAMES) { + if (findAbility(token, SIGHT_NAMES[sight])) { + sightType = sight + } + } + const range = RANGES[sightType][bright] + const sightMode = SIGHT_MODES[sightType] + const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults + const data = { + 'sight.range': range, + 'sight.visionMode': sightMode, + 'sight.attenuation': visionModeData.attenuation, + 'sight.brightness': visionModeData.brightness, + 'sight.saturation': visionModeData.saturation, + 'sight.contrast': visionModeData.contrast + } + console.log(`Updating ${token.name}:`, sightType, bright, data) + await token.update(data) + } +} + +main() diff --git a/macros/shroud.js b/macros/shroud.js deleted file mode 100644 index 48ce381..0000000 --- a/macros/shroud.js +++ /dev/null @@ -1,58 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const dialogOptions = { - title: 'Shroud', - content: `Apply Shroud to ${tokenList}`, - default: 'cancel', - buttons: [ - { label: 'OK', value: 'ok' }, - { label: 'Mutate token lighting', value: 'mutate' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const choice = await warpgate.buttonDialog(dialogOptions) - - if (choice === 'ok' || choice === 'mutate') { - await createEffect(tokens, choice) - } -} - -async function createEffect (tokens, choice) { - const icon = 'icons/magic/perception/silhouette-stealth-shadow.webp' - const effectName = 'Shroud' - for (const token of tokens) { - const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, []) - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - if (choice === 'mutate') { - const mutate2 = { - token: { - light: { - alpha: 0.5, - angle: 360, - attenuation: 0.1, - animation: { - intensity: 5, - reverse: false, - speed: 5, - type: 'roiling' - }, - bright: 0, - color: null, - coloration: 0, - contrast: 0, - dim: 0.1, - luminosity: -0.15, - saturation: 0, - shadows: 0.25 - } - } - } - mutateOptions.permanent = false - await warpgate.mutate(token.document, mutate2, {}, mutateOptions) - } - } -} diff --git a/macros/smite.js b/macros/smite.js deleted file mode 100644 index 41402d0..0000000 --- a/macros/smite.js +++ /dev/null @@ -1,74 +0,0 @@ -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const tokenList = tokens.map(t => t.name).join(', ') - const menuOptions = { - title: 'Smite', - defaultButton: 'Cancel', - options: {} - } - - const menuData = { - inputs: [ - { type: 'header', label: 'Smite' }, - { type: 'info', label: `Apply Smite to ${tokenList}` }, - { type: 'checkbox', label: 'Greater', options: false } - ], - buttons: [ - { label: 'Apply', value: 'apply' }, - { label: 'Apply with Raise', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - - const tokenWeapons = {} - let index = 2 - for (const token of tokens) { - index += 2 - tokenWeapons[token.id] = index - menuData.inputs.push({ type: 'info', label: `

${token.name}

` }) - const weapons = token.actor.items.filter(i => i.type === 'weapon').map( - i => { return { value: i.name, html: i.name } }) - weapons.unshift({ value: '', html: 'None' }) - menuData.inputs.push({ type: 'select', label: token.name, options: weapons }) - } - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - for (const tokenId in tokenWeapons) { - tokenWeapons[tokenId] = inputs[tokenWeapons[tokenId]] - } - const greater = (inputs[2] === 'Greater') - if (buttons && buttons !== 'cancel') { - await createEffect(tokens, tokenWeapons, buttons, greater) - } -} - -async function createEffect (tokens, tokenWeapons, choice, greater) { - const baseEffect = CONFIG.statusEffects.find(se => se.label === 'SWADE.Smite') - const effectIcon = baseEffect.icon - let changeValue = (choice === 'raise' ? '+4' : '+2') - if (greater) { - changeValue = (choice === 'raise' ? '+6' : '+4') - } - for (const token of tokens) { - const weaponName = tokenWeapons[token.id] - const weaponId = token.actor.items.getName(weaponName)?.id - const changeKey = `@Weapon{${weaponName}}[system.damage]` - if (!weaponId) { - continue - } - const effectName = `${choice === 'raise' ? 'major' : 'minor'} Smite${greater ? '(greater)' : ''} (${weaponName})` - const changes = [ - { - key: changeKey, - mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, - value: changeValue, - priority: 0 - } - ] - const mutate = swadeMBHelpers.createMutationWithEffect( - effectIcon, effectName, 5, changes) - mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id } - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, mutate, {}, mutateOptions) - } -} diff --git a/macros/summon.js b/macros/summon.js deleted file mode 100644 index 5474f47..0000000 --- a/macros/summon.js +++ /dev/null @@ -1,74 +0,0 @@ -const ACTORFOLDER = 'Summonables' -const SUMMONICON = 'icons/magic/symbols/runes-star-orange.webp' - -swadeMBHelpers.runOnTargetOrSelectedTokens(main) - -async function main (tokens) { - const token = tokens[0] - const tokenList = token.name - const folder = swadeMBHelpers.getActorFolderByPath(ACTORFOLDER) - const actors = swadeMBHelpers.getActorsInFolder(folder) - const menuOptions = { - title: 'Summon Creature', - defaultButton: 'cancel', - options: {} - } - const menuData = { - inputs: [ - { type: 'header', label: 'Summon Creature' }, - { type: 'info', label: `${tokenList} is summoning` }, - { - type: 'select', - label: 'Ally to summon', - options: Object.keys(actors).sort().map(k => { return { value: actors[k].id, html: k } }) - }, - { type: 'number', label: 'Number to spawn (+half base cost per)', options: 1 } - ], - buttons: [ - { label: 'Apply', value: 'apply' }, - { label: 'Apply with raise', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - const { buttons, inputs } = await warpgate.menu(menuData, menuOptions) - if (buttons && buttons !== 'cancel') { - const summonData = { - raise: (buttons === 'raise'), - actorId: inputs[2], - number: inputs[3] - } - summonData.actor = game.actors.get(summonData.actorId) - summonData.actorName = summonData.actor.name - summonData.icon = summonData.actor.prototypeToken.texture.src - summonData.token = summonData.actor.prototypeToken - - doWork(summonData, token) - } -} - -async function doWork (summonData, token) { - console.log('Summon ', token, summonData) - const effectName = `Summoned ${summonData.actorName} (${summonData.number})` - const tokenEffectMutation = swadeMBHelpers.createMutationWithEffect(SUMMONICON, effectName, 5, []) - const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName) - await warpgate.mutate(token.document, tokenEffectMutation, {}, mutateOptions) - - const spawnOptions = { - controllingActor: token.actor, - duplicates: summonData.number, - comparisonKeys: { ActiveEffect: 'label' }, - crosshairs: { - icon: summonData.icon, - label: `Summon ${summonData.actorName}`, - drawOutline: false, - rememberControlled: true - } - } - const spawnMutation = { - token: { - actorLink: false, - name: `${token.name}'s ${summonData.token.name}` - } - } - await warpgate.spawn(summonData.actorName, spawnMutation, {}, spawnOptions) -} diff --git a/packs/common-actions/000005.ldb b/packs/common-actions/000005.ldb new file mode 100644 index 0000000..c15ed10 Binary files /dev/null and b/packs/common-actions/000005.ldb differ diff --git a/packs/common-actions/000215.ldb b/packs/common-actions/000215.ldb deleted file mode 100644 index 7400b24..0000000 Binary files a/packs/common-actions/000215.ldb and /dev/null differ diff --git a/packs/common-actions/CURRENT b/packs/common-actions/CURRENT index 12fd282..23b73d9 100644 --- a/packs/common-actions/CURRENT +++ b/packs/common-actions/CURRENT @@ -1 +1 @@ -MANIFEST-000211 +MANIFEST-000014 diff --git a/packs/common-actions/LOG b/packs/common-actions/LOG index c1deeb5..d59dd93 100644 --- a/packs/common-actions/LOG +++ b/packs/common-actions/LOG @@ -1,15 +1,3 @@ -2023/11/20-21:06:40.386610 7f1f87fff640 Recovering log #209 -2023/11/20-21:06:40.392165 7f1f87fff640 Delete type=0 #209 -2023/11/20-21:06:40.392245 7f1f87fff640 Delete type=3 #207 -2023/11/20-21:52:53.117342 7f1f7fab1640 Level-0 table #214: started -2023/11/20-21:52:53.119155 7f1f7fab1640 Level-0 table #214: 1361 bytes OK -2023/11/20-21:52:53.120662 7f1f7fab1640 Delete type=0 #212 -2023/11/20-21:52:53.122863 7f1f7fab1640 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items!xA7qKMmugJv7z6j1' @ 0 : 0; will stop at (end) -2023/11/20-21:52:53.123064 7f1f7fab1640 Manual compaction at level-1 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items!xA7qKMmugJv7z6j1' @ 0 : 0; will stop at '!items!6fkUnnyILsETRfjI' @ 267 : 1 -2023/11/20-21:52:53.123073 7f1f7fab1640 Compacting 1@1 + 1@2 files -2023/11/20-21:52:53.125481 7f1f7fab1640 Generated table #215@1: 23 keys, 11463 bytes -2023/11/20-21:52:53.125500 7f1f7fab1640 Compacted 1@1 + 1@2 files => 11463 bytes -2023/11/20-21:52:53.126584 7f1f7fab1640 compacted to: files[ 0 0 1 0 0 0 0 ] -2023/11/20-21:52:53.126649 7f1f7fab1640 Delete type=2 #214 -2023/11/20-21:52:53.126731 7f1f7fab1640 Delete type=2 #194 -2023/11/20-21:52:53.130970 7f1f7fab1640 Manual compaction at level-1 from '!items!6fkUnnyILsETRfjI' @ 267 : 1 .. '!items!xA7qKMmugJv7z6j1' @ 0 : 0; will stop at (end) +2023/12/19-22:11:46.585866 7f40dd7bc700 Recovering log #12 +2023/12/19-22:11:46.611108 7f40dd7bc700 Delete type=0 #12 +2023/12/19-22:11:46.611132 7f40dd7bc700 Delete type=3 #10 diff --git a/packs/common-actions/LOG.old b/packs/common-actions/LOG.old index 8cfcbe5..8d8b6ad 100644 --- a/packs/common-actions/LOG.old +++ b/packs/common-actions/LOG.old @@ -1,8 +1,8 @@ -2023/11/19-23:28:00.231858 7f1f877fe640 Recovering log #205 -2023/11/19-23:28:00.235312 7f1f877fe640 Delete type=0 #205 -2023/11/19-23:28:00.235339 7f1f877fe640 Delete type=3 #203 -2023/11/19-23:53:02.984028 7f1f7fab1640 Level-0 table #210: started -2023/11/19-23:53:02.984051 7f1f7fab1640 Level-0 table #210: 0 bytes OK -2023/11/19-23:53:02.985426 7f1f7fab1640 Delete type=0 #208 -2023/11/19-23:53:02.987037 7f1f7fab1640 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items!xA7qKMmugJv7z6j1' @ 0 : 0; will stop at (end) -2023/11/19-23:53:02.987301 7f1f7fab1640 Manual compaction at level-1 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items!xA7qKMmugJv7z6j1' @ 0 : 0; will stop at (end) +2023/12/19-14:25:58.734016 7fb0acf3b700 Recovering log #8 +2023/12/19-14:25:58.748444 7fb0acf3b700 Delete type=3 #6 +2023/12/19-14:25:58.748474 7fb0acf3b700 Delete type=0 #8 +2023/12/19-22:08:59.600432 7fb086400700 Level-0 table #13: started +2023/12/19-22:08:59.600452 7fb086400700 Level-0 table #13: 0 bytes OK +2023/12/19-22:08:59.612412 7fb086400700 Delete type=0 #11 +2023/12/19-22:08:59.648733 7fb086400700 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end) +2023/12/19-22:08:59.648868 7fb086400700 Manual compaction at level-1 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end) diff --git a/packs/common-actions/MANIFEST-000014 b/packs/common-actions/MANIFEST-000014 new file mode 100644 index 0000000..5d83e41 Binary files /dev/null and b/packs/common-actions/MANIFEST-000014 differ diff --git a/packs/common-actions/MANIFEST-000211 b/packs/common-actions/MANIFEST-000211 deleted file mode 100644 index 23b580b..0000000 Binary files a/packs/common-actions/MANIFEST-000211 and /dev/null differ diff --git a/packs/common-actions/_source/Barrier_YBfJFr0Q0Hnz3Z0Z.json b/packs/common-actions/_source/Barrier_YBfJFr0Q0Hnz3Z0Z.json new file mode 100644 index 0000000..f569d06 --- /dev/null +++ b/packs/common-actions/_source/Barrier_YBfJFr0Q0Hnz3Z0Z.json @@ -0,0 +1,78 @@ +{ + "folder": "0nDRFmMBs5DBJU9M", + "name": "Barrier", + "type": "action", + "_id": "YBfJFr0Q0Hnz3Z0Z", + "img": "icons/magic/water/barrier-ice-wall-snow.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "KBEgoqgT": { + "name": "Damage", + "type": "damage", + "override": "2d4", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "rppj3jdl": { + "name": "Deadly", + "type": "damage", + "override": "2d6", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "R19q7be2": { + "name": "Lingering Damage", + "type": "damage", + "override": "2d4-2", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "nVD7h2EG": { + "name": "Lingering Deadly Damage", + "type": "damage", + "override": "2d4", + "modifier": "", + "dice": null, + "resourcesUsed": null + } + } + }, + "swid": "barrier" + }, + "effects": [], + "sort": 600000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695165795303, + "modifiedTime": 1702839170547, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!items!YBfJFr0Q0Hnz3Z0Z" +} diff --git a/packs/common-actions/_source/Blast_Burst_uOfqTXUyHk6M5tcp.json b/packs/common-actions/_source/Blast_Burst_uOfqTXUyHk6M5tcp.json new file mode 100644 index 0000000..90824eb --- /dev/null +++ b/packs/common-actions/_source/Blast_Burst_uOfqTXUyHk6M5tcp.json @@ -0,0 +1,88 @@ +{ + "folder": "0nDRFmMBs5DBJU9M", + "name": "Blast/Burst", + "type": "action", + "_id": "uOfqTXUyHk6M5tcp", + "img": "icons/magic/fire/explosion-fireball-large-purple-orange.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "syarnXHm": { + "name": "Damage (+2)", + "type": "damage", + "override": "3d6", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "72RI01JA": { + "name": "Greater (+4)", + "type": "damage", + "override": "4d6", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "isHeavyWeapon": true + }, + "bJStUmyi": { + "name": "Lingering Damage", + "type": "damage", + "override": "2d4", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "ETr8eRwJ": { + "name": "Lingering Extra Damage (+2)", + "type": "damage", + "override": "3d4", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "DvnTrhtg": { + "name": "Lingering Greater Damage (+4)", + "type": "damage", + "override": "4d4", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "isHeavyWeapon": true + } + } + }, + "swid": "blastburst" + }, + "effects": [], + "sort": 800000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695165983064, + "modifiedTime": 1702839170549, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!items!uOfqTXUyHk6M5tcp" +} diff --git a/packs/common-actions/_source/Bolt_8fL0gIyNIxr2hr2s.json b/packs/common-actions/_source/Bolt_8fL0gIyNIxr2hr2s.json new file mode 100644 index 0000000..09d25b7 --- /dev/null +++ b/packs/common-actions/_source/Bolt_8fL0gIyNIxr2hr2s.json @@ -0,0 +1,110 @@ +{ + "name": "Bolt", + "type": "action", + "img": "icons/magic/lightning/bolt-beam-strike-blue.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "U0ReLbPz": { + "name": "Damage (+2)", + "type": "damage", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "3d6", + "isHeavyWeapon": false + }, + "bgEDx2DC": { + "name": "Distegrate (+2) Resist (Vigor)", + "type": "resist", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "Vigor", + "isHeavyWeapon": false + }, + "rc9YFNrJ": { + "name": "Greater Bolt (+4)", + "type": "damage", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "4d6", + "isHeavyWeapon": true + }, + "mL2g1HXb": { + "name": "Rate of Fire (+2)", + "type": "trait", + "dice": 2, + "resourcesUsed": null, + "modifier": "", + "override": "", + "isHeavyWeapon": false + }, + "yaUtp0a1": { + "name": "Lingering Damage", + "type": "damage", + "override": "2d4", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "isHeavyWeapon": false + }, + "enYZVtNT": { + "name": "Lingering Extra Damage (+2)", + "type": "damage", + "override": "3d4", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "Oy39lfJP": { + "name": "Lingering Greater Damage (+4)", + "type": "damage", + "override": "4d4", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "isHeavyWeapon": true + } + } + }, + "swid": "bolt" + }, + "effects": [], + "folder": "0nDRFmMBs5DBJU9M", + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695082141993, + "modifiedTime": 1702839170544, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "8fL0gIyNIxr2hr2s", + "sort": 400000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!8fL0gIyNIxr2hr2s" +} diff --git a/packs/common-actions/_source/Burrow_Ne3oDoPl3hc8eEX1.json b/packs/common-actions/_source/Burrow_Ne3oDoPl3hc8eEX1.json new file mode 100644 index 0000000..959c2a7 --- /dev/null +++ b/packs/common-actions/_source/Burrow_Ne3oDoPl3hc8eEX1.json @@ -0,0 +1,66 @@ +{ + "name": "Burrow", + "type": "action", + "img": "icons/magic/earth/projectile-stone-landslide.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "hx9EGBvx": { + "name": "Surprise (Stealth)", + "type": "trait", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "Stealth", + "isHeavyWeapon": false + }, + "m0xSkgHw": { + "name": "Oppose Surprise (Notice)", + "type": "resist", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "Notice", + "isHeavyWeapon": false + } + } + }, + "swid": "burrow" + }, + "effects": [], + "folder": "0nDRFmMBs5DBJU9M", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1696130722637, + "modifiedTime": 1702839170544, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "Ne3oDoPl3hc8eEX1", + "sort": 300000, + "_key": "!items!Ne3oDoPl3hc8eEX1" +} diff --git a/packs/common-actions/_source/Damage_Field_pSztYcH5w4VNI2nb.json b/packs/common-actions/_source/Damage_Field_pSztYcH5w4VNI2nb.json new file mode 100644 index 0000000..c69c94a --- /dev/null +++ b/packs/common-actions/_source/Damage_Field_pSztYcH5w4VNI2nb.json @@ -0,0 +1,88 @@ +{ + "folder": "0nDRFmMBs5DBJU9M", + "name": "Damage Field", + "type": "action", + "_id": "pSztYcH5w4VNI2nb", + "img": "icons/magic/defensive/armor-shield-barrier-steel.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "vzxICJES": { + "name": "Damage (+2)", + "type": "damage", + "override": "2d6", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "B5Vbtiut": { + "name": "⭐ Greater (+4)", + "type": "damage", + "override": "3d6", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "isHeavyWeapon": true + }, + "Ldobq3c1": { + "name": "Lingering Damage", + "type": "damage", + "override": "2d4-2", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "xQjPiDKU": { + "name": "Lingering Extra Damage (+2)", + "type": "damage", + "override": "2d4", + "modifier": "", + "dice": null, + "resourcesUsed": null + }, + "bLXiZ53I": { + "name": "Lingering Greater Damage", + "type": "damage", + "override": "3d4", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "isHeavyWeapon": true + } + } + }, + "swid": "damage-field" + }, + "effects": [], + "sort": 700000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695250911715, + "modifiedTime": 1702839170549, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!items!pSztYcH5w4VNI2nb" +} diff --git a/packs/common-actions/_source/Disarm_Lijthu5ONJvcIzDX.json b/packs/common-actions/_source/Disarm_Lijthu5ONJvcIzDX.json new file mode 100644 index 0000000..767f6dd --- /dev/null +++ b/packs/common-actions/_source/Disarm_Lijthu5ONJvcIzDX.json @@ -0,0 +1,69 @@ +{ + "name": "Disarm", + "type": "action", + "img": "icons/skills/melee/sword-damaged-broken-orange.webp", + "system": { + "description": "

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#disarm]{DISARM}

", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "nRh9e5kO": { + "name": "Resist Disarm (Arm Hit)", + "type": "resist", + "override": "Strength", + "modifier": "-2", + "isHeavyWeapon": false + }, + "HxIXbUus": { + "name": "Resist Disarm (Hand Hit)", + "type": "resist", + "override": "Strength", + "modifier": "-4", + "dice": null, + "resourcesUsed": null + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "SWAD MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "disarm" + }, + "effects": [], + "flags": { + "core": {}, + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1679667342015, + "modifiedTime": 1702839170544, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "Lijthu5ONJvcIzDX", + "sort": 300000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!Lijthu5ONJvcIzDX" +} diff --git a/packs/common-actions/_source/Disguise_TteEFvR0yPWKNbI5.json b/packs/common-actions/_source/Disguise_TteEFvR0yPWKNbI5.json new file mode 100644 index 0000000..7ee9063 --- /dev/null +++ b/packs/common-actions/_source/Disguise_TteEFvR0yPWKNbI5.json @@ -0,0 +1,66 @@ +{ + "name": "Disguise", + "type": "action", + "img": "icons/skills/social/diplomacy-peace-alliance.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "m0xSkgHw": { + "name": "Detect Disguise (Notice -2)", + "type": "resist", + "override": "Notice", + "modifier": "-2", + "dice": null, + "resourcesUsed": null, + "isHeavyWeapon": false + }, + "oJYREpI8": { + "name": "Detect major Disguise (Notice -4)", + "type": "resist", + "dice": null, + "resourcesUsed": null, + "modifier": "-4", + "override": "Notice", + "isHeavyWeapon": false + } + } + }, + "swid": "disguise" + }, + "effects": [], + "folder": "0nDRFmMBs5DBJU9M", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1696130722637, + "modifiedTime": 1702839170546, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "TteEFvR0yPWKNbI5", + "sort": 200000, + "_key": "!items!TteEFvR0yPWKNbI5" +} diff --git a/packs/common-actions/_source/Evade_xA7qKMmugJv7z6j1.json b/packs/common-actions/_source/Evade_xA7qKMmugJv7z6j1.json new file mode 100644 index 0000000..e74bfe9 --- /dev/null +++ b/packs/common-actions/_source/Evade_xA7qKMmugJv7z6j1.json @@ -0,0 +1,61 @@ +{ + "name": "Evade", + "type": "action", + "img": "icons/skills/movement/figure-running-gray.webp", + "system": { + "description": "

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#evasion]{Evasion}

", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "L0XtU5KM": { + "name": "Evade (Agility)", + "type": "resist", + "override": "Agility", + "modifier": "-2", + "isHeavyWeapon": false + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "SWADE MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "evade" + }, + "effects": [], + "flags": { + "core": {}, + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1674019466231, + "modifiedTime": 1702839170550, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "xA7qKMmugJv7z6j1", + "sort": 900000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!xA7qKMmugJv7z6j1" +} diff --git a/packs/common-actions/_source/Frenzy_hTRU6MiIYlFUVk4T.json b/packs/common-actions/_source/Frenzy_hTRU6MiIYlFUVk4T.json new file mode 100644 index 0000000..663897c --- /dev/null +++ b/packs/common-actions/_source/Frenzy_hTRU6MiIYlFUVk4T.json @@ -0,0 +1,63 @@ +{ + "name": "Frenzy", + "type": "action", + "img": "icons/skills/melee/strikes-sword-scimitar.webp", + "system": { + "description": "", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "qQtymA5P": { + "name": "Frenzy Attack", + "type": "trait", + "modifier": "", + "resourcesUsed": null, + "dice": 2, + "override": "Fighting", + "isHeavyWeapon": false + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "Swade MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "frenzy" + }, + "effects": [], + "flags": { + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + }, + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1668048955652, + "modifiedTime": 1702839170547, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "hTRU6MiIYlFUVk4T", + "sort": 700000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!hTRU6MiIYlFUVk4T" +} diff --git a/packs/common-actions/_source/Grapple__Tentacles__6fkUnnyILsETRfjI.json b/packs/common-actions/_source/Grapple__Tentacles__6fkUnnyILsETRfjI.json new file mode 100644 index 0000000..e1b3cd4 --- /dev/null +++ b/packs/common-actions/_source/Grapple__Tentacles__6fkUnnyILsETRfjI.json @@ -0,0 +1,108 @@ +{ + "name": "Grapple (Tentacles)", + "type": "action", + "img": "icons/skills/melee/unarmed-punch-fist.webp", + "system": { + "description": "

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#grappling]{Grappling}

@UUID[Compendium.swpf-core-rules.swpf-abilities.Item.0fZ7WmUuKGgU35sJ]{Tentacles}

", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "XEC2IWM0": { + "name": "Grapple", + "type": "trait", + "dice": null, + "resourcesUsed": null, + "modifier": "+2", + "override": "Athletics", + "isHeavyWeapon": false + }, + "g7oxsNqI": { + "name": "Resist Grapple", + "type": "resist", + "override": "Athletics", + "modifier": "", + "isHeavyWeapon": false + }, + "KCvw4z5i": { + "name": "Crush", + "type": "trait", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "override": "Strength", + "isHeavyWeapon": false + }, + "1wWLiKwK": { + "name": "Resist Crush", + "type": "resist", + "override": "Strength", + "modifier": "", + "isHeavyWeapon": false + }, + "t1Db4fxd": { + "name": "Crush", + "type": "damage", + "modifier": "", + "override": "@str", + "isHeavyWeapon": false + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "Swade MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "grapple-tentacles" + }, + "effects": [], + "flags": { + "swim": { + "config": { + "reloadSFX": "", + "fireSFX": "", + "autoFireSFX": "", + "silencedFireSFX": "", + "silencedAutoFireSFX": "", + "emptySFX": "", + "isPack": false, + "isConsumable": false, + "isSilenced": false, + "loadedAmmo": "", + "_version": 1 + } + }, + "core": {}, + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1667883835416, + "modifiedTime": 1702839170543, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "6fkUnnyILsETRfjI", + "sort": 100000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!6fkUnnyILsETRfjI" +} diff --git a/packs/common-actions/_source/Grapple_jcWvDnoBNyVdXnsu.json b/packs/common-actions/_source/Grapple_jcWvDnoBNyVdXnsu.json new file mode 100644 index 0000000..965c7d7 --- /dev/null +++ b/packs/common-actions/_source/Grapple_jcWvDnoBNyVdXnsu.json @@ -0,0 +1,108 @@ +{ + "name": "Grapple", + "type": "action", + "img": "icons/skills/melee/unarmed-punch-fist.webp", + "system": { + "description": "

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#grappling]{Grappling}

", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "XEC2IWM0": { + "name": "Grapple", + "type": "trait", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "override": "Athletics", + "isHeavyWeapon": false + }, + "g7oxsNqI": { + "name": "Resist Grapple", + "type": "resist", + "override": "Athletics", + "modifier": "", + "isHeavyWeapon": false + }, + "KCvw4z5i": { + "name": "Crush", + "type": "trait", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "override": "Strength", + "isHeavyWeapon": false + }, + "1wWLiKwK": { + "name": "Resist Crush", + "type": "resist", + "override": "Strength", + "modifier": "", + "isHeavyWeapon": false + }, + "t1Db4fxd": { + "name": "Crush", + "type": "damage", + "modifier": "", + "override": "@str", + "isHeavyWeapon": false + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "Swade MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "grapple" + }, + "effects": [], + "flags": { + "swim": { + "config": { + "reloadSFX": "", + "fireSFX": "", + "autoFireSFX": "", + "silencedFireSFX": "", + "silencedAutoFireSFX": "", + "emptySFX": "", + "isPack": false, + "isConsumable": false, + "isSilenced": false, + "loadedAmmo": "", + "_version": 1 + } + }, + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + }, + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1667883835416, + "modifiedTime": 1702839170547, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "jcWvDnoBNyVdXnsu", + "sort": 800000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!jcWvDnoBNyVdXnsu" +} diff --git a/packs/common-actions/_source/Havoc_Sjg9D9FQ0uxZQrD0.json b/packs/common-actions/_source/Havoc_Sjg9D9FQ0uxZQrD0.json new file mode 100644 index 0000000..5e837bb --- /dev/null +++ b/packs/common-actions/_source/Havoc_Sjg9D9FQ0uxZQrD0.json @@ -0,0 +1,94 @@ +{ + "name": "Havoc", + "type": "action", + "img": "icons/magic/air/air-burst-spiral-blue-gray.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "swid": "havoc", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "t1FV85tY": { + "name": "Resist minor Havoc", + "type": "resist", + "override": "Strength", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "macroActor": "default", + "isHeavyWeapon": false + }, + "Rch2cQhm": { + "name": "Resist major Havoc", + "type": "resist", + "override": "Strength", + "modifier": "-2", + "dice": null, + "resourcesUsed": null, + "macroActor": "default", + "isHeavyWeapon": false + }, + "BNXwvwgh": { + "name": "Strike a hard object", + "type": "damage", + "override": "2d4", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "macroActor": "default", + "isHeavyWeapon": false + }, + "dOsQSsEW": { + "name": "Strike a hard object (greater)", + "type": "damage", + "override": "2d6", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "macroActor": "default", + "isHeavyWeapon": false + } + } + } + }, + "effects": [], + "folder": "0nDRFmMBs5DBJU9M", + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": { + "core": {}, + "exportSource": { + "world": "sw-module-creation", + "system": "swade", + "coreVersion": "11.315", + "systemVersion": "3.2.2" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1699734652310, + "modifiedTime": 1702839170545, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "Sjg9D9FQ0uxZQrD0", + "sort": 0, + "_key": "!items!Sjg9D9FQ0uxZQrD0" +} diff --git a/packs/common-actions/_source/Illumination_RC1Nz6iph8wPPK1B.json b/packs/common-actions/_source/Illumination_RC1Nz6iph8wPPK1B.json new file mode 100644 index 0000000..52b8b01 --- /dev/null +++ b/packs/common-actions/_source/Illumination_RC1Nz6iph8wPPK1B.json @@ -0,0 +1,156 @@ +{ + "folder": null, + "name": "Illumination", + "type": "action", + "img": "icons/magic/light/explosion-star-blue-large.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "swid": "lighting", + "additionalStats": {}, + "favorite": false, + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": {} + } + }, + "effects": [ + { + "name": "Dim Lighting", + "icon": "icons/magic/light/light-lantern-lit-white.webp", + "changes": [ + { + "key": "system.stats.globalMods.trait", + "mode": 2, + "value": "-2", + "priority": null + } + ], + "transfer": true, + "_id": "fpSigRcCCADmisXP", + "disabled": true, + "duration": { + "startTime": 0, + "seconds": null, + "combat": "bLRI8G4dAxvCnqbC", + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "origin": null, + "statuses": [], + "flags": { + "swade": { + "favorite": true, + "expiration": null, + "loseTurnOnHold": false + } + }, + "tint": null, + "_key": "!items.effects!RC1Nz6iph8wPPK1B.fpSigRcCCADmisXP" + }, + { + "name": "Dark Lighting", + "icon": "icons/magic/light/light-candles-lit-white.webp", + "changes": [ + { + "key": "system.stats.globalMods.trait", + "mode": 2, + "value": "-4", + "priority": null + } + ], + "transfer": true, + "_id": "g9W5hJisq3MsCpZW", + "disabled": true, + "duration": { + "startTime": 0, + "seconds": null, + "combat": "bLRI8G4dAxvCnqbC", + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "origin": null, + "statuses": [], + "flags": { + "swade": { + "expiration": null, + "loseTurnOnHold": false, + "favorite": true + } + }, + "tint": null, + "_key": "!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW" + }, + { + "name": "Pitch Darkness", + "icon": "icons/magic/unholy/barrier-shield-glowing-pink.webp", + "changes": [ + { + "key": "system.stats.globalMods.trait", + "mode": 2, + "value": "-6", + "priority": null + } + ], + "transfer": true, + "_id": "NI4hfxplfJ5pqImL", + "disabled": true, + "duration": { + "startTime": 0, + "seconds": null, + "combat": "bLRI8G4dAxvCnqbC", + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "origin": null, + "statuses": [], + "flags": { + "swade": { + "expiration": null, + "loseTurnOnHold": false, + "favorite": true + } + }, + "tint": null, + "_key": "!items.effects!RC1Nz6iph8wPPK1B.NI4hfxplfJ5pqImL" + } + ], + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1702939897892, + "modifiedTime": 1702960438222, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "RC1Nz6iph8wPPK1B", + "sort": 0, + "_key": "!items!RC1Nz6iph8wPPK1B" +} diff --git a/packs/common-actions/_source/Networking_ZlN2t7I05FjampmX.json b/packs/common-actions/_source/Networking_ZlN2t7I05FjampmX.json new file mode 100644 index 0000000..fc6e5b3 --- /dev/null +++ b/packs/common-actions/_source/Networking_ZlN2t7I05FjampmX.json @@ -0,0 +1,87 @@ +{ + "name": "Networking", + "type": "action", + "img": "icons/skills/social/diplomacy-handshake.webp", + "system": { + "description": "

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore04theadv.JournalEntryPage.04networking0000]{Networking}

", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "VvEhWhmL": { + "name": "Persuasion", + "type": "trait", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "override": "Persuasion", + "isHeavyWeapon": false + }, + "vyhH3l9E": { + "name": "Intimidation", + "type": "trait", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "override": "Intimidation", + "isHeavyWeapon": false + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "Swade MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "networking" + }, + "effects": [], + "flags": { + "swim": { + "config": { + "reloadSFX": "", + "fireSFX": "", + "autoFireSFX": "", + "silencedFireSFX": "", + "silencedAutoFireSFX": "", + "emptySFX": "", + "isPack": false, + "isConsumable": false, + "isSilenced": false, + "loadedAmmo": "", + "_version": 1 + } + }, + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + }, + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1667885227318, + "modifiedTime": 1702839170547, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "ZlN2t7I05FjampmX", + "sort": 600000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!ZlN2t7I05FjampmX" +} diff --git a/packs/common-actions/_source/Oppose_5OjjkiKDo8RxHpGz.json b/packs/common-actions/_source/Oppose_5OjjkiKDo8RxHpGz.json new file mode 100644 index 0000000..42934cc --- /dev/null +++ b/packs/common-actions/_source/Oppose_5OjjkiKDo8RxHpGz.json @@ -0,0 +1,19 @@ +{ + "name": "Oppose", + "sorting": "a", + "folder": null, + "type": "Item", + "_id": "5OjjkiKDo8RxHpGz", + "sort": 0, + "color": null, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1699419673111, + "modifiedTime": 1699419673111, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!folders!5OjjkiKDo8RxHpGz" +} diff --git a/packs/common-actions/_source/Oppose__Spirit__O1bgJSYRjxmSW3R5.json b/packs/common-actions/_source/Oppose__Spirit__O1bgJSYRjxmSW3R5.json new file mode 100644 index 0000000..16815e7 --- /dev/null +++ b/packs/common-actions/_source/Oppose__Spirit__O1bgJSYRjxmSW3R5.json @@ -0,0 +1,57 @@ +{ + "name": "Oppose (Spirit)", + "type": "action", + "img": "icons/magic/control/debuff-energy-hold-teal-blue.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Oppose", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "j20IwFOf": { + "name": "Oppose (Spirit)", + "type": "resist", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "Spirit", + "isHeavyWeapon": false + } + } + }, + "swid": "oppose-spirit" + }, + "effects": [], + "folder": "5OjjkiKDo8RxHpGz", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1696130050023, + "modifiedTime": 1702839170545, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "O1bgJSYRjxmSW3R5", + "sort": -100000, + "_key": "!items!O1bgJSYRjxmSW3R5" +} diff --git a/packs/common-actions/_source/Power_Effect_vrfo9zsECbxan4dt.json b/packs/common-actions/_source/Power_Effect_vrfo9zsECbxan4dt.json new file mode 100644 index 0000000..b364ca6 --- /dev/null +++ b/packs/common-actions/_source/Power_Effect_vrfo9zsECbxan4dt.json @@ -0,0 +1,59 @@ +{ + "name": "Power Effect", + "type": "action", + "img": "icons/magic/symbols/circled-gem-pink.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "E4Pbzvi0": { + "name": "Effect", + "type": "macro", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "", + "uuid": "Compendium.swade-mb-helpers.helper-macros.Macro.AjuA11hQ48UJNwlH", + "isHeavyWeapon": false, + "macroActor": "self" + } + } + }, + "swid": "power-effect" + }, + "effects": [], + "folder": "0nDRFmMBs5DBJU9M", + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695081676167, + "modifiedTime": 1702839170550, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "vrfo9zsECbxan4dt", + "sort": 100000, + "_key": "!items!vrfo9zsECbxan4dt" +} diff --git a/packs/common-actions/_source/Power_Effects_0nDRFmMBs5DBJU9M.json b/packs/common-actions/_source/Power_Effects_0nDRFmMBs5DBJU9M.json new file mode 100644 index 0000000..63ab466 --- /dev/null +++ b/packs/common-actions/_source/Power_Effects_0nDRFmMBs5DBJU9M.json @@ -0,0 +1,19 @@ +{ + "name": "Power Effects", + "sorting": "a", + "folder": null, + "type": "Item", + "_id": "0nDRFmMBs5DBJU9M", + "sort": 100000, + "color": null, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.308", + "createdTime": 1695081947648, + "modifiedTime": 1695164535987, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!folders!0nDRFmMBs5DBJU9M" +} diff --git a/packs/common-actions/_source/Push_DKs4DNcTRYtcdrri.json b/packs/common-actions/_source/Push_DKs4DNcTRYtcdrri.json new file mode 100644 index 0000000..ad602ea --- /dev/null +++ b/packs/common-actions/_source/Push_DKs4DNcTRYtcdrri.json @@ -0,0 +1,108 @@ +{ + "name": "Push", + "type": "action", + "img": "icons/skills/melee/shield-block-bash-blue.webp", + "system": { + "description": "

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#push]{Push}

", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "wwxI37Do": { + "name": "Push", + "type": "trait", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "override": "Strength", + "isHeavyWeapon": false + }, + "o5BwRFE0": { + "name": "Oppose Push", + "type": "resist", + "override": "Strength", + "modifier": "", + "isHeavyWeapon": false + }, + "SceRYgjP": { + "name": "Resist Prone", + "type": "resist", + "override": "Athletics", + "modifier": "", + "isHeavyWeapon": false + }, + "JUaIJ70O": { + "name": "Running Push", + "type": "trait", + "override": "Strength", + "modifier": "+2", + "dice": null, + "resourcesUsed": null + }, + "VNgJEQP8": { + "name": "Resist Prone vs Raise", + "type": "resist", + "override": "Athletics", + "modifier": "-2", + "dice": null, + "resourcesUsed": null + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "Swade MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "push" + }, + "effects": [], + "flags": { + "swim": { + "config": { + "reloadSFX": "", + "fireSFX": "", + "autoFireSFX": "", + "silencedFireSFX": "", + "silencedAutoFireSFX": "", + "emptySFX": "", + "isPack": false, + "isConsumable": false, + "isSilenced": false, + "loadedAmmo": "", + "_version": 1 + } + }, + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + }, + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1667884673139, + "modifiedTime": 1702839170544, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "DKs4DNcTRYtcdrri", + "sort": 200000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!DKs4DNcTRYtcdrri" +} diff --git a/packs/common-actions/_source/Rending_kOfyB9sMhLPoA4DI.json b/packs/common-actions/_source/Rending_kOfyB9sMhLPoA4DI.json new file mode 100644 index 0000000..6102eee --- /dev/null +++ b/packs/common-actions/_source/Rending_kOfyB9sMhLPoA4DI.json @@ -0,0 +1,62 @@ +{ + "name": "Rending", + "type": "action", + "img": "icons/skills/wounds/blood-spurt-spray-red.webp", + "system": { + "description": "

Rending: Anyone Shaken or Wounded by a Rending attack from a Size 1 or larger creature begins bleeding and must make a Vigor roll as a free action at the beginning of their next turn. Failure causes one Wound and the victim must make another Vigor roll next turn. Success means the victim doesn’t suffer a Wound, but must make a Vigor roll again next turn. A raise stops the bleeding and no further rolls are required from that attack. A successful Healing roll also stops the bleeding.

", + "notes": "", + "source": "", + "swid": "rending", + "additionalStats": {}, + "favorite": false, + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "vYs4EKsj": { + "name": "Resist Rending (Vigor)", + "type": "resist", + "override": "", + "modifier": "", + "isHeavyWeapon": false, + "macroActor": "default" + } + } + } + }, + "effects": [], + "folder": "rXqlP1phfPHNZrRT", + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": { + "core": {}, + "exportSource": { + "world": "sw-module-creation", + "system": "swade", + "coreVersion": "11.315", + "systemVersion": "3.2.2" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1690171610450, + "modifiedTime": 1702839170548, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "kOfyB9sMhLPoA4DI", + "sort": 400000, + "_key": "!items!kOfyB9sMhLPoA4DI" +} diff --git a/packs/common-actions/_source/Savage_Pathfinder_rXqlP1phfPHNZrRT.json b/packs/common-actions/_source/Savage_Pathfinder_rXqlP1phfPHNZrRT.json new file mode 100644 index 0000000..ce41552 --- /dev/null +++ b/packs/common-actions/_source/Savage_Pathfinder_rXqlP1phfPHNZrRT.json @@ -0,0 +1,19 @@ +{ + "name": "Savage Pathfinder", + "sorting": "a", + "folder": null, + "type": "Item", + "_id": "rXqlP1phfPHNZrRT", + "sort": 0, + "color": null, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.308", + "createdTime": 1695164553594, + "modifiedTime": 1695164553594, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!folders!rXqlP1phfPHNZrRT" +} diff --git a/packs/common-actions/_source/Shake_Off__Spirit__Tj9Pbdh9tu3ngd03.json b/packs/common-actions/_source/Shake_Off__Spirit__Tj9Pbdh9tu3ngd03.json new file mode 100644 index 0000000..a50f273 --- /dev/null +++ b/packs/common-actions/_source/Shake_Off__Spirit__Tj9Pbdh9tu3ngd03.json @@ -0,0 +1,67 @@ +{ + "folder": "0nDRFmMBs5DBJU9M", + "name": "Shake Off (Spirit)", + "type": "action", + "img": "icons/magic/control/debuff-energy-snare-blue.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "icoPVRIf": { + "name": "Shake Off", + "type": "resist", + "override": "Spirit", + "modifier": "", + "dice": null, + "resourcesUsed": null, + "uuid": "", + "isHeavyWeapon": false + }, + "41FetTKN": { + "name": "Shake Off (from Strong)", + "type": "resist", + "override": "Spirit", + "modifier": "-2", + "dice": null, + "resourcesUsed": null + } + } + }, + "swid": "shake-off-spirit" + }, + "effects": [], + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695165609050, + "modifiedTime": 1702839170545, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "Tj9Pbdh9tu3ngd03", + "sort": 750000, + "_key": "!items!Tj9Pbdh9tu3ngd03" +} diff --git a/packs/common-actions/_source/Shake_off__Vigor__XJYoBJcpr0Ar3cES.json b/packs/common-actions/_source/Shake_off__Vigor__XJYoBJcpr0Ar3cES.json new file mode 100644 index 0000000..c863e0c --- /dev/null +++ b/packs/common-actions/_source/Shake_off__Vigor__XJYoBJcpr0Ar3cES.json @@ -0,0 +1,65 @@ +{ + "name": "Shake off (Vigor)", + "type": "action", + "img": "icons/magic/control/debuff-energy-snare-brown.webp", + "system": { + "description": "", + "notes": "", + "source": "", + "additionalStats": {}, + "favorite": false, + "category": "Power Action", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "gJBLDGdP": { + "name": "Shake Off", + "type": "resist", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "Vigor", + "isHeavyWeapon": false + }, + "oTYF6EjQ": { + "name": "Shake Off (From Strong)", + "type": "resist", + "override": "Vigor", + "modifier": "-2", + "dice": null, + "resourcesUsed": null + } + } + }, + "swid": "shake-off-vigor" + }, + "effects": [], + "folder": "0nDRFmMBs5DBJU9M", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695698203871, + "modifiedTime": 1702839170546, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "XJYoBJcpr0Ar3cES", + "sort": 500000, + "_key": "!items!XJYoBJcpr0Ar3cES" +} diff --git a/packs/common-actions/_source/Work_the_Room_NhwZbABEXrt8OzT3.json b/packs/common-actions/_source/Work_the_Room_NhwZbABEXrt8OzT3.json new file mode 100644 index 0000000..069d00d --- /dev/null +++ b/packs/common-actions/_source/Work_the_Room_NhwZbABEXrt8OzT3.json @@ -0,0 +1,87 @@ +{ + "name": "Work the Room", + "type": "action", + "img": "icons/skills/social/diplomacy-unity-alliance.webp", + "system": { + "description": "", + "notes": "", + "additionalStats": {}, + "actions": { + "dmgMod": "", + "additional": { + "VHwhhR0B": { + "name": "Persuasion", + "type": "trait", + "modifier": "", + "resourcesUsed": null, + "dice": 2, + "override": "Persuasion", + "isHeavyWeapon": false + }, + "WF83NRE1": { + "name": "Performance", + "type": "trait", + "modifier": "", + "resourcesUsed": null, + "dice": 2, + "override": "Performance", + "isHeavyWeapon": false + } + }, + "trait": "", + "traitMod": "" + }, + "favorite": false, + "source": "Swade MB Common Actions", + "category": "Savage Pathfinder", + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "swid": "work-the-room" + }, + "effects": [], + "flags": { + "swim": { + "config": { + "reloadSFX": "", + "fireSFX": "", + "autoFireSFX": "", + "silencedFireSFX": "", + "silencedAutoFireSFX": "", + "emptySFX": "", + "isPack": false, + "isConsumable": false, + "isSilenced": false, + "loadedAmmo": "", + "_version": 1 + } + }, + "exportSource": { + "world": "swpf-rotr", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + }, + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1667885448561, + "modifiedTime": 1702839170545, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "rXqlP1phfPHNZrRT", + "_id": "NhwZbABEXrt8OzT3", + "sort": 500000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!items!NhwZbABEXrt8OzT3" +} diff --git a/packs/gear/000069.ldb b/packs/gear/000005.ldb similarity index 66% rename from packs/gear/000069.ldb rename to packs/gear/000005.ldb index 0f0c6ce..fdbfb84 100644 Binary files a/packs/gear/000069.ldb and b/packs/gear/000005.ldb differ diff --git a/packs/gear/CURRENT b/packs/gear/CURRENT index e333c89..23b73d9 100644 --- a/packs/gear/CURRENT +++ b/packs/gear/CURRENT @@ -1 +1 @@ -MANIFEST-000102 +MANIFEST-000014 diff --git a/packs/gear/LOG b/packs/gear/LOG index 9e094c1..5eefaa0 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -1,8 +1,3 @@ -2023/11/20-21:06:40.409700 7f1f87fff640 Recovering log #100 -2023/11/20-21:06:40.414561 7f1f87fff640 Delete type=3 #98 -2023/11/20-21:06:40.414639 7f1f87fff640 Delete type=0 #100 -2023/11/20-21:52:53.126794 7f1f7fab1640 Level-0 table #105: started -2023/11/20-21:52:53.126822 7f1f7fab1640 Level-0 table #105: 0 bytes OK -2023/11/20-21:52:53.127902 7f1f7fab1640 Delete type=0 #103 -2023/11/20-21:52:53.130985 7f1f7fab1640 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) -2023/11/20-21:52:53.131222 7f1f7fab1640 Manual compaction at level-1 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) +2023/12/19-22:11:46.716627 7f5d39ffb700 Recovering log #12 +2023/12/19-22:11:46.739685 7f5d39ffb700 Delete type=0 #12 +2023/12/19-22:11:46.739711 7f5d39ffb700 Delete type=3 #10 diff --git a/packs/gear/LOG.old b/packs/gear/LOG.old index 2218deb..40a24c7 100644 --- a/packs/gear/LOG.old +++ b/packs/gear/LOG.old @@ -1,8 +1,8 @@ -2023/11/19-23:28:00.254245 7f1f877fe640 Recovering log #96 -2023/11/19-23:28:00.258969 7f1f877fe640 Delete type=3 #94 -2023/11/19-23:28:00.259068 7f1f877fe640 Delete type=0 #96 -2023/11/19-23:53:02.987311 7f1f7fab1640 Level-0 table #101: started -2023/11/19-23:53:02.987354 7f1f7fab1640 Level-0 table #101: 0 bytes OK -2023/11/19-23:53:02.989583 7f1f7fab1640 Delete type=0 #99 -2023/11/19-23:53:02.994695 7f1f7fab1640 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) -2023/11/19-23:53:02.997387 7f1f7fab1640 Manual compaction at level-1 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) +2023/12/19-14:25:58.761898 7fb0acf3b700 Recovering log #8 +2023/12/19-14:25:58.781218 7fb0acf3b700 Delete type=3 #6 +2023/12/19-14:25:58.781255 7fb0acf3b700 Delete type=0 #8 +2023/12/19-22:08:59.648947 7fb086400700 Level-0 table #13: started +2023/12/19-22:08:59.648972 7fb086400700 Level-0 table #13: 0 bytes OK +2023/12/19-22:08:59.658595 7fb086400700 Delete type=0 #11 +2023/12/19-22:08:59.677223 7fb086400700 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) +2023/12/19-22:08:59.677310 7fb086400700 Manual compaction at level-1 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end) diff --git a/packs/gear/MANIFEST-000014 b/packs/gear/MANIFEST-000014 new file mode 100644 index 0000000..817e197 Binary files /dev/null and b/packs/gear/MANIFEST-000014 differ diff --git a/packs/gear/MANIFEST-000102 b/packs/gear/MANIFEST-000102 deleted file mode 100644 index abbfc24..0000000 Binary files a/packs/gear/MANIFEST-000102 and /dev/null differ diff --git a/packs/gear/_source/Bladed_Scarf_tWWSfEMmLmws6Yb1.json b/packs/gear/_source/Bladed_Scarf_tWWSfEMmLmws6Yb1.json new file mode 100644 index 0000000..62d7990 --- /dev/null +++ b/packs/gear/_source/Bladed_Scarf_tWWSfEMmLmws6Yb1.json @@ -0,0 +1,126 @@ +{ + "name": "Bladed Scarf", + "type": "weapon", + "img": "icons/commodities/cloth/cloth-bolt-gold-red.webp", + "system": { + "description": "

Knowing that seductive performances can bring out the worst in watchers, some Varisians craft rows of razor-sharp blades into their scarves. This deals Str+d4 damage to any creature successfully grappled while wielding the scarf.

", + "notes": "Two Hands", + "source": "Pathfinder Companion", + "additionalStats": {}, + "quantity": 1, + "weight": 1, + "price": 12, + "equippable": false, + "equipStatus": 1, + "isArcaneDevice": false, + "arcaneSkillDie": { + "sides": 4, + "modifier": 0 + }, + "powerPoints": {}, + "isVehicular": false, + "mods": 1, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": { + "XEC2IWM0": { + "name": "Grapple", + "type": "trait", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "Athletics", + "isHeavyWeapon": false + }, + "g7oxsNqI": { + "name": "Resist Grapple", + "type": "resist", + "modifier": "", + "override": "Athletics", + "isHeavyWeapon": false + }, + "KCvw4z5i": { + "name": "Crush", + "type": "trait", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "Strength", + "isHeavyWeapon": false + }, + "1wWLiKwK": { + "name": "Resist Crush", + "type": "resist", + "modifier": "", + "override": "Strength", + "isHeavyWeapon": false + }, + "t1Db4fxd": { + "name": "Crush", + "type": "damage", + "modifier": "", + "override": "@str", + "isHeavyWeapon": false + }, + "6yiDtU88": { + "name": "Grapple Damage", + "type": "damage", + "dice": null, + "resourcesUsed": null, + "modifier": "", + "override": "@str+d4", + "isHeavyWeapon": false + } + } + }, + "bonusDamageDie": 6, + "bonusDamageDice": 1, + "favorite": false, + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "category": "Melee Weapon", + "grants": [], + "grantOn": 1, + "damage": "@str+d4", + "range": "", + "rof": 1, + "ap": 1, + "parry": 0, + "minStr": "d4", + "shots": 0, + "currentShots": 0, + "ammo": "", + "reloadType": "none", + "ppReloadCost": 2, + "trademark": 0, + "isHeavyWeapon": false, + "swid": "bladed-scarf" + }, + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "zJNNhVU4bzQxMMA9": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1696794187384, + "modifiedTime": 1702839170624, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "tWWSfEMmLmws6Yb1", + "sort": 300000, + "_key": "!items!tWWSfEMmLmws6Yb1" +} diff --git a/packs/gear/_source/Ogre_Hook_JWyBQe4tnOYljFAF.json b/packs/gear/_source/Ogre_Hook_JWyBQe4tnOYljFAF.json new file mode 100644 index 0000000..123d8e0 --- /dev/null +++ b/packs/gear/_source/Ogre_Hook_JWyBQe4tnOYljFAF.json @@ -0,0 +1,93 @@ +{ + "name": "Ogre Hook", + "type": "weapon", + "img": "icons/tools/fishing/hook-curved-barbed-steel-white.webp", + "system": { + "description": "

A huge, crude crook of sharpened metal, an ogre hook takes its name from the savages who most typically employ it. Usually created by ogres, these weapons are especially brutal, granting the wielder the @Compendium[swpf-core-rules.swpf-abilities.F2U2daS7UdVpGyJR]{Rending Attack} ability.

Rending: Anyone Shaken or Wounded by an ogre hook attack from a Size 1 or larger creature begins bleeding and must make a Vigor roll as a free action at the beginning of their next turn. Failure causes one Wound and the victim must make another Vigor roll next turn. Success means the victim doesn’t suffer a Wound, but must make a Vigor roll again next turn. A raise stops the bleeding and no further rolls are required from that attack. A successful Healing roll also stops the bleeding.

", + "notes": "", + "additionalStats": {}, + "quantity": 1, + "weight": 3, + "price": 0, + "equippable": false, + "equipStatus": 4, + "isArcaneDevice": false, + "arcaneSkillDie": { + "sides": 4, + "modifier": 0 + }, + "powerPoints": {}, + "isVehicular": false, + "mods": 1, + "actions": { + "dmgMod": "", + "additional": { + "c84qvPrI": { + "name": "Resist Rending (Vigor)", + "type": "resist", + "modifier": "", + "override": "", + "isHeavyWeapon": false + } + }, + "trait": "Fighting", + "traitMod": "" + }, + "bonusDamageDie": 6, + "bonusDamageDice": 1, + "favorite": false, + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "category": "Melee Weapon", + "grants": [ + { + "name": "Rending", + "img": "icons/skills/wounds/blood-spurt-spray-red.webp", + "uuid": "Compendium.mb-pfsw-kingmaker.swpf-abilities.Item.8uCm1JhzkLtU0d6D", + "mutation": {} + } + ], + "grantOn": 2, + "damage": "@str+d10", + "range": "", + "rof": 1, + "ap": 3, + "parry": 0, + "minStr": "d10", + "shots": 0, + "currentShots": 0, + "ammo": "", + "reloadType": "none", + "ppReloadCost": 2, + "trademark": 0, + "isHeavyWeapon": false, + "source": "Pathfinder Companion", + "swid": "ogre-hook" + }, + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "Aqnn9hCDQPbyTWiq": 3, + "zJNNhVU4bzQxMMA9": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1690171224569, + "modifiedTime": 1702839170624, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "JWyBQe4tnOYljFAF", + "sort": 200000, + "_key": "!items!JWyBQe4tnOYljFAF" +} diff --git a/packs/gear/_source/Wayfinder_hK9zTAIl26eBbK84.json b/packs/gear/_source/Wayfinder_hK9zTAIl26eBbK84.json new file mode 100644 index 0000000..22d2044 --- /dev/null +++ b/packs/gear/_source/Wayfinder_hK9zTAIl26eBbK84.json @@ -0,0 +1,129 @@ +{ + "name": "Wayfinder", + "type": "gear", + "img": "icons/tools/navigation/compass-worn-copper.webp", + "system": { + "description": "

A small magical device patterned off ancient Azlanti relics, a wayfinder is a compact compass typically made from silver and bearing gold accents. A badge of office for agents of the Pathfinder Society, a wayfinder is as much a handy tool as a status symbol.

With a command word, the wayfinder shines as the light power. It can also act as a nonmagical (magnetic) compass, granting the user a free reroll on Survival (navigation) rolls.

All wayfinders include a small indentation designed to hold a single ioun stone. An ioun stone slotted in this manner grants you its normal benefits as if it were orbiting your head; some ioun stones can grant additional powers once they are fitted into a wayfinder.

The following list shows the common effects for some slotted ioun stones, though there may be others at the GM’s discretion.

Clear Spindle: Once per day as a limited action, the wearer can cast minor deflection on himself.

Deep Red Sphere: The wearer has the Brawler Edge as long as he have this ioun stone slotted.

Incandescen Blue Sphere: Once per day as a limited action, the wearer can cast minor darksight on himself.

Dark Blue Rhomboid: The wearer suffers no penalties to Notice rolls while asleep.

Iridescent Spindle: The wearer benefits from environmental protection as long as this ioun stone is slotted.

Pale Green Prism: Once per day as a limited action the wearer removes 1 Fatigue.

Vibrant Purple Prism: Once per day, the wearer can gain 2 Power Points as a limited action.

Cost: 500 gp; Weight: 1 lb.

Craft: 250 gp.

", + "notes": "", + "source": "Pathfinder Companion", + "additionalStats": {}, + "quantity": 1, + "weight": 1, + "price": 500, + "equippable": false, + "equipStatus": 1, + "isArcaneDevice": true, + "arcaneSkillDie": { + "sides": 4, + "modifier": 0 + }, + "powerPoints": { + "value": null, + "max": null + }, + "isVehicular": false, + "mods": 1, + "actions": { + "trait": "", + "traitMod": "", + "dmgMod": "", + "additional": {} + }, + "favorite": false, + "category": "Magic Item", + "grants": [], + "grantOn": 1, + "isAmmo": false, + "swid": "wayfinder" + }, + "effects": [], + "folder": null, + "ownership": { + "default": 0, + "zJNNhVU4bzQxMMA9": 3 + }, + "flags": { + "swade": { + "embeddedPowers": [ + [ + "JruQfQjRT3y6SeHe", + { + "_id": "XNv3EegYZJArCgZ3", + "system": { + "actions": { + "additional": {}, + "dmgMod": "", + "trait": "", + "traitMod": "" + }, + "additionalStats": {}, + "ap": 0, + "arcane": "", + "bonusDamageDie": 6, + "damage": "", + "description": "

Light/Darkness

\n

See power @Compendium[swpf-core-rules.swpf-powers.Light / Darkness]{here}.

\n

Rank: Novice

\n

Power Points: 2

\n

Range: Smarts

\n

Duration: 10 minutes

\n

School: Evocation

\n

\nTrappings: Illusionary torch, sunlight, darkness, thick\n fogs.\n

\n

\nLight creates bright illumination in a Large Blast Template.\n With a @UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03rules000000000]{raise}, the light can be focused into a 5″ (10 yard) beam as well.\n

\n

\nDarkness blocks illumination in an area the size of a Large\n Blast Template, making the area Dark, or Pitch Dark with a raise (see\n @UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00]{Illumination}).\n

\n

\n If light and darkness overlap, they create a patch of Dim\n light (−2).\n

\n

Modifiers

See generic modifiers @UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore05powers.JournalEntryPage.05powermodifie00]{here}

\n

", + "duration": "10 minutes", + "favorite": false, + "modifiers": [], + "notes": "", + "pp": 2, + "range": "Sm", + "rank": "Novice", + "trapping": "Illusionary torch, sunlight, darkness, thick fogs", + "source": "", + "bonusDamageDice": 1, + "templates": { + "cone": false, + "stream": false, + "small": false, + "medium": false, + "large": false + }, + "innate": false + }, + "effects": [], + "flags": { + "cf": { + "color": "#a41e1e", + "id": "temp_vt28g3us4ss", + "path": "Powers" + }, + "core": { + "sourceId": "Compendium.world.swpf-powers.WMlJC4ALv3BKwxTP" + } + }, + "folder": null, + "img": "modules/swpf-core-rules/assets/icons/Pathfinder_Icons_Power_v2.webp", + "name": "Light / Darkness", + "sort": 0, + "type": "power", + "ownership": { + "7ntJSLixH2Phv2jV": 3, + "default": 0 + }, + "_stats": { + "systemId": null, + "systemVersion": null, + "coreVersion": null, + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + } + } + ] + ] + }, + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1696797163890, + "modifiedTime": 1702839170624, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "hK9zTAIl26eBbK84", + "sort": 100000, + "_key": "!items!hK9zTAIl26eBbK84" +} diff --git a/packs/helper-actors/000068.ldb b/packs/helper-actors/000005.ldb similarity index 78% rename from packs/helper-actors/000068.ldb rename to packs/helper-actors/000005.ldb index c47173c..1854340 100644 Binary files a/packs/helper-actors/000068.ldb and b/packs/helper-actors/000005.ldb differ diff --git a/packs/helper-actors/CURRENT b/packs/helper-actors/CURRENT index 8d5e72e..23b73d9 100644 --- a/packs/helper-actors/CURRENT +++ b/packs/helper-actors/CURRENT @@ -1 +1 @@ -MANIFEST-000109 +MANIFEST-000014 diff --git a/packs/helper-actors/LOG b/packs/helper-actors/LOG index 378bdd2..29a0553 100644 --- a/packs/helper-actors/LOG +++ b/packs/helper-actors/LOG @@ -1,8 +1,3 @@ -2023/11/20-21:06:40.400000 7f1f8cafa640 Recovering log #107 -2023/11/20-21:06:40.405266 7f1f8cafa640 Delete type=3 #105 -2023/11/20-21:06:40.405349 7f1f8cafa640 Delete type=0 #107 -2023/11/20-21:52:53.120803 7f1f7fab1640 Level-0 table #112: started -2023/11/20-21:52:53.120825 7f1f7fab1640 Level-0 table #112: 0 bytes OK -2023/11/20-21:52:53.122805 7f1f7fab1640 Delete type=0 #110 -2023/11/20-21:52:53.122942 7f1f7fab1640 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) -2023/11/20-21:52:53.122987 7f1f7fab1640 Manual compaction at level-1 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) +2023/12/19-22:11:46.843641 7ff2615a2700 Recovering log #12 +2023/12/19-22:11:46.864924 7ff2615a2700 Delete type=0 #12 +2023/12/19-22:11:46.864950 7ff2615a2700 Delete type=3 #10 diff --git a/packs/helper-actors/LOG.old b/packs/helper-actors/LOG.old index 068b571..73332a3 100644 --- a/packs/helper-actors/LOG.old +++ b/packs/helper-actors/LOG.old @@ -1,8 +1,8 @@ -2023/11/19-23:28:00.240421 7f1f86ffd640 Recovering log #103 -2023/11/19-23:28:00.246181 7f1f86ffd640 Delete type=0 #103 -2023/11/19-23:28:00.246268 7f1f86ffd640 Delete type=3 #101 -2023/11/19-23:53:02.985473 7f1f7fab1640 Level-0 table #108: started -2023/11/19-23:53:02.985488 7f1f7fab1640 Level-0 table #108: 0 bytes OK -2023/11/19-23:53:02.987004 7f1f7fab1640 Delete type=0 #106 -2023/11/19-23:53:02.987267 7f1f7fab1640 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) -2023/11/19-23:53:02.992459 7f1f7fab1640 Manual compaction at level-1 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) +2023/12/19-14:25:58.750811 7fb087fff700 Recovering log #8 +2023/12/19-14:25:58.759586 7fb087fff700 Delete type=3 #6 +2023/12/19-14:25:58.759616 7fb087fff700 Delete type=0 #8 +2023/12/19-22:08:59.612497 7fb086400700 Level-0 table #13: started +2023/12/19-22:08:59.612518 7fb086400700 Level-0 table #13: 0 bytes OK +2023/12/19-22:08:59.622048 7fb086400700 Delete type=0 #11 +2023/12/19-22:08:59.648768 7fb086400700 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) +2023/12/19-22:08:59.648884 7fb086400700 Manual compaction at level-1 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end) diff --git a/packs/helper-actors/MANIFEST-000014 b/packs/helper-actors/MANIFEST-000014 new file mode 100644 index 0000000..cf98f38 Binary files /dev/null and b/packs/helper-actors/MANIFEST-000014 differ diff --git a/packs/helper-actors/MANIFEST-000109 b/packs/helper-actors/MANIFEST-000109 deleted file mode 100644 index 6bd5ecd..0000000 Binary files a/packs/helper-actors/MANIFEST-000109 and /dev/null differ diff --git a/packs/helper-actors/_source/Non_Character_Target_U5v4gFHquo0Y1SAq.json b/packs/helper-actors/_source/Non_Character_Target_U5v4gFHquo0Y1SAq.json new file mode 100644 index 0000000..2518a81 --- /dev/null +++ b/packs/helper-actors/_source/Non_Character_Target_U5v4gFHquo0Y1SAq.json @@ -0,0 +1,229 @@ +{ + "name": "Non Character Target", + "type": "npc", + "_id": "U5v4gFHquo0Y1SAq", + "img": "icons/svg/mystery-man.svg", + "system": { + "attributes": { + "agility": { + "die": { + "sides": 4, + "modifier": 0 + }, + "wild-die": { + "sides": 6 + } + }, + "smarts": { + "die": { + "sides": 4, + "modifier": 0 + }, + "wild-die": { + "sides": 6 + }, + "animal": false + }, + "spirit": { + "die": { + "sides": 4, + "modifier": 0 + }, + "wild-die": { + "sides": 6 + }, + "unShakeBonus": 0 + }, + "strength": { + "die": { + "sides": 4, + "modifier": 0 + }, + "wild-die": { + "sides": 6 + }, + "encumbranceSteps": 0 + }, + "vigor": { + "die": { + "sides": 4, + "modifier": 0 + }, + "wild-die": { + "sides": 6 + }, + "unStunBonus": 0, + "soakBonus": 0, + "bleedOut": { + "modifier": 0, + "ignoreWounds": false + } + } + }, + "stats": { + "speed": { + "runningDie": 6, + "runningMod": 0, + "value": 6 + }, + "toughness": { + "value": 0, + "armor": 0, + "modifier": 0 + }, + "parry": { + "value": 0, + "shield": 0, + "modifier": 0 + }, + "size": 0 + }, + "details": { + "autoCalcToughness": true, + "autoCalcParry": true, + "archetype": "", + "appearance": "", + "notes": "", + "goals": "", + "biography": { + "value": "" + }, + "species": { + "name": "" + }, + "currency": 0, + "wealth": { + "die": 6, + "modifier": 0, + "wild-die": 6 + }, + "conviction": { + "value": 0, + "active": false + } + }, + "powerPoints": {}, + "fatigue": { + "value": 0, + "max": 2, + "ignored": 0 + }, + "wounds": { + "value": 0, + "max": 0, + "ignored": 0 + }, + "woundsOrFatigue": { + "ignored": 0 + }, + "bennies": { + "value": 0, + "max": 2 + }, + "advances": { + "mode": "expanded", + "value": 0, + "rank": "Novice", + "details": "", + "list": [] + }, + "status": { + "isShaken": false, + "isDistracted": false, + "isVulnerable": false, + "isStunned": false, + "isEntangled": false, + "isBound": false, + "isIncapacitated": false + }, + "initiative": { + "hasHesitant": false, + "hasLevelHeaded": false, + "hasImpLevelHeaded": false, + "hasQuick": false + }, + "additionalStats": {}, + "wildcard": false + }, + "prototypeToken": { + "name": "Non Character Target", + "displayName": 0, + "actorLink": false, + "appendNumber": false, + "prependAdjective": false, + "texture": { + "src": "icons/svg/mystery-man.svg", + "scaleX": 1, + "scaleY": 1, + "offsetX": 0, + "offsetY": 0, + "rotation": 0 + }, + "width": 1, + "height": 1, + "lockRotation": false, + "rotation": 0, + "alpha": 1, + "disposition": -1, + "displayBars": 0, + "bar1": { + "attribute": null + }, + "bar2": { + "attribute": null + }, + "light": { + "alpha": 0.5, + "angle": 360, + "bright": 0, + "coloration": 1, + "dim": 0, + "attenuation": 0.5, + "luminosity": 0.5, + "saturation": 0, + "contrast": 0, + "shadows": 0, + "animation": { + "type": null, + "speed": 5, + "intensity": 5, + "reverse": false + }, + "darkness": { + "min": 0, + "max": 1 + } + }, + "sight": { + "enabled": false, + "range": 0, + "angle": 360, + "visionMode": "basic", + "attenuation": 0.1, + "brightness": 0, + "saturation": 0, + "contrast": 0 + }, + "detectionModes": [], + "flags": {}, + "randomImg": false + }, + "items": [], + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695252634314, + "modifiedTime": 1702839170585, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!actors!U5v4gFHquo0Y1SAq" +} diff --git a/packs/helper-macros/000005.ldb b/packs/helper-macros/000005.ldb new file mode 100644 index 0000000..4f5464a Binary files /dev/null and b/packs/helper-macros/000005.ldb differ diff --git a/packs/helper-macros/000223.ldb b/packs/helper-macros/000223.ldb deleted file mode 100644 index 451ea8e..0000000 Binary files a/packs/helper-macros/000223.ldb and /dev/null differ diff --git a/packs/helper-macros/CURRENT b/packs/helper-macros/CURRENT index 803ffe2..23b73d9 100644 --- a/packs/helper-macros/CURRENT +++ b/packs/helper-macros/CURRENT @@ -1 +1 @@ -MANIFEST-000240 +MANIFEST-000014 diff --git a/packs/helper-macros/LOG b/packs/helper-macros/LOG index 4ece3e4..948bac9 100644 --- a/packs/helper-macros/LOG +++ b/packs/helper-macros/LOG @@ -1,8 +1,3 @@ -2023/11/20-21:06:40.379066 7f1f8cafa640 Recovering log #238 -2023/11/20-21:06:40.383341 7f1f8cafa640 Delete type=0 #238 -2023/11/20-21:06:40.383379 7f1f8cafa640 Delete type=3 #236 -2023/11/20-21:52:53.115026 7f1f7fab1640 Level-0 table #243: started -2023/11/20-21:52:53.115074 7f1f7fab1640 Level-0 table #243: 0 bytes OK -2023/11/20-21:52:53.117191 7f1f7fab1640 Delete type=0 #241 -2023/11/20-21:52:53.120794 7f1f7fab1640 Manual compaction at level-0 from '!folders!hIbrWxg1nDutCSwt' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) -2023/11/20-21:52:53.122890 7f1f7fab1640 Manual compaction at level-1 from '!folders!hIbrWxg1nDutCSwt' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) +2023/12/19-22:11:46.967222 7fb6ee7bf700 Recovering log #12 +2023/12/19-22:11:46.993517 7fb6ee7bf700 Delete type=0 #12 +2023/12/19-22:11:46.993540 7fb6ee7bf700 Delete type=3 #10 diff --git a/packs/helper-macros/LOG.old b/packs/helper-macros/LOG.old index a868491..eb01f08 100644 --- a/packs/helper-macros/LOG.old +++ b/packs/helper-macros/LOG.old @@ -1,8 +1,8 @@ -2023/11/19-23:28:00.222566 7f1f86ffd640 Recovering log #234 -2023/11/19-23:28:00.228468 7f1f86ffd640 Delete type=0 #234 -2023/11/19-23:28:00.228572 7f1f86ffd640 Delete type=3 #232 -2023/11/19-23:53:02.980676 7f1f7fab1640 Level-0 table #239: started -2023/11/19-23:53:02.980736 7f1f7fab1640 Level-0 table #239: 0 bytes OK -2023/11/19-23:53:02.982353 7f1f7fab1640 Delete type=0 #237 -2023/11/19-23:53:02.985462 7f1f7fab1640 Manual compaction at level-0 from '!folders!hIbrWxg1nDutCSwt' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) -2023/11/19-23:53:02.987044 7f1f7fab1640 Manual compaction at level-1 from '!folders!hIbrWxg1nDutCSwt' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) +2023/12/19-14:25:58.719315 7fb087fff700 Recovering log #8 +2023/12/19-14:25:58.732527 7fb087fff700 Delete type=3 #6 +2023/12/19-14:25:58.732555 7fb087fff700 Delete type=0 #8 +2023/12/19-22:08:59.638378 7fb086400700 Level-0 table #13: started +2023/12/19-22:08:59.638400 7fb086400700 Level-0 table #13: 0 bytes OK +2023/12/19-22:08:59.648647 7fb086400700 Delete type=0 #11 +2023/12/19-22:08:59.648837 7fb086400700 Manual compaction at level-0 from '!folders!hIbrWxg1nDutCSwt' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) +2023/12/19-22:08:59.677175 7fb086400700 Manual compaction at level-1 from '!folders!hIbrWxg1nDutCSwt' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) diff --git a/packs/helper-macros/MANIFEST-000014 b/packs/helper-macros/MANIFEST-000014 new file mode 100644 index 0000000..ee8985e Binary files /dev/null and b/packs/helper-macros/MANIFEST-000014 differ diff --git a/packs/helper-macros/MANIFEST-000240 b/packs/helper-macros/MANIFEST-000240 deleted file mode 100644 index de84bde..0000000 Binary files a/packs/helper-macros/MANIFEST-000240 and /dev/null differ diff --git a/packs/helper-macros/_source/Blind_e9HvLMtaDw2qpcE8.json b/packs/helper-macros/_source/Blind_e9HvLMtaDw2qpcE8.json new file mode 100644 index 0000000..84bd5a8 --- /dev/null +++ b/packs/helper-macros/_source/Blind_e9HvLMtaDw2qpcE8.json @@ -0,0 +1,25 @@ +{ + "name": "Blind", + "type": "script", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/svg/blind.svg", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Blind'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1678165762773, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "e9HvLMtaDw2qpcE8", + "folder": "hIbrWxg1nDutCSwt", + "sort": 700000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!e9HvLMtaDw2qpcE8" +} diff --git a/packs/helper-macros/_source/Boost_Lower_Trait_1AqIFHAcX5TRdE8X.json b/packs/helper-macros/_source/Boost_Lower_Trait_1AqIFHAcX5TRdE8X.json new file mode 100644 index 0000000..03f2e7a --- /dev/null +++ b/packs/helper-macros/_source/Boost_Lower_Trait_1AqIFHAcX5TRdE8X.json @@ -0,0 +1,25 @@ +{ + "name": "Boost/Lower Trait", + "type": "script", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/life/cross-embers-glow-yellow-purple.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Boost/Lower Trait'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1677458254287, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "1AqIFHAcX5TRdE8X", + "folder": "hIbrWxg1nDutCSwt", + "sort": 2100000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!1AqIFHAcX5TRdE8X" +} diff --git a/packs/helper-macros/_source/Burrow_e4LvHlTNDy5zcGIG.json b/packs/helper-macros/_source/Burrow_e4LvHlTNDy5zcGIG.json new file mode 100644 index 0000000..8a3bafc --- /dev/null +++ b/packs/helper-macros/_source/Burrow_e4LvHlTNDy5zcGIG.json @@ -0,0 +1,27 @@ +{ + "name": "Burrow", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/magic/earth/projectile-stone-landslide.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Burrow'\n})", + "folder": "hIbrWxg1nDutCSwt", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1696179835774, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "e4LvHlTNDy5zcGIG", + "sort": 400000, + "_key": "!macros!e4LvHlTNDy5zcGIG" +} diff --git a/packs/helper-macros/_source/Confusion_L2IstecV7ivcrgUI.json b/packs/helper-macros/_source/Confusion_L2IstecV7ivcrgUI.json new file mode 100644 index 0000000..eb2341b --- /dev/null +++ b/packs/helper-macros/_source/Confusion_L2IstecV7ivcrgUI.json @@ -0,0 +1,25 @@ +{ + "name": "Confusion", + "type": "script", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/control/hypnosis-mesmerism-swirl.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Confusion'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1678082334572, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "L2IstecV7ivcrgUI", + "folder": "hIbrWxg1nDutCSwt", + "sort": 2000000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!L2IstecV7ivcrgUI" +} diff --git a/packs/helper-macros/_source/Darksight_YIdF96EfItR641oP.json b/packs/helper-macros/_source/Darksight_YIdF96EfItR641oP.json new file mode 100644 index 0000000..eb9d073 --- /dev/null +++ b/packs/helper-macros/_source/Darksight_YIdF96EfItR641oP.json @@ -0,0 +1,27 @@ +{ + "name": "Darksight", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/magic/perception/eye-ringed-glow-angry-small-teal.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Darksight'\n})", + "folder": "hIbrWxg1nDutCSwt", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1696179835774, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "YIdF96EfItR641oP", + "sort": 300000, + "_key": "!macros!YIdF96EfItR641oP" +} diff --git a/packs/helper-macros/_source/Deflection_HYTiftQW0pwwOQGH.json b/packs/helper-macros/_source/Deflection_HYTiftQW0pwwOQGH.json new file mode 100644 index 0000000..4fbedbf --- /dev/null +++ b/packs/helper-macros/_source/Deflection_HYTiftQW0pwwOQGH.json @@ -0,0 +1,25 @@ +{ + "name": "Deflection", + "type": "script", + "scope": "global", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/defensive/shield-barrier-deflect-teal.webp", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Deflection'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1677645552357, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "HYTiftQW0pwwOQGH", + "folder": "hIbrWxg1nDutCSwt", + "sort": 1900000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!HYTiftQW0pwwOQGH" +} diff --git a/packs/helper-macros/_source/Detect_Conceal_Arcana_stHHxnYfGW0X1l5R.json b/packs/helper-macros/_source/Detect_Conceal_Arcana_stHHxnYfGW0X1l5R.json new file mode 100644 index 0000000..267d590 --- /dev/null +++ b/packs/helper-macros/_source/Detect_Conceal_Arcana_stHHxnYfGW0X1l5R.json @@ -0,0 +1,27 @@ +{ + "name": "Detect/Conceal Arcana", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/magic/perception/third-eye-blue-red.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Detect/Conceal Arcana'\n})", + "folder": "hIbrWxg1nDutCSwt", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1696208623170, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "stHHxnYfGW0X1l5R", + "sort": 600000, + "_key": "!macros!stHHxnYfGW0X1l5R" +} diff --git a/packs/helper-macros/_source/Disguise_MYfrVZpLSrpp0vYW.json b/packs/helper-macros/_source/Disguise_MYfrVZpLSrpp0vYW.json new file mode 100644 index 0000000..0a208d0 --- /dev/null +++ b/packs/helper-macros/_source/Disguise_MYfrVZpLSrpp0vYW.json @@ -0,0 +1,27 @@ +{ + "name": "Disguise", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/skills/social/diplomacy-peace-alliance.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Disguise'\n})", + "folder": "hIbrWxg1nDutCSwt", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1696208623170, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "MYfrVZpLSrpp0vYW", + "sort": 200000, + "_key": "!macros!MYfrVZpLSrpp0vYW" +} diff --git a/packs/helper-macros/_source/Effect_Macros_hIbrWxg1nDutCSwt.json b/packs/helper-macros/_source/Effect_Macros_hIbrWxg1nDutCSwt.json new file mode 100644 index 0000000..8bc4f8c --- /dev/null +++ b/packs/helper-macros/_source/Effect_Macros_hIbrWxg1nDutCSwt.json @@ -0,0 +1,19 @@ +{ + "name": "Effect Macros", + "sorting": "a", + "folder": null, + "type": "Macro", + "_id": "hIbrWxg1nDutCSwt", + "sort": 0, + "color": null, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1695251622720, + "modifiedTime": 1700436446749, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!folders!hIbrWxg1nDutCSwt" +} diff --git a/packs/helper-macros/_source/Entangle_2TOeRNCJT3T2px8D.json b/packs/helper-macros/_source/Entangle_2TOeRNCJT3T2px8D.json new file mode 100644 index 0000000..5c233e1 --- /dev/null +++ b/packs/helper-macros/_source/Entangle_2TOeRNCJT3T2px8D.json @@ -0,0 +1,25 @@ +{ + "name": "Entangle", + "type": "script", + "scope": "global", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/nature/root-vine-barrier-wall-brown.webp", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Entangle'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1678164427219, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "2TOeRNCJT3T2px8D", + "folder": "hIbrWxg1nDutCSwt", + "sort": 1800000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!2TOeRNCJT3T2px8D" +} diff --git a/packs/helper-macros/_source/Gold_Totals_QMnx9cuyw81kRS2o.json b/packs/helper-macros/_source/Gold_Totals_QMnx9cuyw81kRS2o.json new file mode 100644 index 0000000..0eaf491 --- /dev/null +++ b/packs/helper-macros/_source/Gold_Totals_QMnx9cuyw81kRS2o.json @@ -0,0 +1,39 @@ +{ + "name": "Gold Totals", + "type": "script", + "author": "ueJGUfSYuRRL3Ypr", + "img": "icons/commodities/currency/coins-plain-stack-gold-yellow.webp", + "scope": "global", + "command": "let tokens = []\nif (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled\n}\nif (tokens.length > 0) {\n main(tokens)\n} else {\n ui.notifications.error('Please select or target a token')\n}\n\nasync function main (tokens) {\n const currencies = ['Copper', 'Silver', 'Gold', 'Platinum']\n let template = '
'\n const fmtOptions = {\n minimumIntegerDigits: 1,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }\n const fmt = Intl.NumberFormat('en-US', fmtOptions)\n for (const token of tokens) {\n const actor = token.actor\n let total = 0\n for (const item of actor.items.filter(i => currencies.indexOf(i.name) > -1)) {\n total += item.system.price * item.system.quantity\n }\n template += ``\n }\n template += ''\n Dialog.prompt({\n title: 'Currency Totals',\n content: template\n })\n}", + "ownership": { + "default": 0, + "ueJGUfSYuRRL3Ypr": 3 + }, + "flags": { + "advanced-macros": { + "runAsGM": false, + "runForSpecificUser": "" + }, + "exportSource": { + "world": "swade-module-test", + "system": "swade", + "coreVersion": "10.291", + "systemVersion": "2.2.5" + }, + "core": { + "sourceId": "Macro.lOAxoK00x5QQFbTH" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1680966567327, + "modifiedTime": 1702959790712, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": null, + "sort": 600000, + "_id": "QMnx9cuyw81kRS2o", + "_key": "!macros!QMnx9cuyw81kRS2o" +} diff --git a/packs/helper-macros/_source/Havoc_0CalvjuxtMvY2enn.json b/packs/helper-macros/_source/Havoc_0CalvjuxtMvY2enn.json new file mode 100644 index 0000000..9eb01b2 --- /dev/null +++ b/packs/helper-macros/_source/Havoc_0CalvjuxtMvY2enn.json @@ -0,0 +1,27 @@ +{ + "name": "Havoc", + "type": "script", + "scope": "global", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/air/air-burst-spiral-yellow.webp", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Havoc'\n})", + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1678164427219, + "modifiedTime": 1700436564699, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "folder": "hIbrWxg1nDutCSwt", + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_id": "0CalvjuxtMvY2enn", + "sort": 0, + "_key": "!macros!0CalvjuxtMvY2enn" +} diff --git a/packs/helper-macros/_source/Intangibility_OMDjgWLJyE9BJAwT.json b/packs/helper-macros/_source/Intangibility_OMDjgWLJyE9BJAwT.json new file mode 100644 index 0000000..356aea2 --- /dev/null +++ b/packs/helper-macros/_source/Intangibility_OMDjgWLJyE9BJAwT.json @@ -0,0 +1,25 @@ +{ + "name": "Intangibility", + "type": "script", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Intangibility'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1678168528898, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "OMDjgWLJyE9BJAwT", + "folder": "hIbrWxg1nDutCSwt", + "sort": 1700000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!OMDjgWLJyE9BJAwT" +} diff --git a/packs/helper-macros/_source/Invisibility_11GOryzx2Q8MXbT6.json b/packs/helper-macros/_source/Invisibility_11GOryzx2Q8MXbT6.json new file mode 100644 index 0000000..8c7a786 --- /dev/null +++ b/packs/helper-macros/_source/Invisibility_11GOryzx2Q8MXbT6.json @@ -0,0 +1,25 @@ +{ + "name": "Invisibility", + "type": "script", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/svg/invisible.svg", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Invisibility'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1678168163811, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "11GOryzx2Q8MXbT6", + "folder": "hIbrWxg1nDutCSwt", + "sort": 1600000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!11GOryzx2Q8MXbT6" +} diff --git a/packs/helper-macros/_source/Power_Effects_Item_Action_AjuA11hQ48UJNwlH.json b/packs/helper-macros/_source/Power_Effects_Item_Action_AjuA11hQ48UJNwlH.json new file mode 100644 index 0000000..c10fbc6 --- /dev/null +++ b/packs/helper-macros/_source/Power_Effects_Item_Action_AjuA11hQ48UJNwlH.json @@ -0,0 +1,27 @@ +{ + "name": "Power Effects Item Action", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/magic/symbols/rune-sigil-black-pink.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n item,\n targets: game.user.targets,\n})", + "folder": null, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1693853383361, + "modifiedTime": 1702959790712, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "AjuA11hQ48UJNwlH", + "sort": 500000, + "_key": "!macros!AjuA11hQ48UJNwlH" +} diff --git a/packs/helper-macros/_source/Protection_YETsNWOWfIxyLPdC.json b/packs/helper-macros/_source/Protection_YETsNWOWfIxyLPdC.json new file mode 100644 index 0000000..263b429 --- /dev/null +++ b/packs/helper-macros/_source/Protection_YETsNWOWfIxyLPdC.json @@ -0,0 +1,25 @@ +{ + "name": "Protection", + "type": "script", + "scope": "global", + "author": "R9ZgY0IvWl8ovIuT", + "img": "systems/swade/assets/icons/status/status_protection.svg", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Protection'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1677630174987, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "YETsNWOWfIxyLPdC", + "folder": "hIbrWxg1nDutCSwt", + "sort": 1500000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!YETsNWOWfIxyLPdC" +} diff --git a/packs/helper-macros/_source/Quick_Damage_Roll_NANSnFATVJntUfL7.json b/packs/helper-macros/_source/Quick_Damage_Roll_NANSnFATVJntUfL7.json new file mode 100644 index 0000000..2ad2639 --- /dev/null +++ b/packs/helper-macros/_source/Quick_Damage_Roll_NANSnFATVJntUfL7.json @@ -0,0 +1,27 @@ +{ + "name": "Quick Damage Roll", + "type": "script", + "scope": "global", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/sundries/gaming/dice-runed-brown.webp", + "command": "new Dialog({\n title: \"Damage Roll Configuration\",\n content: `\n \n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n `,\n buttons: {\n ok: {\n label: \"Roll Damage\",\n callback: (html) => {\n const damageRoll = html.find('input[name=\"damageRoll\"]').val();\n let flavor = html.find('input[name=\"flavor\"]').val();\n const ap = parseInt(html.find('input[name=\"ap\"]').val()) || 0;\n const options = {};\n if (ap > 0) {\n flavor = `${flavor ? flavor + \" - \" : \"\"}AP: ${ap}`\n options.ap = ap;\n }\n // Perform the damage roll and send the message\n new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor });\n },\n },\n cancel: {\n label: \"Cancel\",\n },\n },\n}).render(true);", + "folder": null, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1702933790652, + "modifiedTime": 1702959790712, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "NANSnFATVJntUfL7", + "sort": 200000, + "_key": "!macros!NANSnFATVJntUfL7" +} diff --git a/packs/helper-macros/_source/Request_Notice_Roll_pnLnFrfTTJeodFRy.json b/packs/helper-macros/_source/Request_Notice_Roll_pnLnFrfTTJeodFRy.json new file mode 100644 index 0000000..56853b4 --- /dev/null +++ b/packs/helper-macros/_source/Request_Notice_Roll_pnLnFrfTTJeodFRy.json @@ -0,0 +1,27 @@ +{ + "name": "Request Notice Roll", + "type": "script", + "scope": "global", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/sundries/gaming/dice-pair-white-green.webp", + "command": "const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens\n\nconst traitName = 'Notice'\nconst traitType = 'skill' // or 'attribute'\n\nasync function main () {\n let tokens = Array.from(game.user.targets)\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens')\n return\n }\n\n const menuData = {\n inputs: [\n { type: 'info', label: `Requesting roll from ${tokens.map(t => t.name).join(', ')}` },\n {\n type: 'info',\n label: `Requesting a ${traitName} roll`\n },\n { type: 'number', label: 'Roll Modifier', options: 0 },\n { type: 'text', label: 'Roll Modifier Description', options: 'Roll Modifier' }\n ],\n buttons: [\n { label: 'Request roll', value: 'ok', default: true },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n const menuConfig = {\n title: `Request ${traitName} roll...`\n }\n const result = await warpgate.menu(menuData, menuConfig)\n\n if (result.buttons !== 'ok') {\n return\n }\n console.log(result)\n const rollMod = result.inputs[2]\n const rollModDesc = result.inputs[3]\n const rollType = traitType\n const rollDesc = traitName\n const options = {}\n if (rollMod !== 0) {\n options.mods = [{ label: rollModDesc, value: rollMod }]\n }\n\n requestRollFromTokens(tokens, rollType, rollDesc, options)\n}\n\nmain()", + "folder": null, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1700430548162, + "modifiedTime": 1702959790712, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "pnLnFrfTTJeodFRy", + "sort": 300000, + "_key": "!macros!pnLnFrfTTJeodFRy" +} diff --git a/packs/helper-macros/_source/Request_Roll_G9ksuYJo1512PTo9.json b/packs/helper-macros/_source/Request_Roll_G9ksuYJo1512PTo9.json new file mode 100644 index 0000000..3cae153 --- /dev/null +++ b/packs/helper-macros/_source/Request_Roll_G9ksuYJo1512PTo9.json @@ -0,0 +1,27 @@ +{ + "name": "Request Roll", + "type": "script", + "scope": "global", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/sundries/gaming/dice-runed-tan.webp", + "command": "const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens\n\nasync function main () {\n let tokens = Array.from(game.user.targets)\n if (tokens.length < 1) {\n tokens = canvas.tokens.controlled\n }\n if (tokens.length < 1) {\n ui.notifications.error('Please target or select some tokens')\n return\n }\n\n const menuData = {\n inputs: [\n { type: 'info', label: `Requesting roll from ${tokens.map(t => t.name).join(', ')}` },\n {\n type: 'select',\n label: 'Trait to roll',\n options: []\n },\n { type: 'number', label: 'Roll Modifier', options: 0 },\n { type: 'text', label: 'Roll Modifier Description', options: 'Roll Modifier' }\n ],\n buttons: [\n { label: 'Request roll', value: 'ok', default: true },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n const menuConfig = {\n title: 'Request roll...'\n }\n for (const attribute of ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor']) {\n menuData.inputs[1].options.push(\n { html: `Attribute | ${attribute}`, value: `a|${attribute}` }\n )\n }\n const skillSet = new Set()\n for (const token of tokens) {\n const skills = token.actor.items.filter(i => i.type === 'skill' &&\n !['Untrained', 'Unskilled Attempt'].includes(i.name))\n for (const skill of skills) {\n skillSet.add(skill.name)\n }\n }\n for (const skill of Array.from(skillSet).sort()) {\n menuData.inputs[1].options.push(\n { html: `Skill | ${skill}`, value: `s|${skill}` })\n }\n menuData.inputs[1].options.push(\n { html: 'Skill | Untrained', value: 's|NOSKILL' })\n const result = await warpgate.menu(menuData, menuConfig)\n\n if (result.buttons !== 'ok') {\n return\n }\n console.log(result)\n const rollMod = result.inputs[2]\n const rollModDesc = result.inputs[3]\n const rollParts = result.inputs[1].split('|')\n const rollType = (rollParts[0] === 'a' ? 'attribute' : 'skill')\n const rollDesc = rollParts[1]\n const options = {}\n if (rollMod !== 0) {\n options.mods = [{ label: rollModDesc, value: rollMod }]\n }\n\n requestRollFromTokens(tokens, rollType, rollDesc, options)\n}\n\nmain()", + "folder": null, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1700430548162, + "modifiedTime": 1702959790712, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "G9ksuYJo1512PTo9", + "sort": 400000, + "_key": "!macros!G9ksuYJo1512PTo9" +} diff --git a/packs/helper-macros/_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json b/packs/helper-macros/_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json new file mode 100644 index 0000000..50abb5d --- /dev/null +++ b/packs/helper-macros/_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json @@ -0,0 +1,27 @@ +{ + "name": "Set Token Vision", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/magic/perception/orb-crystal-ball-scrying-blue.webp", + "scope": "global", + "command": "const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null\n// argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values\n// will guess based on scene darkness\nconst BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark']\nconst THRESHOLDS = {\n dim: 0.4,\n dark: 0.6,\n pitchdark: 0.8\n}\nconst RANGES = {\n basic: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0\n },\n lowlight: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0\n },\n darkvision: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 10\n },\n nightvision: {\n bright: 200,\n dim: 200,\n dark: 200,\n pitchdark: 200\n }\n}\nconst SIGHT_NAMES = {\n lowlight: 'low-light-vision',\n darkvision: 'darkvision',\n nightvision: 'night-vision'\n}\nconst SIGHT_MODES = {\n lowlight: 'lowlight',\n darkvision: 'darkvision',\n nightvision: 'darkvision',\n basic: 'basic'\n}\n\nfunction findAbility (token, swid) {\n return token.actor.items.find(i => i.type === 'ability' && i.system.swid === swid)\n}\n\nasync function main () {\n const scene = game.scenes.current\n let sceneBright = BRIGHT_LEVELS[0]\n if (scene.darkness > THRESHOLDS.pitchdark) {\n sceneBright = BRIGHT_LEVELS[3]\n } else if (scene.darkness > THRESHOLDS.dark) {\n sceneBright = BRIGHT_LEVELS[2]\n } else if (scene.darkness > THRESHOLDS.dim) {\n sceneBright = BRIGHT_LEVELS[1]\n }\n let bright = sceneBright\n if (argBright && BRIGHT_LEVELS.includes(argBright)) {\n bright = argBright\n }\n const menuData = {\n inputs: [\n { type: 'radio', label: 'Bright Light', options: ['bright', bright === BRIGHT_LEVELS[0]] },\n { type: 'radio', label: 'Dim Light', options: ['bright', bright === BRIGHT_LEVELS[1]] },\n { type: 'radio', label: 'Dark', options: ['bright', bright === BRIGHT_LEVELS[2]] },\n { type: 'radio', label: 'Pitch Dark', options: ['bright', bright === BRIGHT_LEVELS[3]] }\n ],\n buttons: [\n { label: 'Select Scene Brightness', value: 'ok', default: true },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n const menuConfig = { title: 'Select scene brightness' }\n const result = await warpgate.menu(menuData, menuConfig)\n if (result.buttons !== 'ok') { return }\n\n for (let i = 0; i < 4; i++) {\n if (result.inputs[i]) { bright = BRIGHT_LEVELS[i] }\n }\n console.log(`Scene brightness is ${bright}`)\n\n for (const tokenId of scene.tokens.map(t => t.id)) {\n const token = scene.tokens.get(tokenId)\n if (!token.sight.enabled) {\n console.log(`Skipping ${token.name}, vision not enabled`)\n continue\n // don't set sight on a token where it's not enabled\n }\n let sightType = 'basic'\n for (const sight in SIGHT_NAMES) {\n console.log(`checking ${token} for ${SIGHT_NAMES[sight]}`)\n if (findAbility(token, SIGHT_NAMES[sight])) {\n sightType = sight\n console.log(`${token.name} has ${sightType}`)\n }\n }\n const range = RANGES[sightType][bright]\n const sightMode = SIGHT_MODES[sightType]\n const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults\n const data = {\n 'sight.range': range,\n 'sight.visionMode': sightMode,\n 'sight.attenuation': visionModeData.attenuation,\n 'sight.brightness': visionModeData.brightness,\n 'sight.saturation': visionModeData.saturation,\n 'sight.contrast': visionModeData.contrast\n }\nconsole.log(`Updating ${token.name}:`, data)\n await token.update(data)\n }\n}\n\nmain()", + "folder": null, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1702934878750, + "modifiedTime": 1702959790712, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "arjbjmgKMjyp9tWE", + "sort": 100000, + "_key": "!macros!arjbjmgKMjyp9tWE" +} diff --git a/packs/helper-macros/_source/Shape_Change_8gxeYSUJ1FQhmJRw.json b/packs/helper-macros/_source/Shape_Change_8gxeYSUJ1FQhmJRw.json new file mode 100644 index 0000000..212cda7 --- /dev/null +++ b/packs/helper-macros/_source/Shape_Change_8gxeYSUJ1FQhmJRw.json @@ -0,0 +1,25 @@ +{ + "folder": "hIbrWxg1nDutCSwt", + "name": "Shape Change", + "type": "script", + "_id": "8gxeYSUJ1FQhmJRw", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/magic/symbols/runes-star-blue.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Shape Change'\n})", + "sort": 100000, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1695618313958, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!macros!8gxeYSUJ1FQhmJRw" +} diff --git a/packs/helper-macros/_source/Sloth_Speed_uWF4I2mnDkV8NZ6j.json b/packs/helper-macros/_source/Sloth_Speed_uWF4I2mnDkV8NZ6j.json new file mode 100644 index 0000000..d953427 --- /dev/null +++ b/packs/helper-macros/_source/Sloth_Speed_uWF4I2mnDkV8NZ6j.json @@ -0,0 +1,27 @@ +{ + "name": "Sloth/Speed", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/skills/movement/feet-winged-sandals-tan.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Sloth/Speed'\n})", + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1677996503821, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "folder": "hIbrWxg1nDutCSwt", + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "_id": "uWF4I2mnDkV8NZ6j", + "sort": 500000, + "_key": "!macros!uWF4I2mnDkV8NZ6j" +} diff --git a/packs/helper-macros/_source/Smite_C1vGk7AKQDpcvKyP.json b/packs/helper-macros/_source/Smite_C1vGk7AKQDpcvKyP.json new file mode 100644 index 0000000..db05216 --- /dev/null +++ b/packs/helper-macros/_source/Smite_C1vGk7AKQDpcvKyP.json @@ -0,0 +1,27 @@ +{ + "name": "Smite", + "type": "script", + "scope": "global", + "author": "R9ZgY0IvWl8ovIuT", + "img": "systems/swade/assets/icons/status/status_smite.svg", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Smite'\n})", + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1677548889704, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "C1vGk7AKQDpcvKyP", + "folder": "hIbrWxg1nDutCSwt", + "sort": 1400000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!C1vGk7AKQDpcvKyP" +} diff --git a/packs/helper-macros/_source/Summon_Ally_RV09eJi9iG5bfupo.json b/packs/helper-macros/_source/Summon_Ally_RV09eJi9iG5bfupo.json new file mode 100644 index 0000000..4fa43cc --- /dev/null +++ b/packs/helper-macros/_source/Summon_Ally_RV09eJi9iG5bfupo.json @@ -0,0 +1,25 @@ +{ + "name": "Summon Ally", + "type": "script", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/symbols/runes-star-orange.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Summon Ally'\n})", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1677996503821, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "RV09eJi9iG5bfupo", + "folder": "hIbrWxg1nDutCSwt", + "sort": 1000000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!RV09eJi9iG5bfupo" +} diff --git a/packs/helper-macros/_source/Summon_Animal_745gcs8ytsCLPXe1.json b/packs/helper-macros/_source/Summon_Animal_745gcs8ytsCLPXe1.json new file mode 100644 index 0000000..2937d81 --- /dev/null +++ b/packs/helper-macros/_source/Summon_Animal_745gcs8ytsCLPXe1.json @@ -0,0 +1,25 @@ +{ + "name": "Summon Animal", + "type": "script", + "_id": "745gcs8ytsCLPXe1", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/symbols/mask-yellow-orange.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Summon Animal'\n})", + "folder": "hIbrWxg1nDutCSwt", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1694403406793, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "sort": 800000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!745gcs8ytsCLPXe1" +} diff --git a/packs/helper-macros/_source/Summon_Monster_V8r5hugGBQfqlhYt.json b/packs/helper-macros/_source/Summon_Monster_V8r5hugGBQfqlhYt.json new file mode 100644 index 0000000..8a953b9 --- /dev/null +++ b/packs/helper-macros/_source/Summon_Monster_V8r5hugGBQfqlhYt.json @@ -0,0 +1,25 @@ +{ + "name": "Summon Monster", + "type": "script", + "_id": "V8r5hugGBQfqlhYt", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/symbols/mask-metal-silver-white.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Summon Monster'\n})", + "folder": "hIbrWxg1nDutCSwt", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1694403446899, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "sort": 1300000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!V8r5hugGBQfqlhYt" +} diff --git a/packs/helper-macros/_source/Summon_Nature_s_Ally_wU2mAUnw3RW9qMT8.json b/packs/helper-macros/_source/Summon_Nature_s_Ally_wU2mAUnw3RW9qMT8.json new file mode 100644 index 0000000..4eb5584 --- /dev/null +++ b/packs/helper-macros/_source/Summon_Nature_s_Ally_wU2mAUnw3RW9qMT8.json @@ -0,0 +1,25 @@ +{ + "name": "Summon Nature's Ally", + "type": "script", + "_id": "wU2mAUnw3RW9qMT8", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/symbols/mask-yellow-orange.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Summon Nature's Ally'\n})", + "folder": "hIbrWxg1nDutCSwt", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1694403243667, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "sort": 900000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!wU2mAUnw3RW9qMT8" +} diff --git a/packs/helper-macros/_source/Summon_Planar_Ally_jACgJo0HAmkyzFjZ.json b/packs/helper-macros/_source/Summon_Planar_Ally_jACgJo0HAmkyzFjZ.json new file mode 100644 index 0000000..49a693c --- /dev/null +++ b/packs/helper-macros/_source/Summon_Planar_Ally_jACgJo0HAmkyzFjZ.json @@ -0,0 +1,25 @@ +{ + "name": "Summon Planar Ally", + "type": "script", + "_id": "jACgJo0HAmkyzFjZ", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/symbols/runes-star-orange-purple.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Summon Planar Ally'\n})", + "folder": "hIbrWxg1nDutCSwt", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1694403168266, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "sort": 1200000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!jACgJo0HAmkyzFjZ" +} diff --git a/packs/helper-macros/_source/Summon_Undead_eeX3Hoy2Uxo5BeUC.json b/packs/helper-macros/_source/Summon_Undead_eeX3Hoy2Uxo5BeUC.json new file mode 100644 index 0000000..76e1a50 --- /dev/null +++ b/packs/helper-macros/_source/Summon_Undead_eeX3Hoy2Uxo5BeUC.json @@ -0,0 +1,25 @@ +{ + "name": "Summon Undead", + "type": "script", + "_id": "eeX3Hoy2Uxo5BeUC", + "author": "R9ZgY0IvWl8ovIuT", + "img": "icons/magic/symbols/star-yellow.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Summon Undead'\n})", + "folder": "hIbrWxg1nDutCSwt", + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.311", + "createdTime": 1694404089533, + "modifiedTime": 1696209757148, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "sort": 1100000, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "_key": "!macros!eeX3Hoy2Uxo5BeUC" +} diff --git a/packs/helper-macros/_source/Zombie_mdci1DSM3UTaLzrb.json b/packs/helper-macros/_source/Zombie_mdci1DSM3UTaLzrb.json new file mode 100644 index 0000000..ffc1b37 --- /dev/null +++ b/packs/helper-macros/_source/Zombie_mdci1DSM3UTaLzrb.json @@ -0,0 +1,27 @@ +{ + "name": "Zombie", + "type": "script", + "author": "sVoCvBU1knmXzoYe", + "img": "icons/magic/death/hand-dirt-undead-zombie.webp", + "scope": "global", + "command": "game.modules.get('swade-mb-helpers').api.powerEffects({\n token,\n targets: game.user.targets,\n name: 'Zombie'\n})", + "folder": "hIbrWxg1nDutCSwt", + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1694404089533, + "modifiedTime": 1702859394353, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "_id": "mdci1DSM3UTaLzrb", + "sort": 0, + "_key": "!macros!mdci1DSM3UTaLzrb" +} diff --git a/packs/module-docs/000014.ldb b/packs/module-docs/000014.ldb new file mode 100644 index 0000000..ae757ca Binary files /dev/null and b/packs/module-docs/000014.ldb differ diff --git a/packs/module-docs/000221.ldb b/packs/module-docs/000221.ldb deleted file mode 100644 index 11a7d7b..0000000 Binary files a/packs/module-docs/000221.ldb and /dev/null differ diff --git a/packs/module-docs/CURRENT b/packs/module-docs/CURRENT index 4846f49..42c62b6 100644 --- a/packs/module-docs/CURRENT +++ b/packs/module-docs/CURRENT @@ -1 +1 @@ -MANIFEST-000238 +MANIFEST-000015 diff --git a/packs/module-docs/LOG b/packs/module-docs/LOG index 17e646e..614cd03 100644 --- a/packs/module-docs/LOG +++ b/packs/module-docs/LOG @@ -1,8 +1,3 @@ -2023/11/20-21:06:40.367710 7f1f87fff640 Recovering log #236 -2023/11/20-21:06:40.373515 7f1f87fff640 Delete type=3 #234 -2023/11/20-21:06:40.373593 7f1f87fff640 Delete type=0 #236 -2023/11/20-21:52:53.112300 7f1f7fab1640 Level-0 table #241: started -2023/11/20-21:52:53.112780 7f1f7fab1640 Level-0 table #241: 0 bytes OK -2023/11/20-21:52:53.114883 7f1f7fab1640 Delete type=0 #239 -2023/11/20-21:52:53.120771 7f1f7fab1640 Manual compaction at level-0 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!Q4iS1LIiyy7acuaF.zvPWCYx402kk2hsE' @ 0 : 0; will stop at (end) -2023/11/20-21:52:53.122876 7f1f7fab1640 Manual compaction at level-1 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!Q4iS1LIiyy7acuaF.zvPWCYx402kk2hsE' @ 0 : 0; will stop at (end) +2023/12/19-22:11:47.107915 7f81967fc700 Recovering log #12 +2023/12/19-22:11:47.129799 7f81967fc700 Delete type=0 #12 +2023/12/19-22:11:47.129819 7f81967fc700 Delete type=3 #10 diff --git a/packs/module-docs/LOG.old b/packs/module-docs/LOG.old index 6dde5ab..4fbe5e2 100644 --- a/packs/module-docs/LOG.old +++ b/packs/module-docs/LOG.old @@ -1,8 +1,15 @@ -2023/11/19-23:28:00.213421 7f1f877fe640 Recovering log #232 -2023/11/19-23:28:00.217882 7f1f877fe640 Delete type=0 #232 -2023/11/19-23:28:00.218006 7f1f877fe640 Delete type=3 #230 -2023/11/19-23:53:02.978275 7f1f7fab1640 Level-0 table #237: started -2023/11/19-23:53:02.978315 7f1f7fab1640 Level-0 table #237: 0 bytes OK -2023/11/19-23:53:02.980281 7f1f7fab1640 Delete type=0 #235 -2023/11/19-23:53:02.980581 7f1f7fab1640 Manual compaction at level-0 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!Q4iS1LIiyy7acuaF.zvPWCYx402kk2hsE' @ 0 : 0; will stop at (end) -2023/11/19-23:53:02.982433 7f1f7fab1640 Manual compaction at level-1 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!Q4iS1LIiyy7acuaF.zvPWCYx402kk2hsE' @ 0 : 0; will stop at (end) +2023/12/19-14:25:58.704299 7fb0acf3b700 Recovering log #8 +2023/12/19-14:25:58.717166 7fb0acf3b700 Delete type=3 #6 +2023/12/19-14:25:58.717190 7fb0acf3b700 Delete type=0 #8 +2023/12/19-22:08:59.583949 7fb086400700 Level-0 table #13: started +2023/12/19-22:08:59.590634 7fb086400700 Level-0 table #13: 7975 bytes OK +2023/12/19-22:08:59.600142 7fb086400700 Delete type=0 #11 +2023/12/19-22:08:59.600341 7fb086400700 Manual compaction at level-0 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!YSuk1v59tLaL9XUK.BxFgDb91dqbkO9h4' @ 0 : 0; will stop at (end) +2023/12/19-22:08:59.622125 7fb086400700 Manual compaction at level-1 from '!journal!HbtPlHNFO1L6RVj0' @ 72057594037927935 : 1 .. '!journal.pages!YSuk1v59tLaL9XUK.BxFgDb91dqbkO9h4' @ 0 : 0; will stop at '!journal.pages!YSuk1v59tLaL9XUK.BxFgDb91dqbkO9h4' @ 17 : 1 +2023/12/19-22:08:59.622154 7fb086400700 Compacting 1@1 + 1@2 files +2023/12/19-22:08:59.629116 7fb086400700 Generated table #14@1: 17 keys, 11373 bytes +2023/12/19-22:08:59.629154 7fb086400700 Compacted 1@1 + 1@2 files => 11373 bytes +2023/12/19-22:08:59.638172 7fb086400700 compacted to: files[ 0 0 1 0 0 0 0 ] +2023/12/19-22:08:59.638243 7fb086400700 Delete type=2 #5 +2023/12/19-22:08:59.638324 7fb086400700 Delete type=2 #13 +2023/12/19-22:08:59.648805 7fb086400700 Manual compaction at level-1 from '!journal.pages!YSuk1v59tLaL9XUK.BxFgDb91dqbkO9h4' @ 17 : 1 .. '!journal.pages!YSuk1v59tLaL9XUK.BxFgDb91dqbkO9h4' @ 0 : 0; will stop at (end) diff --git a/packs/module-docs/MANIFEST-000015 b/packs/module-docs/MANIFEST-000015 new file mode 100644 index 0000000..c554a59 Binary files /dev/null and b/packs/module-docs/MANIFEST-000015 differ diff --git a/packs/module-docs/MANIFEST-000238 b/packs/module-docs/MANIFEST-000238 deleted file mode 100644 index 05a5b89..0000000 Binary files a/packs/module-docs/MANIFEST-000238 and /dev/null differ diff --git a/packs/module-docs/_source/API_Documentation_Q4iS1LIiyy7acuaF.json b/packs/module-docs/_source/API_Documentation_Q4iS1LIiyy7acuaF.json new file mode 100644 index 0000000..84c8383 --- /dev/null +++ b/packs/module-docs/_source/API_Documentation_Q4iS1LIiyy7acuaF.json @@ -0,0 +1,129 @@ +{ + "name": "API Documentation", + "pages": [ + { + "sort": 100000, + "name": "Accessing the API", + "type": "text", + "_id": "Q4WPDTxUW6te0td1", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

The swade-mb-helpers API can be accessed in a macro with the following line of code:

const api = game.modules.get('swade-mb-helpers').api

The name 'api' will be used for all examples but the variable name within your macro doesn't matter.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1700438788646, + "modifiedTime": 1700438788646, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!journal.pages!Q4iS1LIiyy7acuaF.Q4WPDTxUW6te0td1" + }, + { + "sort": 200000, + "name": "api.powerEffects", + "type": "text", + "_id": "X0rGr7qO1SRHwy9q", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "
async function powerEffects (options = {})

powerEffects is the dispatcher behind all of the power effects in swade-mb-helpers. It will parse the options to handle power dialogs and effects for every currently handled power effect within this module.

Parameters

The only parameter is the options parameter detailed below


Options

the options object has the following fields:

One of 'item' or 'name' must be set.

Returns

There is no return value for this function.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1700439000261, + "modifiedTime": 1700439000261, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!journal.pages!Q4iS1LIiyy7acuaF.X0rGr7qO1SRHwy9q" + }, + { + "sort": 300000, + "name": "api.requestRollFromTokens", + "type": "text", + "_id": "zvPWCYx402kk2hsE", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "
async function requestRollFromTokens (tokens, rollType, rollDesc, options = {})

This will request a roll from the tokens given using socketlib to request the roll from the currently logged on owner of the token.

Parameters

Options

The options object can be completely empty, but can have any or all of the following optional fields:

Returns

The return value is a list of promises which, if fulfilled, are the resulting roll objects from the token's rolls.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1700439709611, + "modifiedTime": 1700440442904, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!journal.pages!Q4iS1LIiyy7acuaF.zvPWCYx402kk2hsE" + } + ], + "folder": null, + "ownership": { + "default": 0, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1700438778794, + "modifiedTime": 1700440473945, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_id": "Q4iS1LIiyy7acuaF", + "sort": 100000, + "_key": "!journal!Q4iS1LIiyy7acuaF" +} diff --git a/packs/module-docs/_source/Common_Actions_HbtPlHNFO1L6RVj0.json b/packs/module-docs/_source/Common_Actions_HbtPlHNFO1L6RVj0.json new file mode 100644 index 0000000..c78d477 --- /dev/null +++ b/packs/module-docs/_source/Common_Actions_HbtPlHNFO1L6RVj0.json @@ -0,0 +1,59 @@ +{ + "name": "Common Actions", + "pages": [ + { + "sort": 100000, + "name": "Common Actions", + "type": "text", + "_id": "Tkzn8n0GpCQNiRVc", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

The Common Actions compendium contains helpful actions that may be dragged to character sheets or character sheet items to enhance their capability.

These come in several styles:

Power Actions and Oppose

Power Actions are intended to enhance specific powers with the relevant damage modifiers and useful oppositions. The Power Effect action is a macro action intended to be dragged to every power's action tab, and will run the correct power's effect based on the item name or swid.

Power Actions which share a name with a power are intended to be dragged to powers which share their name. They'll generally add all or most special power effects, opposed rolls, and damage.

Power Actions and Oppose actions named \"Oppose (trait)\" or \"Shake Off (trait)\" are intended to be dragged a la carte to any power or weapon that needs them. They generally add resistance rolls to the chat cart for the item.

Savage Pathfinder or SWADE

Actions in these categories are intended to be helpful rule references and dragged directly to a character sheet and used as an action. They'll add useful trait, damage, and resist rolls to the actions on a card, and the description text links to the premium module's documentation.

Illumination

The Illumination action exists to provide some easily toggled effects for Dim, Dark, and Pitch Dark illumination penalties. Drag it to a character sheet to get the effects in your quick bar.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695618024231, + "modifiedTime": 1702960414116, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!journal.pages!HbtPlHNFO1L6RVj0.Tkzn8n0GpCQNiRVc" + } + ], + "folder": null, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695618001902, + "modifiedTime": 1702960414116, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "HbtPlHNFO1L6RVj0", + "sort": 200000, + "_key": "!journal!HbtPlHNFO1L6RVj0" +} diff --git a/packs/module-docs/_source/Macros_Mw1g2Fx5dp4SoqVP.json b/packs/module-docs/_source/Macros_Mw1g2Fx5dp4SoqVP.json new file mode 100644 index 0000000..a01f5e5 --- /dev/null +++ b/packs/module-docs/_source/Macros_Mw1g2Fx5dp4SoqVP.json @@ -0,0 +1,275 @@ +{ + "name": "Macros", + "pages": [ + { + "sort": 100000, + "name": "Effect Macros", + "type": "text", + "_id": "i31qmsZnIGhjvA2K", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

There is one primary effect macro @UUID[Compendium.swade-mb-helpers.helper-macros.Macro.AjuA11hQ48UJNwlH]{Power Effects Item Action} that is meant to be used as a power's macro action. It will automatically note the item it was called from and apply an appropriate effect if it's been implemented. The game-affecting power modifiers are implemented as additional active effects, and game effects are applied but no special effects are applied. If you want that, use Automated Animations or Token Variant Art.

There is also a repository of individually named macros, one for each power implemented by the primary effect macro, for GMs who want to run the macro for their players. They're configured to be run with a selected token and targeted token(s) as appropriate.

", + "markdown": "" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": null, + "modifiedTime": 1700438350403, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K" + }, + { + "sort": 200000, + "name": "Summoning", + "type": "text", + "_id": "9kDcPyCrI6hbF0qA", + "title": { + "show": true, + "level": 2 + }, + "image": {}, + "text": { + "format": 1, + "content": "

The Summon effects expects to have one and only one target, and depends on the existence of an Actor folder called \"Summonables/<POWER>\" on the Actor sidebar (eg \"Summonables/Summon Ally\"). If this folder has subfolders, they'll be used by the macro to sort the list of available summonables. In the Summonables/<POWER> folder and subfolders, place the Actors that are available for summoning.

Template Actors

The Summonables/<POWER> folders are enhanced by template npc actors. If present, these enable additional automation when using some aspects of SWADE or SWPF summoning. All Summon powers (but not Zombie) benefit from an npc actor called \"raise_template\", which should have your handmade or purchased system content's 'Resilient' ability (and any effects embedded in that ability).

Summon Ally

The Summon Ally power requires some additional setup:

  1. an NPC actor called \"Mirror Self\" that has your version of the Construct and Fearless special abilities (only)

  2. (optional but recommended) the additional template actors described below

\"Summonables/Summon Ally\" also benefit from \"bite-claw_template\", \"combat-edge_template\", \"flight_template\", in addition to \"raise_template\" mentioned above. In all template actors, please ensure that no two Items are named exactly the same (eg an Edge named 'Frenzy' and an action named 'Frenzy' will not work) due to a limitation in WarpGate.

(I cannot include these template actors in this module because a) they'd be different for SWADE and SWPF, and b) I can't redistribute the embedded abilities as it is copyrighted material).

bite-claw_template

This npc actor needs items (like a claw weapon and a claws special ability) that are transferred to the summoned token.

combat-edge_template

This npc actor should have every combat edge you want to support dragged to the actor.

flight_template

This npc actor should have a Flight Item (probably a special ability) and/or the Flying active effect.

Zombie

The Zombie power requires an additional step as well. Raises are different for Zombie, as are some other effects. Zombie therefore does not require a \"raise_template\", but does need an \"armed_template\" which should have (only) Items that represent a hand weapon and a ranged weapon.

The macro assumes that both Zombie and Skeleton tokens will be added to the Summonables/Zombie folder, and doesn't attempt to apply the 'Skeletal' modifier directly.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695617584063, + "modifiedTime": 1702859823558, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.9kDcPyCrI6hbF0qA" + }, + { + "sort": 300000, + "name": "Shape Change", + "type": "text", + "_id": "lhULHNp4gz9IjOR3", + "title": { + "show": true, + "level": 2 + }, + "image": {}, + "text": { + "format": 1, + "content": "

Shape Change (and Baleful Polymorph) require an Actor folder similar to that found under Summoning, but named \"Morphables/<POWER>\". Fill this folder (and subfolders) with the creature actors that you wish to allow a Shape Change into. There are no template actors for shape change.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.1.4", + "coreVersion": "11.309", + "createdTime": 1695617700772, + "modifiedTime": 1695617961155, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.lhULHNp4gz9IjOR3" + }, + { + "sort": 0, + "name": "Gold Totals", + "type": "text", + "_id": "YmDbZXqcjYjr9pP9", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

The Gold Totals macro will look for Currency items on the selected token(s), and total up their value and quantity.

It assumes the currency items are named 'Platinum', 'Gold', 'Silver', and 'Copper' and have their true individual coin value recorded as 'price'.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.2", + "coreVersion": "11.315", + "createdTime": 1700437986321, + "modifiedTime": 1700438357999, + "lastModifiedBy": "R9ZgY0IvWl8ovIuT" + }, + "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.YmDbZXqcjYjr9pP9" + }, + { + "sort": -100000, + "name": "Request Roll", + "type": "text", + "_id": "NgwdcyoMzYFc8VOM", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

The Request Roll macro will present a menu detailing the targeted or selected tokens, asking for a Trait to roll against and an optional modifier to that roll. Once a trait and modifier are selected, a standard roll dialog will appear on the (logged in) token owner's screen for each targeted or selected token, with the modifier already filled in. When confirmed the roll proceeds as usual.

This is to enable the GM to say, for example, 'Everyone give me a Notice roll at -2' quickly and easily.

Also included is a \"Request Notice Roll\" macro that has Notice pre chosen, with a set of constants at the top of the macro defining the roll type. This is intended to be duplicated and modified by the GM for other quick rolls.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "R9ZgY0IvWl8ovIuT": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1700438372449, + "modifiedTime": 1702859968781, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.NgwdcyoMzYFc8VOM" + }, + { + "sort": -100000, + "name": "Quick Damage Roll", + "type": "text", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

The Quick Damage Roll macro will a dialog to configure a damage roll, with its chat card and Apply Damage button, for cases where it's not worth creating an actor, token, and action for a single roll.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": { + "sourceId": "Compendium.swade-mb-helpers.module-docs.JournalEntry.Mw1g2Fx5dp4SoqVP.JournalEntryPage.8OcZYeZTJWqJpeBs" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1702934117575, + "modifiedTime": 1702934796555, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "ruuxf72hwlcRzymt", + "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.ruuxf72hwlcRzymt" + }, + { + "sort": 400000, + "name": "Set Token Vision", + "type": "text", + "_id": "mT3lMGUo9zvqQsOh", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

The Set Token Vision macro can be called without arguments, or with (eg from MATT) a single argument of one of 'bright', 'dim', 'dark', 'pitchdark'. If called without an argument or with an invalid argument, it will attempt to guess the current scene's brightness level based on the darkness level defined on the scene.

It will pop up a dialog confirming the brightness level before trying to set, for all tokens with vision already enabled, vision range, vision type, and vision parameters to something appropriate based on the scene brightness, the vision related special abilities the token has, and some estimates to use savage worlds vision within a VTT. The macro as written assumes Savage Pathfinder vision rules.

For global illumination penalties one can apply, please see the Illumination action under the SWADE MB Common Actions compendium.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1702959842685, + "modifiedTime": 1702960233927, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!journal.pages!Mw1g2Fx5dp4SoqVP.mT3lMGUo9zvqQsOh" + } + ], + "flags": { + "core": { + "sourceId": "JournalEntry.Mw1g2Fx5dp4SoqVP" + } + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1678169291843, + "modifiedTime": 1702960233927, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "Mw1g2Fx5dp4SoqVP", + "folder": null, + "sort": 300000, + "ownership": { + "default": 0, + "ueJGUfSYuRRL3Ypr": 3 + }, + "_key": "!journal!Mw1g2Fx5dp4SoqVP" +} diff --git a/packs/module-docs/_source/Setting_Adjustments_YSuk1v59tLaL9XUK.json b/packs/module-docs/_source/Setting_Adjustments_YSuk1v59tLaL9XUK.json new file mode 100644 index 0000000..afa67b3 --- /dev/null +++ b/packs/module-docs/_source/Setting_Adjustments_YSuk1v59tLaL9XUK.json @@ -0,0 +1,94 @@ +{ + "name": "Setting Adjustments", + "pages": [ + { + "sort": 100000, + "name": "Lighting Modes", + "type": "text", + "_id": "BlDoYgdTxhyCBP3Y", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

SWADE MB Helpers does some modification of the vision modes to make them more in line with SWADE's lighting methods:

  1. Basic sight is desaturated and not artificially brightened, but things look normal in lighting (or global illumination.

  2. Low Light Vision is a new lighting mode that is slightly desaturated and artificially brightens the canvas some, but not as much as dim light.

  3. Darkvision is normal saturation level and just slightly less bright than bright light. In addition, Darkvision treats dim light as bright light.

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1702880436985, + "modifiedTime": 1702880706703, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!journal.pages!YSuk1v59tLaL9XUK.BlDoYgdTxhyCBP3Y" + }, + { + "sort": 200000, + "name": "Roll Modifier Hooks", + "type": "text", + "_id": "BxFgDb91dqbkO9h4", + "title": { + "show": true, + "level": 1 + }, + "image": {}, + "text": { + "format": 1, + "content": "

SWADE Trait and Damage Rolls can now take into account common modifiers based on the target, if there is exactly one attacker and one target. Most will show up on all trait rolls if the target conditions are right. Gang up bonuses will only show up on Fighting rolls.

Any of the proposed modifiers may be ignored by checking the Ignore checkbox. Some modifiers are pre-ignored and must be unchecked to take effect.

The following target conditions are checked for before trait rolls:

  1. Vulnerable

  2. Deflection (as applied by the Deflection power effect from this module)

  3. Arcane Protection (as applied by the Arcane Protection power effect from this module)

  4. Arcane Resistance

  5. Scale Modifiers

  6. Gang Up, taking into account Block and Formation Fighter

The following target conditions are checked for before damage rolls:

  1. Arcane Protection (as applied by the Arcane Protection power effect from this module)

  2. Arcane Resistance

  3. Special Abilities with 'weakness' in the swid (ignored by default, +4 damage)

  4. Special Abilities with 'resistance' in the swid (ignored by default, -4 damage)

  5. Gang Up bonus if the attacker has Pack Tactics

" + }, + "video": { + "controls": true, + "volume": 0.5 + }, + "src": null, + "system": {}, + "ownership": { + "default": -1, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": {}, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1703044226574, + "modifiedTime": 1703044226574, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_key": "!journal.pages!YSuk1v59tLaL9XUK.BxFgDb91dqbkO9h4" + } + ], + "folder": null, + "ownership": { + "default": 0, + "sVoCvBU1knmXzoYe": 3 + }, + "flags": { + "core": {} + }, + "_stats": { + "systemId": "swade", + "systemVersion": "3.2.5", + "coreVersion": "11.315", + "createdTime": 1695618001902, + "modifiedTime": 1703044226574, + "lastModifiedBy": "sVoCvBU1knmXzoYe" + }, + "_id": "YSuk1v59tLaL9XUK", + "sort": 0, + "_key": "!journal!YSuk1v59tLaL9XUK" +} diff --git a/scripts/module.js b/scripts/module.js index 852a4cc..9e81b1e 100644 --- a/scripts/module.js +++ b/scripts/module.js @@ -1,5 +1,6 @@ import { api } from './api.js' import { requestTokenRoll } from './helpers.js' +import { preDamageRollModifiers, preTraitRollModifiers } from './rollHelpers.js' import { shapeChangeOnDismiss } from './powerEffects.js' import { log, shim } from './shim.js' @@ -16,6 +17,65 @@ function _checkModule (name) { Hooks.on('setup', api.registerFunctions) +Hooks.on('init', () => { + log('INIT VISION') + CONFIG.Canvas.visionModes.basic = new VisionMode({ + id: 'basic', + label: 'VISION.ModeBasicVision', + canvas: { + shader: ColorAdjustmentsSamplerShader, + uniforms: { contrast: 0, saturation: -0.85, brightness: -1.0 } + }, + lighting: { + background: { visibility: VisionMode.LIGHTING_VISIBILITY.REQUIRED } + }, + vision: { + darkness: { adaptive: false }, + defaults: { attenuation: 0, contrast: 0, saturation: -0.85, brightness: -1.0 }, + preferred: true + } + }) + CONFIG.Canvas.visionModes.darkvision = new VisionMode({ + id: 'darkvision', + label: 'VISION.ModeDarkvision', + canvas: { + shader: ColorAdjustmentsSamplerShader, + uniforms: { contrast: 0, saturation: 0, brightness: 0.75, tint: [0.8, 0.8, 1.0] } + }, + lighting: { + background: { visibility: VisionMode.LIGHTING_VISIBILITY.REQUIRED }, + levels: { + [VisionMode.LIGHTING_LEVELS.DIM]: VisionMode.LIGHTING_LEVELS.BRIGHT + } + }, + vision: { + darkness: { adaptive: false }, + defaults: { attenuation: 0.1, contrast: 0, saturation: 0, brightness: 0.75 }, + preferred: true + } + }) + CONFIG.Canvas.visionModes.lowlight = new VisionMode({ + id: 'lowlight', + label: 'Low Light Vision', + canvas: { + shader: ColorAdjustmentsSamplerShader, + uniforms: { contrast: 0, saturation: -0.5, brightness: -0.2 } + }, + lighting: { + background: { visibility: VisionMode.LIGHTING_VISIBILITY.REQUIRED } + }, + vision: { + darkness: { adaptive: false }, + defaults: { attenuation: 0.1, contrast: 0, saturation: -0.5, brightness: -0.2 }, + preferred: true + } + }) +}) + +Hooks.on('swadePreRollAttribute', preTraitRollModifiers) +Hooks.on('swadePreRollSkill', preTraitRollModifiers) +Hooks.on('swadeRollDamage', preDamageRollModifiers) + Hooks.on('ready', () => { _checkModule('warpgate') _checkModule('socketlib') diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 9765507..0bb816d 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -822,7 +822,10 @@ class ShapeChangeEffect extends TargetedPowerEffect { actorLink: false, name: `${this.targets[0].name} (${this.protoDoc.name} form) `, elevation: this.targets[0].document.elevation, - disposition: this.targets[0].document.disposition + disposition: this.targets[0].document.disposition, + sight: { + enabled: true + } }, embedded: { ActiveEffect: {}, Item: {} } } @@ -1033,6 +1036,7 @@ class SummonEffect extends PowerEffect { async prepMenu () { this.menuData.inputs[1].label = `${this.token.name} is summoning...` + this.menuData.buttons = this.menuData.buttons.filter(b => b.value !== 'raise') const actors = await this.prepActors() if (Object.keys(actors).length < 1) { shim.notifications.error('No summonables found') @@ -1098,7 +1102,11 @@ class SummonEffect extends PowerEffect { }, token: { actorLink: false, - name: `${this.token.name}'s ${this.protoDoc.name}` + name: `${this.token.name}'s ${this.protoDoc.name}`, + disposition: this.token.document.disposition, + sight: { + enabled: true + } }, embedded: { ActiveEffect: {}, Item: {} } } @@ -1189,6 +1197,11 @@ class SummonAllyEffect extends SummonEffect { async prepMenu () { await super.prepMenu() + this.menuData.buttons = [ + this.menuData.buttons[0], + { label: 'Apply with Raise', value: 'raise' }, + this.menuData.buttons[1] + ] this.menuData.inputs = this.menuData.inputs.concat([ { type: 'checkbox', @@ -1367,6 +1380,158 @@ class SummonUndeadEffect extends SummonEffect { } } +class ZombieEffect extends SummonEffect { + get name () { + return 'Zombie' + } + + async prepMenu () { + await super.prepMenu() + this.menuData.buttons = [ + this.menuData.buttons[0], + { label: 'Apply with Raise', value: 'raise' }, + this.menuData.buttons[1] + ] + this.menuData.inputs.pop() + this.menuData.inputs = this.menuData.inputs.concat([ + { + type: 'checkbox', + label: 'Armed (Hand Weapon (Str+d6) or Ranged Weapon (2d6)', + options: false + }, { + type: 'checkbox', + label: '+2 Armor', + options: false + }, { + type: 'info', + label: 'Skeletal creatures +1 per zombie' + } + ]) + } + + async prepResult () { + this.raise = (this.buttons === 'raise') + this.actorId = this.inputs[this.inputIndex] + this.number = this.inputs[this.inputIndex + 1] + this.actor = shim.actors.get(this.actorId) + this.icon = this.actor.prototypeToken.texture.src + this.protoDoc = await this.actor.getTokenDocument() + this.increasedTrait = this.raise + this.armed = this.inputs[this.inputIndex + 2] + this.armor = this.inputs[this.inputIndex + 3] + this.spawnOptions = { + controllingActor: this.token.actor, + duplicates: this.number, + updateOpts: { + embedded: { + Item: { renderSheet: null } + } + }, + crosshairs: { + icon: this.icon, + label: `Summon ${this.actor.name}`, + drawOutline: true, + rememberControlled: true + } + } + this.spawnMutation = { + actor: { + name: `${this.token.name}'s ${this.actor.name}` + }, + token: { + actorLink: false, + name: `${this.token.name}'s ${this.protoDoc.name}`, + disposition: this.token.document.disposition, + sight: { enabled: true } + }, + embedded: { ActiveEffect: {}, Item: {} } + } + if (this.armed && ('armed_template' in this.summonableActors)) { + const armedTemplate = this.summonableActors.armed_template + for (const item of armedTemplate.items) { + const itemDoc = await armedTemplate.getEmbeddedDocument('Item', item.id) + this.spawnMutation.embedded.Item[item.name] = itemDoc + } + } + if (this.armor) { + const effectDoc = shim.createEffectDocument( + 'icons/equipment/chest/breastplate-layered-leather-stitched.webp', + 'Rotting Armor', + 0) + delete effectDoc.duration + delete effectDoc.flags.swade.expiration + effectDoc.changes = [{ + key: 'system.stats.toughness.armor', + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: '+2', + priority: 0 + }] + this.spawnMutation.embedded.ActiveEffect[effectDoc.name] = effectDoc + } + for (const effectDocument of this.effectDocs) { + this.spawnMutation.embedded.ActiveEffect[effectDocument.name] = effectDocument + } + } + + async prepAdditional () { + if (!this.increasedTrait) { + return + } + const traitMenuOptions = { + title: `${this.name} Raise Trait Increase`, + defaultButton: 'Cancel', + options: {} + } + const skillSet = new Set() + for (const skill of this.actor.items.filter(i => i.type === 'skill')) { + skillSet.add(skill.name) + } + for (const item of Object.values(this.spawnMutation.embedded.Item).filter(i => i.type === 'skill')) { + skillSet.add(item.name) + } + const skillList = Array.from(skillSet) + const attrList = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'] + skillList.sort() + const traitMenuData = { + inputs: [ + { type: 'header', label: 'Raise! Increase an attribute' } + ], + buttons: [ + { label: 'Apply', value: 'apply' }, + { label: 'Increase no traits', value: 'cancel' } + ] + } + traitMenuData.inputs = traitMenuData.inputs.concat( + attrList.map((x) => { return { type: 'radio', label: x, options: ['trait', false] } })) + traitMenuData.inputs.push({ type: 'header', label: 'Increase Skills (+1 each)' }) + traitMenuData.inputs = traitMenuData.inputs.concat( + skillList.map((x) => { return { type: 'radio', label: x, options: ['trait', false] } })) + const { buttons, inputs } = await shim.warpgateMenu(traitMenuData, traitMenuOptions) + if (!buttons || buttons === 'cancel') { + return + } + const modKeys = [] + for (let i = 0; i < attrList.length; i++) { + if (inputs[i + 1]) { + modKeys.push(`system.attributes.${attrList[i].toLowerCase()}.die.sides`) + } + } + for (let i = 0; i < skillList.length; i++) { + if (inputs[i + 7]) { + modKeys.push(`@Skill{${skillList[i]}}[system.die.sides]`) + } + } + const effectDoc = shim.createEffectDocument( + this.ICON, 'Increased Trait', this.durationRounds) + effectDoc.changes = modKeys.map(key => { + return { + key, mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: '+2', priority: 0 + } + }) + this.spawnMutation.embedded.ActiveEffect[effectDoc.name] = effectDoc + } +} + const PowerClasses = { 'arcane protection': ArcaneProtectionEffect, 'arcane-protection': ArcaneProtectionEffect, @@ -1415,7 +1580,7 @@ const PowerClasses = { 'summon-planar-ally': SummonPlanarAllyEffect, 'summon undead': SummonUndeadEffect, 'summon-undead': SummonUndeadEffect, - zombie: SummonUndeadEffect + zombie: ZombieEffect } export async function powerEffects (options = {}) { diff --git a/scripts/rollHelpers.js b/scripts/rollHelpers.js new file mode 100644 index 0000000..8bbf41c --- /dev/null +++ b/scripts/rollHelpers.js @@ -0,0 +1,161 @@ +import { log, shim } from './shim.js' + +export async function preTraitRollModifiers (actor, trait, roll, modifiers, options) { + const targets = Array.from(shim.targets) + const token = shim.canvas.tokens.controlled.length > 0 ? shim.canvas.tokens.controlled[0] : null + // log('ACTOR', actor) + // log('TOKEN', token) + // log('TRAIT', trait) + // log('ROLL', roll) + // log('MODIFIERS', modifiers) + // log('OPTIONS', options) + // log('TARGET', targets) + if (targets.some(target => target.actor.system.status.isVulnerable)) { + modifiers.push({ label: 'Target is Vulnerable', value: '+2', ignore: false }) + } + if (targets.some( + target => target.actor.effects.filter( + e => !e.disabled && e.name.toLowerCase().includes('deflection')).length > 0) + ) { + modifiers.push({ label: 'Target has Deflection', value: '-2', ignore: false }) + } + if (targets.length === 1 && token) { + const target = targets[0] + _addArcaneModifiers(target, modifiers) + const scaleMod = calcScaleMod(token, target) + if (scaleMod !== 0) { + modifiers.push({ label: 'Scale', value: scaleMod, ignore: false }) + } + if (trait?.type === 'skill' && trait?.system?.swid === 'fighting') { + const gangUpBonus = calcGangup(token, target) + if (gangUpBonus > 0) { + modifiers.push({ label: 'Gang Up', value: gangUpBonus, ignore: false }) + } + } + } +} + +export async function preDamageRollModifiers (actor, item, roll, modifiers, options) { + const targets = Array.from(shim.targets) + const token = shim.canvas.tokens.controlled.length > 0 ? shim.canvas.tokens.controlled[0] : null + // log('ACTOR', actor) + // log('TOKEN', token) + // log('ITEM', item) + // log('ROLL', roll) + // log('MODIFIERS', modifiers) + // log('OPTIONS', options) + // log('TARGET', targets) + if (targets.length === 1 && token) { + const target = targets[0] + _addArcaneModifiers(target, modifiers) + const weaknesses = target.actor.items.filter( + i => i.type === 'ability' && i.system.swid.toLowerCase().includes('weakness')) + if (weaknesses.length > 0) { + modifiers.push(...weaknesses.map(i => { return { label: i.name, value: '+4', ignore: true } })) + } + const resistances = target.actor.items.filter( + i => i.type === 'ability' && i.system.swid.toLowerCase().includes('resistance')) + if (resistances.length > 0) { + modifiers.push(...resistances.map(i => { return { label: i.name, value: '-4', ignore: true } })) + } + if (_findItem(token.actor, 'ability', 'pack-tactics')) { + const gangupBonus = calcGangup(token, target) + if (gangupBonus > 0) { + modifiers.push({ label: 'Gang Up (Pack Tactics)', value: gangupBonus, ignore: false }) + } + } + } +} + +function _addArcaneModifiers (target, modifiers) { + if (_findItem(target.actor, 'edge', 'improved-arcane-resistance')) { + modifiers.push({ label: 'Arcane Resistance', value: '-4', ignore: true }) + } else if (_findItem(target.actor, 'edge', 'arcane-resistance')) { + modifiers.push({ label: 'Arcane Resistance', value: '-2', ignore: true }) + } + const effect = target.actor.effects.find( + e => !e.disabled && e.name.toLowerCase().includes('arcane protection')) + if (effect) { + const effectName = effect.name.toLowerCase() + const effectMod = ( + -2 + + (effectName.includes('major') ? -2 : 0) + + (effectName.includes('greater') ? -2 : 0) + ) + modifiers.push({ label: 'Target Arcane Protection', value: effectMod, ignore: true }) + } +} + +function withinRange (origin, target, range) { + const ray = new Ray(origin, target) + const distance = shim.canvas.grid.measureDistances([{ ray }], { gridSpaces: true })[0] + const originScale = origin.actor.system.stats.scale + const targetScale = target.actor.system.stats.scale + range += (originScale > 0 ? originScale / 2 : 0) + (targetScale > 0 ? targetScale / 2 : 0) + return range >= distance +} + +function _findItem (actor, type, swid) { + return actor.items.find(i => i.type === type && i.system.swid === swid) +} + +function calcScaleMod (attacker, target) { + const attackerScale = attacker.actor.system.stats.scale + const targetScale = target.actor.system.stats.scale + const attackerHasSwat = !!_findItem(attacker.actor, 'ability', 'swat') + let modifier = targetScale - attackerScale + if (attackerHasSwat && modifier < 0) { + modifier = Math.min(modifier + 4, 0) + } + return modifier +} + +function calcGangup (attacker, target, debug) { + debug = (typeof debug === 'undefined') ? false : debug + const range = 1.2 + let modifier = 0 + if (_findItem(target.actor, 'edge', 'improved-block')) { + modifier = -2 + } else if (_findItem(target.actor, 'edge', 'block')) { + modifier = -1 + } + const attackerHasFormationFighter = !!(_findItem(attacker.actor, 'edge', 'formation-fighter')) + + const withinRangeOfToken = shim.canvas.tokens.placeables.filter(t => + t.id !== attacker.id && + t.id !== target.id && + t.actor.system.status.isStunned === false && + t.visible && + withinRange(target, t, range) + ) + const attackerAllies = withinRangeOfToken.filter( + t => t.document.disposition === attacker.document.disposition) + const targetAllies = withinRangeOfToken.filter( + t => t.document.disposition === target.document.disposition && + withinRange(attacker, t, range) + ) + const attackersWithFormationFighter = attackerAllies.filter( + t => !!_findItem(t.actor, 'edge', 'formation-fighter')) + const attackerCount = attackerAllies.length + const attackerFormationBonus = ( + (attackerCount > 0 && attackerHasFormationFighter ? 1 : 0) + + attackersWithFormationFighter.length + ) + const defenderCount = targetAllies.length + const gangUp = Math.max( + 0, + Math.min( + 4, + attackerCount + attackerFormationBonus - defenderCount + modifier)) + if (debug) { + log('GANG UP | Attacker:', attacker) + log('GANG UP | Target:', target) + log('GANG UP | Others within range:', withinRangeOfToken) + log('GANG UP | Attacker Allies:', attackerCount) + log('GANG UP | Attacker Formation Bonus:', attackerFormationBonus) + log('GANG UP | Effective Defender Allies:', defenderCount) + log('GANG UP | Target Block Modifier:', modifier) + log('GANG UP | Total Bonus:', gangUp) + } + return gangUp +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..aef2223 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "types": [ + "@league-of-foundry-developers/foundry-vtt-types" + ], + "moduleResolution": "node", + "strictNullChecks": true + } +}
ActorCurrency
${actor.name}${fmt.format(total)}